Prześlij pliki do ''
This commit is contained in:
parent
a1976880c9
commit
efdb69843d
45
Main.cpp
45
Main.cpp
@ -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
47
algorytm_genetyczny.md
Normal 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)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user