kostenloser Webspace werbefrei: lima-city


Suche auf lima-city

  • in: Travelling salesman Problem mit dynamischer Programmierung

    geschrieben von forall

    Leider gibt es im Internet wirklich viel zu wenig (exakte) Lösungen zu diesem Problem!
    Ich habe es darum nun selbst implementiert und das Ganze sieht dann wie folgtaus:

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    int** C; // Optimums-Matrix
    int** d; // Distanzen zwischen den Städten
    int iN;  // Anzahl Städte
    
    int NumberOfSetBits(int i); // Zählt die gesetzten Bits in einem Integer
    
    int main()
    {
       /** Anzahl Städte einlesen **/
       scanf("%i",&iN);
    
       /** Initialisieren **/
       C = new int*[iN+1];         // n Zahlen ohne 0 -> iN+1
       for(int i=1; i <= iN; i++)  // Bis und mit iN ohne 0
          C[i] = new int[(1<<iN)]; // 2^iN ohne 0, jedoch ist 2^iN bereits der komplette Weg (7 = 111 oder 15 = 1111); 1<<x = 2^x
    
       d = new int*[iN+1];        // n Zahlen ohne 0
       for(int i=1; i <= iN; i++) // Bis und mit iN ohne 0
          d[i] = new int[iN+1];   // n Zahlen ohne 0
    
       /** Eingabe **/
       for(int i=1; i <= iN; i++)    // Bis und mit iN ohne 0
          for(int j=1; j <= iN; j++) // Bis und mit iN ohne 0
          {
             scanf("%i", &d[i][j]);   // Distanzen einlesen
          }
    
       /*********************************************
        *                Algorithmus                *
        *********************************************/
    
       /** Initialisiere alle mit Mächtigkeitszahl 2 in C **/
       for(int k=2; k <= iN; k++) // Ohne 0 & 1 für k, bis und mit iN
       {
          for(int c=2; c <= iN; c++)
             C[c][1+(1<<(k-1))] = d[1][k]; // Stadt 1 + Stadt k
       }
    
       /** Berechne die überigen Mächtigkeitszahlen in C **/
       for(int s=3; s <= iN; s++)                 // Mächtigkeitszahl erhöhen, ohne 0,1,2
       {
          for(int S=(1<<(s-2)); S < (1<<iN); S++) // Beginne bei 2^(s-2), ende bei 2^iN
             if(NumberOfSetBits(S) == s)          // Menge mit der Mächtigkeitszahl s
                for(int k=2; k <= iN; k++)        // Alle Städte durchgehen
                   if((S&(1<<(k-1))) > 0)         // Wenn Stadt k in Menge S vorkommt... && S >= (1<<(k-1))
                   {
                      C[k][S]=9999999;
                      for(int m=2; m <= iN; m++)  // Zweite Verbindungsstadt finden
                      {
                         if(m == k || (S&(1<<(m-1))) == 0) // m darf nicht gleich k sein & m muss in der Menge S vorhanden sein
                            continue;
                          C[k][S] = min(C[m][S-(1<<(k-1))]+d[m][k], C[k][S]); // Was ist kleiner der "neue" Wert oder der Ursprungswert?
                          break;
                      }
                   }
       }
    
       /** Optimum berechnen **/
       int opt = 9999999;
       for(int k=2; k <= iN; k++)
       {
          opt = min(C[k][(1<<(iN))-1]+d[1][k], opt);
       }
    
       printf("%i\n",opt);
    
       // Pausieren
       //system("pause");
    
       /** // Auskommentieren um die Optimums-Matrix auszugeben
       for(int i=1; i <= iN; i++)
       {
          for(int j=1; j < (1<<iN); j++)
          {
             printf("%i ",(C[i][j]<0?0:C[i][j]));
          }
          printf("\n\n");
       }**/
    
       return 0;
    }
    
    /** Bit-Zähler nach dem 'parallel'-Algorithmus (oder 'variable-precision SWAR'-Algorithmus) **/
    int NumberOfSetBits(int i)
    {
        i = i - ((i >> 1) & 0x55555555);
        i = (i & 0x33333333) + ((i >> 2) & 0x33333333);
        return ((i + (i >> 4) & 0xF0F0F0F) * 0x1010101) >> 24;
    }


    Mag wohl an der einen oder anderen Stelle nicht perfekt sein, funktioniert jedoch! :-)

    Hier noch ein paar Beispiele:
    3
    0 12 65
    12 0 5
    65 5 0
    
    4
    0 12 15 5
    12 0 6 3
    15 6 0 18
    5 3 18 0
    
    5
    0 13 34 23 3
    13 0 11 14 6
    34 11 0 2 18
    23 14 2 0 5
    3 6 18 5 0
    
    20
    0 377 223 636 190 758 307 398 963 94 706 425 614 178 55 772 199 358 500 317
    377 0 344 889 667 752 42 691 200 116 202 74 43 44 275 35 391 302 4 273
    223 344 0 941 942 39 737 188 618 575 816 276 323 416 846 312 932 615 754 454
    636 889 941 0 938 422 948 679 961 552 162 77 420 936 643 486 54 790 916 221
    190 667 942 938 0 383 972 941 181 547 459 875 430 352 576 643 321 763 218 465
    758 752 39 422 383 0 131 57 736 811 231 812 220 155 763 895 717 933 720 45
    307 42 737 948 972 131 0 764 151 883 689 338 810 224 124 147 660 395 507 155
    398 691 188 679 941 57 764 0 889 392 85 540 49 764 859 453 891 827 253 695
    963 200 618 961 181 736 151 889 0 743 632 833 650 561 532 788 587 469 363 102
    94 116 575 552 547 811 883 392 743 0 347 471 25 938 596 306 921 384 612 522
    706 202 816 162 459 231 689 85 632 347 0 671 971 671 456 876 189 299 154 489
    425 74 276 77 875 812 338 540 833 471 671 0 128 77 57 503 44 497 876 442
    614 43 323 420 430 220 810 49 650 25 971 128 0 774 706 86 222 549 725 405
    178 44 416 936 352 155 224 764 561 938 671 77 774 0 317 893 683 704 830 524
    55 275 846 643 576 763 124 859 532 596 456 57 706 317 0 676 490 875 998 31
    772 35 312 486 643 895 147 453 788 306 876 503 86 893 676 0 676 222 238 696
    199 391 932 54 321 717 660 891 587 921 189 44 222 683 490 676 0 306 397 720
    358 302 615 790 763 933 395 827 469 384 299 497 549 704 875 222 306 0 264 267
    500 4 754 916 218 720 507 253 363 612 154 876 725 830 998 238 397 264 0 848
    317 273 454 221 465 45 155 695 102 522 489 442 405 524 31 696 720 267 848 0


    Oder einen eigenen Generator:
    #include <iostream>
    #include <cmath>
    #include <time.h>
    
    using namespace std;
    
    int main()
    {
       int ** test;
       int i;
       cin >> i;
    
       test = new int*[i];
       for(int k=0; k<i;k++)
          test[k] = new int[i];
    
       srand(time(NULL));
       for(int z=0; z < i; z++)
       {
          for(int x=0; x < i; x++)
          {
             if(z == x)
                test[z][x] = 0;
             else
             {
                test[z][x] = rand() % 1000;
                test[x][z] = test[z][x];
             }
          }
       }
    
       for(int z=0; z<i;z++)
       {
          for(int x=0; x<i; x++)
             cout << test[z][x] << " ";
          cout << endl;
       }
    
       system("pause");
       return 0;
    }


    Doch aufgepasst, wie bei vielen DP Lösungen wird viel Speicher benötigt, z.B. braucht es für 30 Städte bereits ~4GB an RAM! :-S

    Viel Spass damit!
  • in: Der längste Thread aller Welten

    geschrieben von forall

    @jpaket: Klar ist es im Spammforum, aber mach bitte n?chsts mal gleich einen Abstand!

    :spammer::spammer::spammer::spammer:
  • in: Mambo Server

    geschrieben von forall

    Hi hat sich gekl?rt, ich durfte http:// nicht vor mysql.lima-city.de stellen (warum auch immer...)!

    Geht jetzt eigentlich die Mail funktion?

    mfg Lukas
  • in: Mambo Server

    geschrieben von forall

    Jo das hab ich auch gemerkt, und mit FTP ging es etwa 3-4 Stunden... (Hat sich immer wieder neu ein loggen m?ssen und hatte dauert ein Timeout...)
    Nun gut am schluss hab ich es geschafft...
    Aber was ist jetzt mit der Installation?
    Ich gebe meine Daten f?r die Datenbanke ein:
    --------------------------------
    Host: http://mysql.lima-city.de/
    User: USER22073
    Passwort: *************
    Datenbank: DB1141676757
    MySQL Table Prefix: mos_
    _
    | | Drop Existing Tables
    _
    | | Backup Old Tables
    _
    |x| Install Sample Data
    --------------------------------
    Die Datenbank ist leer, die angaben stimmen, aber ersagt dann: The password and usernam provider are incorect.

    woran liegt das?

    mfg Lukas
  • in: nt-user anmelden

    geschrieben von forall

    ICh verstehe auch nicht ganz, meinst du einfach ein User mit dem Betriebsystem NT, oder was? :confused:
    Ich weiss dann nicht so recht ob das geht, ich mein sonst k?nnte ja jedes Programm weiss nicht wieviele user erstellen...

    mfg Lukas

Login zum Webhosting ohne Werbung!