Odp: Problem NP na przykladzie komiwojazera



Widzisz wersję archiwalną tematu "Odp: Problem NP na przykladzie komiwojazera" z forum pl.comp.programming





Krzysztof Czuryło - 25 Lip 1999, 03:00


| Hej,
|
|   Pierwsze pytanko -- czy komiwojazer leci tak:
|
| N miast, wejsciowe miasto A, wyjsciowe B. Przejechac _najkrotsza_
| droga z A do B odwiedzajac kazde inne miasto raz i tylko raz.

No, chyba tak.

|   Drugie pytanie -- jak na razie nie istnieje algorytm znajdujacy
| najkrotsza droge w jakims normalnym czasie.
                            ^^^^^^^^^
Chyba nie do konca tak.
Teoretycznie nalezy rozwazyc wszystkie mozliwe permutacje, a ich ilosc
rosnie baaaardzo szybko rwaz ze wzrostem liczby miast i dlatego dla
np. 100 miast nie ma to sensu.

| Powiedzmy ze mialbym 100
| miast. Jaki wynik musialbym wykrecic /znajdujac _najkrotsza_ droge/
i
| to wynik czasowo powtarzalny, aby stwierdzic, ze rozwalilem problem?

Sa inne sposoby. Np. losujesz na poczatek jakas przypadkowa kolejnosc
miast i liczysz dlugosc drogi. Potem losujesz dwa (cztery) miasta i
poddajesz operacji inwersji, wymiany lub translacji.

np.

1-2-3-4-5-6-7-8-9-10-11-12
          +-----+
inwersja (jeden odcinek odwracamy)

1-2-3-4-5-9-8-7-6-10-11-12
        +-+ +-+
translacja (dwa odcinki zamieniamy miejscami)

1-2-3-4-8-7-5-9-6-10-11-12
    +                +
wymiana (dwa miasta zamieniamy miejscami)

1-2-11-4-8-7-5-9-6-10-3-12

Operacja tez jest oczywiscie losowana w kazdym kroku (tzn. najpierw
losujesz operacje, a potem dwa lub wiecej miast).

Po kazdym kroku sprawdzasz, czy jest lepiej. Jesli nie, to cofasz
zmiane. Jesli jest poprawa, to OK.
Jezeli np. przez 100 kroków nie uzyskasz zadnej poprawy, to mozna
skonczyc.

Calosc mozna powtórzyc n razy, dla róznych ukladów poczatkowych, aby
zwiekszyc szanse dotarcia do najlepszego wyniku (lub prawie
najlepszego).

Taki algorytm jest calkiem szybki i daje zadowalajace rezultaty.



Milo - 25 Lip 1999, 03:00

Sa inne sposoby. Np. losujesz na poczatek jakas przypadkowa kolejnosc
miast i liczysz dlugosc drogi. Potem losujesz dwa (cztery) miasta i
poddajesz operacji inwersji, wymiany lub translacji.

np.

1-2-3-4-5-6-7-8-9-10-11-12
          +-----+
inwersja (jeden odcinek odwracamy)

1-2-3-4-5-9-8-7-6-10-11-12
        +-+ +-+
translacja (dwa odcinki zamieniamy miejscami)

1-2-3-4-8-7-5-9-6-10-11-12
    +                +
wymiana (dwa miasta zamieniamy miejscami)

1-2-11-4-8-7-5-9-6-10-3-12

Operacja tez jest oczywiscie losowana w kazdym kroku (tzn. najpierw
losujesz operacje, a potem dwa lub wiecej miast).

Po kazdym kroku sprawdzasz, czy jest lepiej. Jesli nie, to cofasz
zmiane. Jesli jest poprawa, to OK.
Jezeli np. przez 100 kroków nie uzyskasz zadnej poprawy, to mozna
skonczyc.

Calosc mozna powtórzyc n razy, dla róznych ukladów poczatkowych, aby
zwiekszyc szanse dotarcia do najlepszego wyniku (lub prawie
najlepszego).

Taki algorytm jest calkiem szybki i daje zadowalajace rezultaty.



O ile dobrze widze to jest to algorytm zachlanny i (chyba) w dodatku
niestabilny. Nie mozesz zalozyc, ze jesli przez 100 krokow nie uzyskasz
poprawy, to nigdy juz jej nie uzyskasz, np. za 101 krokiem. Dziala to
wprawdzie dla pewnych przypadkow, ale nie mozna tego uznac za poprawny
algorytm. A rezultaty sa zwykle dobre albo zle. "zadowalajace" rezultaty
czasami moga prowadzic do katastrofy, np. jakby program do obliczania
trajektori pocisku kontunentalnego jako "zadowalajacy" wynik trafienia w
Moskwe(zalozsmy ze jest zimna wojna i USA rywalizyje z ZSRR, a Polska jest po
stronie czerwonych; nie bierzcie tego przykladu na serio) podal namiary
Warszawy, to wynik bylby "zadowalajacy" dla USA, bo w koncu to tez panstwo
Ukladu Warszawskiego, ale nie bardzo dla mieszkancow Warszawy........Troche
moze drastyczny ten przyklad, ale nic innego przez 1 min. nie moglem
wymyslec;))).


Krzysztof Czuryło - 25 Lip 1999, 03:00


| Sa inne sposoby. Np. losujesz na poczatek jakas przypadkowa
kolejnosc
| miast i liczysz dlugosc drogi. Potem losujesz dwa (cztery) miasta
i
| poddajesz operacji inwersji, wymiany lub translacji.
(...)
| Taki algorytm jest calkiem szybki i daje zadowalajace rezultaty.

| O ile dobrze widze to jest to algorytm zachlanny i (chyba) w dodatku
| niestabilny. Nie mozesz zalozyc, ze jesli przez 100 krokow nie
uzyskasz
| poprawy, to nigdy juz jej nie uzyskasz, np. za 101 krokiem. Dziala
to
| wprawdzie dla pewnych przypadkow, ale nie mozna tego uznac za
poprawny
| algorytm. A rezultaty sa zwykle dobre albo zle. "zadowalajace"
rezultaty
| czasami moga prowadzic do katastrofy, np. jakby program do
obliczania
| trajektori pocisku kontunentalnego jako "zadowalajacy" wynik
trafienia w
| Moskwe(zalozsmy ze jest zimna wojna i USA rywalizyje z ZSRR, a
Polska jest po
| stronie czerwonych; nie bierzcie tego przykladu na serio) podal
namiary
| Warszawy, to wynik bylby "zadowalajacy" dla USA, bo w koncu to tez
panstwo
| Ukladu Warszawskiego, ale nie bardzo dla mieszkancow
Warszawy........Troche
| moze drastyczny ten przyklad, ale nic innego przez 1 min. nie moglem
| wymyslec;))).

Racja, racja. Jeśli wolisz, to licz sobie długość drogi dla wszystkich
permutacji.
Po drugie, możesz zwiększyć margines "bezpieczeństwa" i ustalić, że
dopiero po 10000 kroków bez poprawy przerywasz.
Algorytm zaiste nie daje 100% gwarancji osiągnięcia minimum, ale na
pewno jest to lepsze niż szacowanie "na oko" lub liczenie wszystkich
wariantów. Myslę, że mozna podać wiele przykładów, gdzie
"zadowalajacy" rezultat jest rzeczywiście zadowalający. Ot, choćby
prawdziwy komiwojażer. Jak to mówią: lepszy rydz niż nic.


Marcin 'Qrczak' Kowalczyk - 25 Lip 1999, 03:00


A rezultaty sa zwykle dobre albo zle. "zadowalajace" rezultaty
czasami moga prowadzic do katastrofy,



Czasem lepiej podać zadowalający wynik w 10 minut niż czekać na
dokładny przez kilka miesięcy :-)



zVision - 26 Lip 1999, 03:00


Czasem lepiej podać zadowalający wynik w 10 minut niż czekać na
dokładny przez kilka miesięcy :-)



albo i kilkadziesiat lat ;-). jak ktos nie wierzy, proponuje
przeprowadzic
sobie maly eksperyment. obliczanie wyrazow ciagu Fibonacciego met.
rekurencyjna, algorytm ten ma podobna zlozonosc (wykladnicza)...
dla przykladu proponuje wziac sobie, zeby daleko nie siegac, 60 wyraz...

pozdrawiam!


Marcin 'Qrczak' Kowalczyk - 26 Lip 1999, 03:00


obliczanie wyrazow ciagu Fibonacciego met. rekurencyjna, algorytm
ten ma podobna zlozonosc (wykladnicza)...



Jeśli we wzorze F(n) = F(n-2)+F(n-1) wywołuje funkcję dwa razy, to
owszem (i ten sam wyraz jest obliczany wiele razy), ale wystarczy liczyć
na parze sąsiednich wyrazów: (F(n-1), F(n)) |-(F(n), F(n-1)+F(n))
(złożoność liniowa).


zVision - 26 Lip 1999, 03:00


Jeśli we wzorze F(n) = F(n-2)+F(n-1) wywołuje funkcję dwa razy, to
owszem (i ten sam wyraz jest obliczany wiele razy), ale wystarczy
liczyć
na parze sąsiednich wyrazów: (F(n-1), F(n)) |-(F(n), F(n-1)+F(n))
(złożoność liniowa).



:-) nie chodzilo mi o to, jak najlepiej policzyc ciag Fibonacciego, bo
to juz
chyba w mrokach sredniowiecza ;) odkryto, ale o to, zeby uswiadomic tym,
co nie wierza, co to znaczy zlozonosc wykladnicza (w kontekscie
problemow
NPC)

p.s.: dowolny wyraz ciagu Fibonacciego to i mozna w paru instrukcjach
policzyc :)

pozdrawiam!


Maciej "MACiAS" Pilichowski - 27 Lip 1999, 03:00

Hej,

Sa inne sposoby. Np. losujesz na poczatek jakas przypadkowa kolejnosc



Krzysztofie, ja pisze o NAJKROTSZEJ drodze, a nie zadowalajaco
krotkiej.

milego dnia zycze
hej

WC_LISTVIEW i problem z ListView_GetItemRect
Ogromne problemy z Pocket PC 2003 Emulatorem i polaczeniem z kompem lokalnym
Extendery, tryb chroniony i karta graficzna - czyli DDDDUUUZZZYYY problem
iSearch - jak siĂŞ pozbyĂŚ
  • diablo 2 do pobrania pelna wersja
  • rysunek techniczny gwint
  • oB6wietlenie linkowe
  • 2222struktura;organizacyjna;zus2222
  • sluchawki nokia n gage dual headset czy stereo
  • poziom ast
  • emotikony imionami
  • opisy obrazow moneta
  • klub studencki park sgh
  • Katalog wypowiedzi z for internetowych ^^ Strona Główna