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

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

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)