Prześlij pliki do ''
This commit is contained in:
parent
a1976880c9
commit
efdb69843d
43
Main.cpp
43
Main.cpp
@ -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
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