Programowanie liniowe-minimalizacja funkcji

0

Witam i proszę o radę. Mam przykładowo funkcję którą chcę zminimalizować:
3x1,1 +3x1,2 +5x1,1 +5x1,2 +5x1,3 +5x1,4
i do niej ograniczenia/warunki jakie musi spełniać:
x1,1+x1,2<=7
x2,1+x2,2x2,3+x2,4<=10
x1,2+x2,2+x2,3+2x2,4=4
x1,1+x2,1+x2,3=2
x1,1>=0, ... ,x2,4>=0

Jaki algorytm tu najlepiej zastosować, żeby to rozwiązać ? Simpleks, algorytm genetyczny ? Coś innego ? Bym potrzebował czegoś co na bank się sprawdzi i nie będę miał problemu z implementacją ;/ Jak ktoś ma jakieś rady, zna tutoriale jak coś takiego napisać w javie to będę wdzięczny za podzielenie się wiedzą.

1

A nie możesz użyć do tego constraint programmingu po prostu? Są do tego biblioteki i języki które to wspierają jak choćby http://mozart.github.io/mozart-v1/doc-1.4.0/fdt/node15.html#section.problem.money ;]
Do javy masz np. http://jacop.osolpro.com/

0

ciężko coś mi to idzie, zrobiłem tak:
reprezentuje rozwiązanie w postaci ciągu bitów
00101101...
x1,1=1, x1,2=1,x2,1=5, ... itd. (ilość bitów do danego x zależy od jego wartości max)

oceniam je tak: najlepsze to te co mieszczą się w tego rodzaju ograniczeniu:
x1,1+x1,2<=7
x2,1+x2,2+x2,3+x2,4<=10
spośród tych co się mieszczą najlepsze są te które są najbliżej
x1,2+x2,2+x2,3+2x2,4=4
x1,1+x2,1+x2,3=2
i na końcu te co są tak samo blisko są oceniane, tak, że te z najmniejszą wartością funkcji są najlepsze

Krzyżuje je po prostu po kolei 1 z 2 - 2 dzieci, później 3 z 4 - 2 dzieci itd.
dodatkowo robię jakiś tam % szansy że wylosowany gem osobnika zostanie zanegowany w ramach mutacji

Co robię źle ? muszę jakoś poprawić ocenę osobnika ? może selekcja powinna wyglądać inaczej ? a może po prostu nie osiągnę DOBREGO efektu algorytmem genetycznym ?
powiedzcie mi jak mogę zminimalizować taka funkcję, bo ciągle coś robię i na marne a czasu już niewiele ;<

1

Jeśli chodzi o krzyżowanie to robisz to źle, jeśli dobrze cię rozumiem.
Po pierwsze do wyboru rodziców stosuj http://en.wikipedia.org/wiki/Stochastic_universal_sampling bo zupełnie normalną i pożądaną sytuacją jest to kiedy jeden osobnik jest brany wielokrotnie do krzyżowania, jeśli jest wystarczająco dobry. Twój sposób powoduje dużo wolniejsze podążanie w kierunku ekstremum.
Poza tym nie robisz 2 dzieci z jednej pary rodziców bo znów zupełnie nie ma to sensu. W kroku gdzie wybierasz rodziców tworzysz tyle par (losowych) ile potrzebujesz potem dzieci. W ten sposób masz dużo większe pole poszukiwań do dobrych rozwiązań.

0

jeszcze pytanie odnośnie simpleksu, mam np. zadanie:
min z(x)=5x1+5x2+5x3+5x4
x1+x2+x3+x4<=5
x2+x3+2x4=5
x1+x3=2
x >=0
licząc to programem działającym tak jak się uczyłem na kartce dostaje tabelki kolejno:
user image
user image
user image
i dostaje optymalny wynik =17,5
**jakbym musiał to policzyć jakbym chciał mieć x należące do zbioru liczb całkowitych ? **

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