Fervi_ Opublikowano 14 Maja 2014 Udostępnij Opublikowano 14 Maja 2014 Witajcie! Mam pewien problem przy programowaniu problemu plecakowego algorytmem genetycznym Prawdopodobnie najważniejszy kod obj_0 Create GML //test = dec2bin(30); // 6 przedmiotów maxgen=6 przedmiot1_obj=4 przedmiot1_war=7 przedmiot2_obj=3 przedmiot2_war=2 przedmiot3_obj=10 przedmiot3_war=1 przedmiot4_obj=7 przedmiot4_war=12 przedmiot5_obj=6 przedmiot5_war=8 przedmiot6_obj=2 przedmiot6_war=10 max_obj=15 pk=0.75 pm=0 generowaniegenow(); obliczaniegenow(); while (max_obj<global.objall) { generowaniegenow(); global.objall=obliczaniegenow(); } Generowaniegenow GML wygenerowana=random(power(2,maxgen)); test1=dec2bin2(wygenerowana); Obliczaniegenow GML if(test[0]=1) { global.objall=global.objall+przedmiot1_obj warall=warall+przedmiot1_war } if(test[1]=1) { global.objall=global.objall+przedmiot2_obj warall=warall+przedmiot2_war } if(test[2]=1) { global.objall=global.objall+przedmiot3_obj warall=warall+przedmiot3_war } if(test[3]=1) { global.objall=global.objall+przedmiot4_obj warall=warall+przedmiot4_war } if(test[4]=1) { global.objall=global.objall+przedmiot5_obj warall=warall+przedmiot5_war } if(test[5]=1) { global.objall=global.objall+przedmiot6_obj warall=warall+przedmiot6_war } return(global.objall); Problem jest taki, że pętla while prawdopodobnie zacina (jak warunek jest niespełniony) cały program, a według mnie zgodnie z pętlą - powinien wygenerować sobie "kolejny" zestaw liczb i spełnić warunek Dziękuję za pomoc Fervi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 14 Maja 2014 Udostępnij Opublikowano 14 Maja 2014 Gdzie jest wroja tablica test[] i czemu nie robisz przedmiot_obj[1]=4? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Fervi_ Opublikowano 14 Maja 2014 Autor Udostępnij Opublikowano 14 Maja 2014 Deklaracji tablicy nie mam (myślałem, że niepotrzebne to jest), a potrzebne? :P Mogę użyć tablicy do przechowywania przedmiotów i ich wartości (w zasadzie dziś się nauczyłem korzystać z tablic w GM [tak samo jak w C++, ale nigdy potrzeby tworzenia tablic nie widziałem :D]) Fervi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Threef Opublikowano 14 Maja 2014 Udostępnij Opublikowano 14 Maja 2014 Nie musisz jej deklarować, ale problem jest w tym że pętla zależy od global.objall a to jest modyfikowane gdy if(test[x]=1). Ja nie widzę nigdzie u ciebie tej tablicy, więc warunek się nie spełnia, więc global.objall pozostaje ten samo, więc pętla jest nieskończona. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Fervi_ Opublikowano 14 Maja 2014 Autor Udostępnij Opublikowano 14 Maja 2014 Fakt, tzn. powinienem wrzucić tutaj kod "dec2bin2" GML var _DECIMAL, _BINARY; // Initializes the decimal and binary variables _DECIMAL = argument0; _BINARY = ""; //Runs through the 8 binary positions for(n=maxgen-1; n>=0; n-=1) { //Inserts a 1 into the current binary position if(_DECIMAL >= power(2, n)) { _DECIMAL -= power(2, n); test[n] = 1; } else //Inserts a 0 into the current binary position test[n] = 0; } //Returns the binary value return nie_wiem_co_to_jest; Być może w tym jest błąd (jest to lekko przerobiony przykład konwertowania liczby na binarną) Fervi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Fervi_ Opublikowano 19 Maja 2014 Autor Udostępnij Opublikowano 19 Maja 2014 https://gmclan.org/up6184_12_genetyczny.html Wrzuciłem kod źródłowy, jakby ktoś chciał sprawdzić i poinformować czemu jest taki problem :P Fervi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
ereg Opublikowano 19 Maja 2014 Udostępnij Opublikowano 19 Maja 2014 niewiem jesli bedzie dzialac poprawnie kalkulacja, ale chyba najpierw trzeba v Obliczaniegenow skasowac global.objall=0 inaczej zawse bedzie while bez konca :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Amaterasu Opublikowano 20 Maja 2014 Udostępnij Opublikowano 20 Maja 2014 Gwoli ścisłości, to, co robisz, nie jest algorytmem genetycznym, a zwyczajnym algorytmem randomizowanym. W dodatku nie spełni on swojej roli - nawet po wyeliminowaniu błędów nie otrzymuję żadnych wyników, żadnych liczb. Nawet gdybym jakieś liczby dostał, nie znajduję w algorytmie żadnego sposobu na zapisanie dobrych wyników w celu porównania z kolejnymi. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Fervi_ Opublikowano 20 Maja 2014 Autor Udostępnij Opublikowano 20 Maja 2014 Gwoli ścisłości, to, co robisz, nie jest algorytmem genetycznym, a zwyczajnym algorytmem randomizowanym. W dodatku nie spełni on swojej roli - nawet po wyeliminowaniu błędów nie otrzymuję żadnych wyników, żadnych liczb. Nawet gdybym jakieś liczby dostał, nie znajduję w algorytmie żadnego sposobu na zapisanie dobrych wyników w celu porównania z kolejnymi. Wszystko zaczyna się od wylosowania zestawu genów, które przybierają 1 lub 0, gdzie 1 to przedmiot, a 0 to brak przedmiotu Tutaj oczywiście musi być warunek, że ilość zrandomowanych przedmiotów (ich objętość) musi być mniejsza niż maksymalna objętość Oczywiście to początek programu i jeszcze kawał drogi do końca, ale trzeba robić po kolei Fervi Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się