diff --git a/Main.cpp b/Main.cpp index 3e8373e..af0bdfe 100644 --- a/Main.cpp +++ b/Main.cpp @@ -1,4 +1,4 @@ -#include +#include #include #include #include @@ -8,13 +8,25 @@ #include #include +#include +#include +#include +#include +#include +#include + using namespace std; -const float maxFloat=FLT_MAX; +int score = 0; +int rozmiarPopulacji = 50; +string * zebrane = new string[rozmiarPopulacji]; +string * doSadzenia = new string[20]; + +const float maxFloat=100000000000; const int ROW = 27; const int COL = 27; typedef pair Pair; -typedef pair> pPair; +typedef pair > pPair; struct cell { int parent_i, parent_j; @@ -25,6 +37,290 @@ char pole[27][27][2]; int pozycjaTraktoraX = 1, pozycjaTraktoraY = 1; char currentWay = 'S'; +string kod_genetyczny[27][27]; + + +//algorytm genetyczny +string generateValue() { + + char trash[100]; + string x = itoa(rand() % 1000,trash,10); + if (x.size() == 2) { + x = "0" + x; + } + else if (x.size() == 1) { + x = "00" + x; + } + + return x; + +} + + +string generateVegetable() { + + string taste = generateValue(); + string colour = generateValue(); + string size = generateValue(); + + return taste + colour + size; + +} + + +void generatePopulation(string * population,int length) { + + int i; + for(i=0;i&i, const pair&j) +{ + return i.first > j.first; +} + + +void ranking(string * population,string * parents, int populationSize, int parentsNumber) { + + int i; + pair fitnessTable[populationSize]; + for(i=0;i fitnessTable[populationSize]; + for(i=0;i=0;j--) { + if(not exists(parentsNumber,taken,j)) { + sum += fitnessTable[j].first; + fitnessTable[j].first = sum; + } + + } + roulette = rand() % fitnessTable[0].first; + j = 0; + while(exists(parentsNumber,taken,j)) { + j += 1; + } + while(roulette > fitnessTable[j].first and j= nextGenSize) { + break; + } + else { + nextGen[counter] = parents[i]; + counter +=1; + } + } + while(counter < nextGenSize) { + for(i=0;i= nextGenSize) { + break; + } + else { + for(j=i;j= nextGenSize) { + break; + } + else { + string couple[2]; + couple[0] = parents[i]; + couple[1] = parents[j]; + nextGen[counter] = cross(couple); + counter += 1; + } + } + } + } + } +} + + +void genetic_algorithm(string * population, int populationSize, int parentsNumber,string * outcome, int outcomeSize) { + + int iteration,i; + for(iteration=0;iteration<5;iteration++) { + string * parents = new string[parentsNumber]; + selection(population,parents,populationSize,parentsNumber); + + string * nextGen = new string[populationSize]; + crossover(parents,nextGen,parentsNumber,populationSize); + + delete[] population; + + population = new string[populationSize]; + for(i=0;i "000000000" and doSadzenia[0] <= "999999999") { + int i = 0; + while(i<19, doSadzenia[i+1] >= "000000000" and doSadzenia[i+1] <= "999999999") { + i+=1; + } + string temp = doSadzenia[i]; + doSadzenia[i] = "000000000"; + return temp; + } + else { + return generateVegetable(); + } +} +//--------------------------------------------------------------------- + void color(string foregroundColor, string backgroundColor) { HANDLE hOut; @@ -193,7 +489,7 @@ void correctMovement(char wantedWay) } } void Move(char kierunek) -{ +{ switch (kierunek) { //góra-(w) @@ -201,8 +497,21 @@ void Move(char kierunek) { if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] != '#') { - correctMovement('N'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] == 'B') { + zebrane[score] = kod_genetyczny[pozycjaTraktoraY - 1][pozycjaTraktoraX]; + score+=1; + kod_genetyczny[pozycjaTraktoraY - 1][pozycjaTraktoraX] = "000000000"; + + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + } + + else { + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'B'; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX] = przypiszKod(); + } + pozycjaTraktoraY--; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; } @@ -213,8 +522,20 @@ void Move(char kierunek) { if (pole[pozycjaTraktoraY + 1][pozycjaTraktoraX][0] != '#') { - correctMovement('S'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + if (pole[pozycjaTraktoraY +1][pozycjaTraktoraX][0] == 'B') { + zebrane[score] = kod_genetyczny[pozycjaTraktoraY + 1][pozycjaTraktoraX]; + score+=1; + kod_genetyczny[pozycjaTraktoraY + 1][pozycjaTraktoraX] = "000000000"; + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + } + + else { + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'B'; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX] = przypiszKod(); + } + pozycjaTraktoraY++; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; } @@ -225,8 +546,20 @@ void Move(char kierunek) { if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] != '#') { - correctMovement('W'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] == 'B') { + zebrane[score] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX - 1]; + score+=1; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX - 1] = "000000000"; + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + } + + else { + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'B'; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX] = przypiszKod(); + } + pozycjaTraktoraX--; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; } @@ -237,8 +570,20 @@ void Move(char kierunek) { if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] != '#') { - correctMovement('E'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] == 'B') { + zebrane[score] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX + 1]; + score+=1; + kod_genetyczny[pozycjaTraktoraY ][pozycjaTraktoraX + 1] = "000000000"; + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; + } + + else { + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'B'; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX] = przypiszKod(); + } + pozycjaTraktoraX++; pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; } @@ -516,6 +861,14 @@ void test2() } test1(); updatePola(); + //generowanie kodów dla buraków + for(int i=0;i<27;i++) { + for(int j=0;j<27;j++) { + if (pole[i][j][0] == 'B') { + kod_genetyczny[i][j] = przypiszKod(); + } + } + } } void start1() @@ -549,8 +902,13 @@ void start3() gogo(goalX, goalY); } + + + int main() -{ +{ + srand(time(0)); + SetWindow(50, 30); //create pola// for (int i = 0; i < 27; i++) @@ -580,6 +938,8 @@ int main() } updatePola(); + + //UWAGA - generowanie kodow dla burakow jest w test2! start3(); // testy start 1-3 @@ -599,8 +959,24 @@ int main() { traktorDziala = false; } + + cout << "Zebrane buraki: " << score << endl; + if(score>=rozmiarPopulacji) { + score = 0; + delete[] doSadzenia; + string * doSadzenia = new string[20]; + for(int i = 0;i<20;i++) { + doSadzenia[i] = "000000000"; + } + genetic_algorithm(zebrane, rozmiarPopulacji, rozmiarPopulacji - 5, doSadzenia, 20); + delete[] zebrane; + string * zebrane = new string[rozmiarPopulacji]; + for(int i=0;i<20;i++) { + cout << doSadzenia[i] << endl; + } + } } while (traktorDziala); //---------end---------// return 0; -} \ No newline at end of file +} diff --git a/gmo.cpp b/gmo.cpp index 773897e..dcca118 100644 --- a/gmo.cpp +++ b/gmo.cpp @@ -84,11 +84,11 @@ int fitness(string vegetable) { bool comparePair(const pair&i, const pair&j) { - return i.first > j.first; + return i.first > j.first; } + - -void selection(string * population,string * parents, int populationSize, int parentsNumber) { +void ranking(string * population,string * parents, int populationSize, int parentsNumber) { int i; pair fitnessTable[populationSize]; @@ -98,17 +98,63 @@ void selection(string * population,string * parents, int populationSize, int par sort(fitnessTable,fitnessTable+populationSize,comparePair); - cout << "fitnessTable:" << endl; - for(i=0;i fitnessTable[populationSize]; + for(i=0;i=0;j--) { + if(not exists(parentsNumber,taken,j)) { + sum += fitnessTable[j].first; + fitnessTable[j].first = sum; + } + + } + roulette = rand() % fitnessTable[0].first; + j = 0; + while(exists(parentsNumber,taken,j)) { + j += 1; + } + while(roulette > fitnessTable[j].first and j= nextGenSize) { - break; - } - else { - for(j=i;j= nextGenSize) { + while(counter < nextGenSize) { + for(i=0;i= nextGenSize) { break; - } - else { - string couple[2]; - couple[0] = parents[i]; - couple[1] = parents[j]; - nextGen[counter] = cross(couple); - counter += 1; + } + else { + for(j=i;j= nextGenSize) { + break; + } + else { + string couple[2]; + couple[0] = parents[i]; + couple[1] = parents[j]; + nextGen[counter] = cross(couple); + counter += 1; + } } } } @@ -186,47 +251,42 @@ void crossover(string * parents,string * nextGen,int parentsNumber,int nextGenSi } - +void genetic_algorithm(string * population, int populationSize, int parentsNumber,string * outcome, int outcomeSize) { + + int iteration,i; + for(iteration=0;iteration<5;iteration++) { + string * parents = new string[parentsNumber]; + selection(population,parents,populationSize,parentsNumber); + + string * nextGen = new string[populationSize]; + crossover(parents,nextGen,parentsNumber,populationSize); + + delete[] population; + + population = new string[populationSize]; + for(i=0;i