Skocz do zawartości

Problem Plecakowy


Rekomendowane odpowiedzi

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

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

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

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

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

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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...