Algorytm genetyczny - optymalizacja wykorzystania miejsca w magazynie

0

Cześć wszystkim!

Ostatnio zajmuję się małym zadankiem, o którym opowiem zaraz. Postanowiłem wykorzystać w jego rozwiązaniu algorytm genetyczny, jednak zabrnąłem w ślepą uliczkę, potrzebuję świeżego spojrzenia na sprawę i jakieś pomysły, które akurat mi nie przyszły do głowy, dlatego liczę na Waszą pomoc. Algorytm piszę w C#.

Zadanie: W magazie trzeba zarezerwować miejsce na bardzo wiele stosów paneli o różnych szerokościach (dokładnie 12). Magazyn podzielony jest na 8 pól różnej wielkości (nazwijmy to długości). Trzeba tak rozmieścić te panele o różnych szerokościach, aby maksymalnie wykorzystać miejsce. Ich ilość jest wyrażona procentowo, ale nie jest to liczba bardzo sztywna stąd możliwe są niewielkie mutacje i zmiany w ich procentowym udziale.

Początkowo przyjąłem sobie, że populacja to panele w ilości wystarczającej na rozlokowanie w całym magazynie. Każdy osobnik posiada 2 geny: przynależności do danego pola w magazynie oraz szerokość panela. Dopasowanie musi być rozpatrywane dla każdego pola z osobna a także dla magazynu jako całości. Początkowo tworzyłem wiele takich populacji i krzyżowałem losowe osobniki miedzy sobą, co pozwalało na spełnienie kryterium dla maksymalnie 4 pól. Później stwierdziłem, że można osobniki dla każdego pola potraktować jako odrębną populację i krzyżować je pomiędzy sobą w stopniu zależnym od dopasowania oraz np gdy wynika ze w jednym polu paneli jest za dużo to przenosiłem je tam, gdzie ich brakowało. Rezultaty mojej pracy są jednak jak do tej pory marne. Ten sposób doprowadził mnie do dopasowania paneli do max. 3 pól na raz.

Tak więc przyjąć za populację osobniki dla całego magazynu czy dla poszczególnych pól? Jak krzyżować? Z chęcią przeczytam i rozważę każdą sugestię. A może jest jakiś inny algorytm, który sprawdziłby się lepiej w tego typu zadaniu...

Pozdrawiam

0

Nie rozumiem tego:

Ich ilość jest wyrażona procentowo, ale nie jest to liczba bardzo sztywna stąd możliwe są niewielkie mutacje i zmiany w ich procentowym udziale.

Bo jeśli dobrze rozumiem to idea jest taka że chcesz tymi panelami obstawić jak największe pole we wszystkich przedziałach magazynu i jednocześnie chcesz wykorzystać wszystkie możliwe szerokości paneli. Czy tak?

0

Dokładnie tak jak piszesz. Chodziło mi to, że chce, żeby np było około 30% paneli o szerokosci 555 mm itd. Ale może być równie dobrze 31% albo 25% stad napisałem, że możliwe są losowe mutacje genu odpowiadającego za szerokość, co też prowadzi do lepszego dopasowania. Problem tkwi głównie w krzyżowaniu osobników. Im więcej mutacji tym program lepiej dopasowuje sobie te panele do pól, ale wtedy może wyjść ze szerokość której miało być 10% jest 30% a to już za wielkie odchylenie. Mutacje muszą być minimalne. Procentowy udział poszczególnych szerokości jest ważnym aspektem tego zadania.

0

Przed chwilą czytałem inny temat i w sumie zastanawia mnie czy nie daloby się tego twojego problemu przedstawić w postaci ograniczeń i wykorzystać http://en.wikipedia.org/wiki/Constraint_programming ;)

0

Dzięki! Pomysł wart rozważenia. Nigdy wcześniej nie słyszałem o tym, ale jest przykład zaimplementowania w C# http://msdn.microsoft.com/en-us/library/ff826354%28v=vs.93%29.aspx . Ciekawe jak bedzie w praktyce.

Może ktoś jeszcze ma jakiś pomysł?

1 użytkowników online, w tym zalogowanych: 0, gości: 1