Prześlij pliki do ''

This commit is contained in:
Karol Piotrowski 2020-06-07 13:24:23 +00:00
parent a1976880c9
commit efdb69843d
2 changed files with 74 additions and 18 deletions

View File

@ -291,13 +291,10 @@ void genetic_algorithm(string * population, int populationSize, int parentsNumbe
string * nextGen = new string[populationSize]; string * nextGen = new string[populationSize];
crossover(parents,nextGen,parentsNumber,populationSize); crossover(parents,nextGen,parentsNumber,populationSize);
delete[] population;
population = new string[populationSize];
for(i=0;i<populationSize;i++) { for(i=0;i<populationSize;i++) {
population[i] = nextGen[i]; population[i] = nextGen[i];
} }
delete[] nextGen;
} }
ranking(population,outcome,populationSize,outcomeSize); ranking(population,outcome,populationSize,outcomeSize);
} }
@ -338,34 +335,34 @@ void przypiszKodGenetyczny(int i, int j, char plant) {
void obslugaAlgorytmuGenetycznego() { void obslugaAlgorytmuGenetycznego() {
cout << "Zebrane buraki: " << scoreBuraki << endl; cout << "Zebrane buraki: " << scoreBuraki << endl;
cout << "Zebrane ziemniaki: " << scoreZiemniaki << endl; cout << "Zebrane ziemniaki: " << scoreZiemniaki << endl;
if(scoreBuraki>=rozmiarPopulacji) { if(scoreBuraki>=rozmiarPopulacji) {
scoreBuraki = 0; scoreBuraki = 0;
delete[] burakiDoSadzenia;
string * burakiDoSadzenia = new string[20];
for(int i = 0;i<20;i++) { for(int i = 0;i<20;i++) {
burakiDoSadzenia[i] = "000000000"; burakiDoSadzenia[i] = "000000000";
} }
genetic_algorithm(zebraneBuraki, rozmiarPopulacji, rozmiarPopulacji - 5, burakiDoSadzenia, 20); genetic_algorithm(zebraneBuraki, rozmiarPopulacji, rozmiarPopulacji - 5, burakiDoSadzenia, 20);
gmoLeftBuraki = 20; gmoLeftBuraki = 20;
delete[] zebraneBuraki; for(int i = 0; i<rozmiarPopulacji;i++) {
string * zebraneBuraki = new string[rozmiarPopulacji]; zebraneBuraki[i] = "000000000";
}
for(int i=0;i<20;i++) { for(int i=0;i<20;i++) {
cout << burakiDoSadzenia[i] << endl; cout << burakiDoSadzenia[i] << endl;
} }
} }
if(scoreZiemniaki>=rozmiarPopulacji) { if(scoreZiemniaki>=rozmiarPopulacji) {
scoreZiemniaki = 0; scoreZiemniaki = 0;
delete[] ziemniakiDoSadzenia;
string * ziemniakiDoSadzenia = new string[20];
for(int i = 0;i<20;i++) { for(int i = 0;i<20;i++) {
ziemniakiDoSadzenia[i] = "000000000"; ziemniakiDoSadzenia[i] = "000000000";
} }
genetic_algorithm(zebraneZiemniaki, rozmiarPopulacji, rozmiarPopulacji - 5, ziemniakiDoSadzenia, 20); genetic_algorithm(zebraneZiemniaki, rozmiarPopulacji, rozmiarPopulacji - 5, ziemniakiDoSadzenia, 20);
gmoLeftZiemniaki = 20; gmoLeftZiemniaki = 20;
delete[] zebraneZiemniaki; for(int i = 0; i<rozmiarPopulacji;i++) {
string * zebraneZiemniaki = new string[rozmiarPopulacji]; zebraneBuraki[i] = "000000000";
}
for(int i=0;i<20;i++) { for(int i=0;i<20;i++) {
cout << ziemniakiDoSadzenia[i] << endl; cout << ziemniakiDoSadzenia[i] << endl;
} }
@ -385,6 +382,7 @@ void generujKody() {
} }
} }
} }
//--------------------------------------------------------------------- //---------------------------------------------------------------------
@ -521,8 +519,6 @@ void updatePola()
color("white", "black"); color("white", "black");
} }
obslugaAlgorytmuGenetycznego();
} }
void correctMovement(char wantedWay) void correctMovement(char wantedWay)
@ -666,6 +662,8 @@ void Move(char kierunek)
}break; }break;
} }
obslugaAlgorytmuGenetycznego();
} }
@ -926,6 +924,9 @@ void test1()
pole[1][3][1] = '9'; pole[1][3][1] = '9';
pole[3][1][0] = 'Z'; pole[3][1][0] = 'Z';
pole[3][1][1] = '9'; pole[3][1][1] = '9';
kod_genetyczny[1][3] = przypiszKod("buraki");
kod_genetyczny[3][1] = przypiszKod("ziemniaki");
} }
void test2() void test2()
{ {
@ -935,6 +936,8 @@ void test2()
{ {
pole[i][j][0] = 'B'; pole[i][j][0] = 'B';
pole[i][j][1] = '9'; pole[i][j][1] = '9';
kod_genetyczny[i][j] = przypiszKod("buraki");
} }
} }
test1(); test1();
@ -1034,6 +1037,8 @@ void reciveState()
{ {
j += 1; j += 1;
} }
} }
} }
} }
@ -1051,9 +1056,11 @@ void start1()
gogo(goalX - 1, goalY); gogo(goalX - 1, goalY);
pole[goalY][goalX][0] = 'Z'; pole[goalY][goalX][0] = 'Z';
pole[goalY][goalX][1] = '9'; pole[goalY][goalX][1] = '9';
kod_genetyczny[goalY][goalX] = przypiszKod("ziemniaki");
updatePola(); updatePola();
generujKody();
//sendState(); //trzeba rÄ™cznie zmieniać miÄ™dzy wysyÅaniem stanu a pobieraniem stanu pola //sendState(); //trzeba rÄ™cznie zmieniać miÄ™dzy wysyÅaniem stanu a pobieraniem stanu pola
reciveState(); reciveState();
@ -1124,6 +1131,8 @@ int main()
} }
} }
generujKody();
updatePola(); updatePola();
start1(); // testy start 1-3 start1(); // testy start 1-3

47
algorytm_genetyczny.md Normal file
View File

@ -0,0 +1,47 @@
# Opis dokumentu
Ten dokument to raport z wykonanego podprojektu na przedmiot Sztuczna Inteligencja. Celem
zadania jest implementacja algorytmu genetycznego w projekcie o tematyce inteligentny traktor.
# Zastosowanie algorytmu
Algorytm został wykorzystany do wygenerowania zbioru roślin do zasadzenia na bazie zebranych wcześniej roślin
# Skrócony opis implementacji w projekcie wspólnym
* Na początku dla każdego pola zawierającego buraki, zostanie wygenerowany kod genetyczny roślin z tego pola.
![](images/test2_generowanie_burakow.png)
* Funkcja Move teraz zajmuje się również zbieraniem i wywoływaniem sadzenia roślin
![](images/move_zbieranie.png)
* Funkcja przypiszKod decyduje czy należy zasadzić jedną z modyfikowanych genetycznie roślin, czy należy zasadzić nową (losową).
![](images/przypiszKod.png)
* Gdy liczba zebranych buraków osiągnie określoną wartość, zostanie przeprowadzony algorytm genetyczny i powstanie tablica roślin do zasadzenia
![](images/wykonanie_algorytmu_gen.png)
# Opis algorytmu genetycznego
* Algorytm wykonuje 5 iteracji, w których dokonuje selekcji osobników populacji, które zostaną poddane rozrodowi i wytwarza kolejne pokolenie populacji. Po wyjściu z pętli metodą rankingu selekcjonuje najlepszą część ostatniego pokolenia.
![](images/genetic_algorithm.png)
* Selekcja odbywa się metodą ruletki. Obliczana jest wartość funkcji dostosowania dla każdego osobnika. Im lepsza wartość, tym większa szansa na wylosowanie.
![](images/selection.png)
* Funkcja dostosowania polega na wyliczeniu średniej arytmetycznej trzech wartości: smaku, rozmiaru i koloru rośliny, które są zakodowane w łańcuchu znaków.
![](images/fitness.png)
* Funkcja crossover zajmuje się wywołaniem krzyżowania odpowiedniej liczby osobników
![](images/crossover.png)
* Zastosowana została metoda krzyżowania równomiernego (uniform crossover) z małą modyfikacją, zmniejszającą szansę na to, że dziecko będzie "klonem" rodzica. Istnieje również mała szansa, że dojdzie do równomiernej mutacji (uniform mutation), w której losowa cecha dziecka zostaje wygenerowana na nowo.
![](images/cross.png)