• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dyskretny problem wielo-plecakowy i tak zwana sztuczna inteligencja [multi knapsack problem], algorytm genetyczny

Object Storage Arubacloud
+1 głos
1,233 wizyt
pytanie zadane 19 listopada 2019 w Nasze poradniki przez mmarszik Mądrala (7,390 p.)
edycja 19 listopada 2019 przez mmarszik

Jakiś czas temu padło pytanie o rozwiązywanie problemu plecakowego przy użyciu algorytmu genetycznego. Zaciekawiłem się tym zadaniem, przeprowadziłem kilka eksperymentów, postanowiłem to pokrótce opisać i podzielić się wniosami:

Jak wiadomo, problem plecakowy stanowi problem NP-trudny, choć istnieją dobre i proste heurystyki:

https://pl.wikipedia.org/wiki/Problem_plecakowy
https://en.wikipedia.org/wiki/Knapsack_problem

   W pobieżnych eksperymentach algorytm genetyczny, ku mojemu szczeremu zaskoczeniu, nie wypadał najgorzej. Myślę, że siłą algorytmu genetycznego w tym zadaniu jest kodowanie pozycyjne - jeśli dany przedmiot korzystnie wpływa na przystosowanie jednego osobnika, to istnieje duże prawdopodobieństwo, że również korzystnie wpłynie na przystosowanie innego osobnika.

   Widząc pewne sukcesy algorytmu genetycznego, postanowiłem zrobić więcej eksperymentów. Po pierwsze utrudniłem zadanie, rozszerzyłem je do problemu pakowania wielu plecaków. Algorytm genetyczny uzbroiłem w dodatkowe heurystyki: dodałem diploidalność, nawroty do najlepszej kopii genów, sortowanie przedmiotów. Ponadto usunąłem kilka cech z klasycznego algorytmu genetycznego, które w moich eksperymentach zawsze stanowiły wadę. Te cechy to np. wymiana całej populacji pomiędzy pokoleniami, losowanie metodą ruletki, funkcja przeżywalności. W zasadzie z algorytmu genetycznego w mojej implementacji zostało niewiele, bo nawet krzyżowanie najlepiej się sprawuje gdy zachodzi bardzo rzadko, np. raz na kilkaset, albo nawet raz na milion mutacji. Po takich zmianach niektórzy by powiedzieli że moja implementacja jest przeciwieństwem algorytmu genetycznego, bo głównie mutuje i przywraca geny, zamiast krzyżować. Jednak ja wiele razy obserwowałem, że malutki dodatek krzyżowań, bardzo korzystnie wpływa na wyniki algorytmu, natomiast algorytm oparty głównie o krzyżowanie działa kiepsko, jest trudny w kontrolowaniu, traci moc obliczeniową na częste liczenie tej samej funkcji oceny i ma jeszcze więcej innych wad.

   Teraz o tym co najważniejsze, czyli jakie uzyskałem wyniki? Otóż po dobraniu parametrów, wzmocniony algorytm genetyczny znajduje optymalne rozwiązanie dla 10 plecaków i 116 przedmiotów w zaledwie 0.6s na jednym rdzeniu zwykłego taniego procesora. Z tych 116 przedmiotów 86 musi trafić do plecaków, pozostałe są dodatkiem mającym utrudnić zadanie. Wystarczyła pula 128 osobników i 8000 pokoleń aby uzyskać optymalne rozwiązanie. W rzeczywistości każdy osobnik ma kopię swoich genów (diploidalność), w pewnym sensie ilość osobników w całym programie jest równa dwa razy więcej, czyli 256.

   Jestem pod wrażeniem że (co prawda wzmocniony) algorytm genetyczny potrafi optymalnie rozmieścić 86 przykładowych przedmiotów w 10 plecakach.

Jakby ktoś chciał sam przeprowadzić eksperymenty, udostępniam kod źródłowy:
https://pastebin.com/g0nPdRtD

 

Tutaj przykładowe dane dla 10 plecaków:
https://pastebin.com/4XJfN6eM
Dane trzeba zapisać w pliku input.txt

 

Tutaj kompilacja i przykładowe uruchomienie:
https://pastebin.com/qM0mFfC5

c++ -std=c++11 -O3  main.cpp -o genetic
time cat input.txt | ./genetic

Pozdrawiam

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
0 odpowiedzi 2,551 wizyt
pytanie zadane 5 kwietnia 2019 w Python przez k.nowa103 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 371 wizyt
0 głosów
0 odpowiedzi 373 wizyt

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...