From bedbdbf1e266594e74aa36d9c731943cb6469f6d Mon Sep 17 00:00:00 2001 From: Tomasz Dzierzbicki Date: Tue, 9 Jun 2020 17:12:24 +0000 Subject: [PATCH] ostateczna wersja --- Main.cpp | 1294 +++++++++++++++++++++++++++++++--------------- decisionTree.sav | Bin 0 -> 2166 bytes injectCode.py | 33 ++ 3 files changed, 903 insertions(+), 424 deletions(-) create mode 100644 decisionTree.sav create mode 100644 injectCode.py diff --git a/Main.cpp b/Main.cpp index 6a8a0ef..29f8d6a 100644 --- a/Main.cpp +++ b/Main.cpp @@ -1,4 +1,4 @@ -//Main drzewa decyzyjne 1 + algorytm genetyczny +//Main oba drzewa decyzyjne + algorytm genetyczny #include #include @@ -13,13 +13,15 @@ #include #include #include -//#include #include -#include +#include +#include +//#include + using namespace std; -const float maxFloat=FLT_MAX; +const float maxFloat = FLT_MAX; const int ROW = 27; const int COL = 27; typedef pair Pair; @@ -33,25 +35,115 @@ struct cell char pole[27][27][6]; int pozycjaTraktoraX = 1, pozycjaTraktoraY = 1; char currentWay = 'S'; +//======================================================== + +double poleInt[27][27][2]; +char underTraktor = '.'; +char underTraktorWeight = '1'; +double timeToDest = 0.0; +double **weightMatrix; +double **baseMatrix; +double *outputLayer; +double neuroOutputPole[25][25]; +double *inputNeurons; +double **grad; +double **avrGrad; +double numberOfTests; +double oldcost; +bool closedList[ROW][COL]; +//======================================================== + +//drzewo decyzyjne + +int stan[27][27][2]; +string polecenie; +int decyzja = NULL; + +// Do dodania wywołanie odpowiednich funkcji - zbieranie - nawożenie - +void akcja() { + if (decyzja == 0) { + //nic nie rób + } + else if (decyzja == 1) { + //Zastosuj nawoz + } + else if (decyzja == 2) { + //Zastosuj srodek + } + else if (decyzja == 4) { + //Zbierz rośline i licznik++ + } + else if (decyzja == 5) { + //Zbierz rośline ale nie dodawaj do licznika + } +} +void decisionTree(string polecenie) { + + std::string str = polecenie; + const char* c = str.c_str(); + system(c); + + int line = 0; + ifstream inFile; + inFile.open("dec.txt"); + if (!inFile) { + cout << "Unable to open file"; + exit(1); // terminate with error + } + + while (inFile >> line) { + decyzja = line; + } + + inFile.close(); + akcja(); +} +void stanPola(int x, int y) { + //[x][x][0] = 0 - brak chemii + //[x][x][0] = 1 - tylko nawóz + //[x][x][0] = 2 - tylko środek + //[x][x][0] = 3 - środek i nawóz + //[x][x][1] - wartość wzrostu rośliny + + polecenie = "python injectCode.py 1 "; + + if (stan[x][y][0] == 0) + polecenie.append("0 0 "); + if (stan[x][y][0] == 1) + polecenie.append("1 0 "); + if (stan[x][y][0] == 2) + polecenie.append("0 1 "); + if (stan[x][y][0] == 3) + polecenie.append("1 1 "); + int w = (stan[x][y][1]); + std::string s = std::to_string(w); + polecenie.append(s); + + decisionTree(polecenie); +} + + + //======================================================== //algorytm genetyczny -int scoreBuraki = 0; -int scoreZiemniaki = 0; +int scoreBuraki = 0; +int scoreZiemniaki = 0; int rozmiarPopulacji = 500; -string * zebraneBuraki = new string[rozmiarPopulacji]; -string * zebraneZiemniaki = new string[rozmiarPopulacji]; -string * burakiDoSadzenia = new string[20]; -string * ziemniakiDoSadzenia = new string[20]; +string* zebraneBuraki = new string[rozmiarPopulacji]; +string* zebraneZiemniaki = new string[rozmiarPopulacji]; +string* burakiDoSadzenia = new string[20]; +string* ziemniakiDoSadzenia = new string[20]; int gmoLeftBuraki; int gmoLeftZiemniaki; string kod_genetyczny[27][27]; +char poleRecive[27][27]; string generateValue() { char trash[100]; string x; - srand(time(NULL)); - int random = (rand() % 1000, 1); + //srand(time(NULL)); + int random = (rand() % 1000);//, 1); //string x = itoa(rand() % 1000,trash,10); x = to_string(random); if (x.size() == 2) { @@ -60,185 +152,163 @@ string generateValue() { else if (x.size() == 1) { x = "00" + x; } - + return x; - + } - - string generateVegetable() { - - string taste = generateValue(); + + string taste = generateValue(); string colour = generateValue(); string size = generateValue(); - + return taste + colour + size; - + } +void generatePopulation(string* population, int length) { - -void generatePopulation(string * population,int length) { - int i; - for(i=0;i&i, const pair&j) +bool comparePair(const pair& i, const pair& j) { - return i.first > j.first; + return i.first > j.first; } +void ranking(string* population, string* parents, int populationSize, int parentsNumber) { - -void ranking(string * population,string * parents, int populationSize, int parentsNumber) { - int i; - pair *fitnessTable=new pair [populationSize]; - for(i=0;i* fitnessTable = new pair [populationSize]; + for (i = 0;i < populationSize;i++) { + fitnessTable[i] = make_pair(fitness(population[i]), population[i]); } - - sort(fitnessTable,fitnessTable+populationSize,comparePair); - - for(i=0;i *fitnessTable= new pair [populationSize]; - for(i=0;i* fitnessTable = new pair [populationSize]; + for (i = 0;i < populationSize;i++) { + fitnessTable[i] = make_pair(fitness(population[i]), population[i]); } - - sort(fitnessTable,fitnessTable+populationSize,comparePair); - + + sort(fitnessTable, fitnessTable + populationSize, comparePair); + int roulette; - int *taken=new int[parentsNumber]; + int* taken = new int[parentsNumber]; int sum = 0; - for(i=0;i=0;j--) { - if(not exists(parentsNumber,taken,j)) { - sum += fitnessTable[j].first; + for (i = 0;i < parentsNumber;i++) { + for (j = populationSize - 1;j >= 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)) { + while (exists(parentsNumber, taken, j)) { j += 1; } - while(roulette > fitnessTable[j].first and j fitnessTable[j].first && j < populationSize) { + if (not exists(parentsNumber, taken, j)) { roulette -= fitnessTable[j].first; } - j+=1; + j += 1; } parents[i] = fitnessTable[j].second; taken[i] = j; } - - - + + + } - - string mutate(string child) { - + int d3 = rand() % 3; string mutation = generateValue(); - switch(d3) { - case 0: - child = mutation + child.substr(3,6); - break; - case 1: - child = child.substr(0,3) + mutation + child.substr(6,3); - break; - case 2: - child = child.substr(0,6) + mutation; - break; + switch (d3) { + case 0: + child = mutation + child.substr(3, 6); + break; + case 1: + child = child.substr(0, 3) + mutation + child.substr(6, 3); + break; + case 2: + child = child.substr(0, 6) + mutation; + break; } - + return child; } - - string cross(string parent[2]) { - + int i; string child = ""; - for(i=0;i<3;i++) { - child += parent[rand() % 2].substr(i*3,3); + for (i = 0;i < 3;i++) { + child += parent[rand() % 2].substr(i * 3, 3); } if (child == parent[0] or child == parent[1]) { string other; if (child == parent[0]) other = parent[1]; else other = parent[0]; int d3 = rand() % 3; - switch(d3) { - case 0: - child = other.substr((rand() % 3)*3,3) + child.substr(3,6); - break; - case 1: - child = child.substr(0,3) + other.substr((rand() % 3)*3,3) + child.substr(6,3); - break; - case 2: - child = child.substr(0,6) + other.substr((rand() % 3)*3,3); - break; + switch (d3) { + case 0: + child = other.substr((rand() % 3) * 3, 3) + child.substr(3, 6); + break; + case 1: + child = child.substr(0, 3) + other.substr((rand() % 3) * 3, 3) + child.substr(6, 3); + break; + case 2: + child = child.substr(0, 6) + other.substr((rand() % 3) * 3, 3); + break; } } int d1000 = rand() % 1000; @@ -247,30 +317,28 @@ string cross(string parent[2]) { } return child; } +void crossover(string* parents, string* nextGen, int parentsNumber, int nextGenSize) { - -void crossover(string * parents,string * nextGen,int parentsNumber,int nextGenSize) { - int counter = 0; - int i,j; - for(i=0;i= nextGenSize) { break; } else { nextGen[counter] = parents[i]; - counter +=1; + counter += 1; } } - while(counter < nextGenSize) { - for(i=0;i= nextGenSize) { break; } else { - for(j=i;j= nextGenSize) { - break; + break; } else { string couple[2]; @@ -284,112 +352,100 @@ 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); -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); - - for(i=0;i 0) { - string temp = burakiDoSadzenia[gmoLeftBuraki - 1]; - gmoLeftBuraki -= 1; - return temp; - } - else { - return generateVegetable(); - } - } + if (warzywa == "buraki") { + if (gmoLeftBuraki > 0) { + string temp = burakiDoSadzenia[gmoLeftBuraki - 1]; + gmoLeftBuraki -= 1; + return temp; + } else { - if (gmoLeftZiemniaki > 0) { - string temp = ziemniakiDoSadzenia[gmoLeftZiemniaki - 1]; - gmoLeftZiemniaki -= 1; - return temp; - } - else { - return generateVegetable(); - } + return generateVegetable(); } + } + else { + if (gmoLeftZiemniaki > 0) { + string temp = ziemniakiDoSadzenia[gmoLeftZiemniaki - 1]; + gmoLeftZiemniaki -= 1; + return temp; + } + else { + return generateVegetable(); + } + } } - - void przypiszKodGenetyczny(int i, int j, char plant) { - if (plant == 'B') { - kod_genetyczny[i][j] = przypiszKod("buraki"); - } - else if (plant == 'Z') { - kod_genetyczny[i][j] = przypiszKod("ziemniaki"); - } + if (plant == 'B') { + kod_genetyczny[i][j] = przypiszKod("buraki"); + } + else if (plant == 'Z') { + kod_genetyczny[i][j] = przypiszKod("ziemniaki"); + } } - - void obslugaAlgorytmuGenetycznego() { - cout << "Zebrane buraki: " << scoreBuraki << endl; - cout << "Zebrane ziemniaki: " << scoreZiemniaki << endl; - if(scoreBuraki>=rozmiarPopulacji) { - scoreBuraki = 0; + cout << "Zebrane buraki: " << scoreBuraki << endl; + cout << "Zebrane ziemniaki: " << scoreZiemniaki << endl; + if (scoreBuraki >= rozmiarPopulacji) { + scoreBuraki = 0; - for(int i = 0;i<20;i++) { - burakiDoSadzenia[i] = "000000000"; - } - genetic_algorithm(zebraneBuraki, rozmiarPopulacji, rozmiarPopulacji - 5, burakiDoSadzenia, 20); - gmoLeftBuraki = 20; - for(int i = 0; i=rozmiarPopulacji) { - scoreZiemniaki = 0; - - for(int i = 0;i<20;i++) { - ziemniakiDoSadzenia[i] = "000000000"; - } - genetic_algorithm(zebraneZiemniaki, rozmiarPopulacji, rozmiarPopulacji - 5, ziemniakiDoSadzenia, 20); - gmoLeftZiemniaki = 20; - for(int i = 0; i= rozmiarPopulacji) { + scoreZiemniaki = 0; - -void generujKody() { - 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("buraki"); - } - else if (pole[i][j][0] == 'Z') { - kod_genetyczny[i][j] = przypiszKod("ziemniaki"); - } + for (int i = 0;i < 20;i++) { + ziemniakiDoSadzenia[i] = "000000000"; + } + genetic_algorithm(zebraneZiemniaki, rozmiarPopulacji, rozmiarPopulacji - 5, ziemniakiDoSadzenia, 20); + gmoLeftZiemniaki = 20; + for (int i = 0; i < rozmiarPopulacji;i++) { + zebraneZiemniaki[i] = "000000000"; + } + for (int i = 0;i < 20;i++) { + cout << ziemniakiDoSadzenia[i] << endl; } } } - -//--------------------------------------------------------------------- - +void generujKody() { + 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("buraki"); + } + else if (pole[i][j][0] == 'Z') { + kod_genetyczny[i][j] = przypiszKod("ziemniaki"); + } + } + } +} + //======================================================== void color(string foregroundColor, string backgroundColor) { @@ -464,7 +520,6 @@ void color(string foregroundColor, string backgroundColor) backgroundCode = 15; SetConsoleTextAttribute(hOut, foregroundCode + backgroundCode * 16); } - void SetWindow(int Width, int Height) { _COORD coord; @@ -481,7 +536,6 @@ void SetWindow(int Width, int Height) SetConsoleScreenBufferSize(Handle, coord); // Set Buffer Size SetConsoleWindowInfo(Handle, TRUE, &Rect); // Set Window Size } - void updatePola() { system("cls"); @@ -523,155 +577,134 @@ void updatePola() cout << endl; color("white", "black"); } - -} +} void correctMovement(char wantedWay) { while (currentWay != wantedWay) { switch (currentWay) { - case 'N': + case 'N': + { + if (wantedWay == 'S') + currentWay = wantedWay; + else + currentWay = 'W'; + }break; + case 'S': + { + if (wantedWay == 'N') + currentWay = wantedWay; + else + currentWay = 'W'; + }break; + case 'W': + { + if (wantedWay == 'E') + currentWay = wantedWay; + else + currentWay = 'N'; + }break; + case 'E': + { + if (wantedWay == 'W') + currentWay = wantedWay; + else + currentWay = 'N'; + }break; + } + } +} +void increseState() +{ + for (int i = 1; i < 26; i++) + { + for (int j = 1; j < 26; j++) + { + if (pole[j][i][0] != 'T' && pole[j][i][0] != '.') { - if (wantedWay == 'S') - currentWay = wantedWay; - else - currentWay = 'W'; - }break; - case 'S': - { - if (wantedWay == 'N') - currentWay = wantedWay; - else - currentWay = 'W'; - }break; - case 'W': - { - if (wantedWay == 'E') - currentWay = wantedWay; - else - currentWay = 'N'; - }break; - case 'E': - { - if (wantedWay == 'W') - currentWay = wantedWay; - else - currentWay = 'N'; - }break; + if (poleInt[j][i][1] != 100 && poleInt[j][i][1] != 0) + { + poleInt[j][i][1] += 0.5; + } + } } } } void Move(char kierunek) -{ +{ switch (kierunek) { //gA3ra-(w) - case 'w': + case 'w': + { + if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] != '#') { - if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] != '#') - { - if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] == 'B') { - zebraneBuraki[scoreBuraki] = kod_genetyczny[pozycjaTraktoraY - 1][pozycjaTraktoraX]; - scoreBuraki+=1; - kod_genetyczny[pozycjaTraktoraY - 1][pozycjaTraktoraX] = "000000000"; - } - - else if (pole[pozycjaTraktoraY - 1][pozycjaTraktoraX][0] == 'Z') { - zebraneZiemniaki[scoreZiemniaki] = kod_genetyczny[pozycjaTraktoraY - 1][pozycjaTraktoraX]; - scoreZiemniaki+=1; - kod_genetyczny[pozycjaTraktoraY - 1][pozycjaTraktoraX] = "000000000"; - } - - correctMovement('N'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; - pozycjaTraktoraY--; - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; - } - updatePola(); - }break; - //dA3A‚-(s) - case 's': + correctMovement('N'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = underTraktor; + pole[pozycjaTraktoraY][pozycjaTraktoraX][1] = underTraktorWeight; + pozycjaTraktoraY--; + increseState(); + underTraktor = pole[pozycjaTraktoraY][pozycjaTraktoraX][0]; + underTraktorWeight = pole[pozycjaTraktoraY][pozycjaTraktoraX][1]; + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; + } + updatePola(); + }break; + //dA3A‚-(s) + case 's': + { + if (pole[pozycjaTraktoraY + 1][pozycjaTraktoraX][0] != '#') { - if (pole[pozycjaTraktoraY + 1][pozycjaTraktoraX][0] != '#') - { - if (pole[pozycjaTraktoraY +1][pozycjaTraktoraX][0] == 'B') { - zebraneBuraki[scoreBuraki] = kod_genetyczny[pozycjaTraktoraY + 1][pozycjaTraktoraX]; - scoreBuraki+=1; - kod_genetyczny[pozycjaTraktoraY + 1][pozycjaTraktoraX] = "000000000"; - } - - else if (pole[pozycjaTraktoraY +1][pozycjaTraktoraX][0] == 'Z') { - zebraneZiemniaki[scoreZiemniaki] = kod_genetyczny[pozycjaTraktoraY + 1][pozycjaTraktoraX]; - scoreZiemniaki+=1; - kod_genetyczny[pozycjaTraktoraY + 1][pozycjaTraktoraX] = "000000000"; - } - - - correctMovement('S'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; - pozycjaTraktoraY++; - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; - } - updatePola(); - }break; - //lewo-(a) - case 'a': + correctMovement('S'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = underTraktor; + pole[pozycjaTraktoraY][pozycjaTraktoraX][1] = underTraktorWeight; + pozycjaTraktoraY++; + increseState(); + underTraktor = pole[pozycjaTraktoraY][pozycjaTraktoraX][0]; + underTraktorWeight = pole[pozycjaTraktoraY][pozycjaTraktoraX][1]; + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; + } + updatePola(); + }break; + //lewo-(a) + case 'a': + { + if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] != '#') { - if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] != '#') - { - if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] == 'B') { - zebraneBuraki[scoreBuraki] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX - 1]; - scoreBuraki+=1; - kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX - 1] = "000000000"; - } - - else if (pole[pozycjaTraktoraY][pozycjaTraktoraX - 1][0] == 'Z') { - zebraneZiemniaki[scoreZiemniaki] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX - 1]; - scoreZiemniaki+=1; - kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX - 1] = "000000000"; - } - - - correctMovement('W'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; - pozycjaTraktoraX--; - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; - } - updatePola(); - }break; - //prawo-(d) - case 'd': + correctMovement('W'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = underTraktor; + pole[pozycjaTraktoraY][pozycjaTraktoraX][1] = underTraktorWeight; + pozycjaTraktoraX--; + increseState(); + underTraktor = pole[pozycjaTraktoraY][pozycjaTraktoraX][0]; + underTraktorWeight = pole[pozycjaTraktoraY][pozycjaTraktoraX][1]; + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; + } + updatePola(); + }break; + //prawo-(d) + case 'd': + { + if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] != '#') { - if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] != '#') - { - if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] == 'B') { - zebraneBuraki[scoreBuraki] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX + 1]; - scoreBuraki+=1; - kod_genetyczny[pozycjaTraktoraY ][pozycjaTraktoraX + 1] = "000000000"; - } - - else if (pole[pozycjaTraktoraY][pozycjaTraktoraX + 1][0] == 'Z') { - zebraneZiemniaki[scoreZiemniaki] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX + 1]; - scoreZiemniaki+=1; - kod_genetyczny[pozycjaTraktoraY ][pozycjaTraktoraX + 1] = "000000000"; - } - - correctMovement('E'); - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = '.'; - pozycjaTraktoraX++; - pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; - } - updatePola(); - }break; + correctMovement('E'); + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = underTraktor; + pole[pozycjaTraktoraY][pozycjaTraktoraX][1] = underTraktorWeight; + pozycjaTraktoraX++; + increseState(); + underTraktor = pole[pozycjaTraktoraY][pozycjaTraktoraX][0]; + underTraktorWeight = pole[pozycjaTraktoraY][pozycjaTraktoraX][1]; + pole[pozycjaTraktoraY][pozycjaTraktoraX][0] = 'T'; + } + updatePola(); + }break; } - - obslugaAlgorytmuGenetycznego(); - -} +} + bool isValid(int x, int y) { if (pole[x][y][0] != '#') @@ -680,7 +713,7 @@ bool isValid(int x, int y) } return false; } -bool isDestination(int x, int y,Pair dest) +bool isDestination(int x, int y, Pair dest) { if (dest.first == x && dest.second == y) { @@ -692,11 +725,40 @@ double calculateHValue(int x, int y, Pair dest) { return abs(x - dest.first) + abs(y - dest.second); } -void tracePath(cell cellDetails[][COL], Pair dest) +void plantVeg() +{ + int x = pozycjaTraktoraX, y = pozycjaTraktoraY; + underTraktor = poleRecive[x][y]; + przypiszKodGenetyczny(x, y, poleRecive[x][y]); + if (poleRecive[x][y] == '.') + { + underTraktorWeight = '1'; + poleInt[x][y][0] = 0; + poleInt[x][y][1] = 0; + } + else + { + if (poleRecive[x][y] == 'Z') + { + underTraktorWeight = '1'; + poleInt[x][y][0] = 0; + poleInt[x][y][1] = 1; + } + else + { + underTraktorWeight = '1'; + poleInt[x][y][0] = 0; + poleInt[x][y][1] = 1; + } + } +} +void tracePath(cell cellDetails[][COL], Pair dest, string action) { //printf("\nThe Path is "); //----start info int row = dest.first; - int col = dest.second; + int col = dest.second; + pairsrc = make_pair(pozycjaTraktoraX, pozycjaTraktoraY); + timeToDest = 0; stack Path; @@ -715,24 +777,49 @@ void tracePath(cell cellDetails[][COL], Pair dest) { pair p = Path.top(); Path.pop(); - if (p.first > pozycjaTraktoraX) - Move('d'); - if (p.first < pozycjaTraktoraX) - Move('a'); - if (p.second > pozycjaTraktoraY) - Move('s'); - if (p.second < pozycjaTraktoraY) - Move('w'); - + if (action == "move"|| action == "moveWithTime" || action == "moveWithPick") + { + if (p.first > pozycjaTraktoraX) + Move('d'); + if (p.first < pozycjaTraktoraX) + Move('a'); + if (p.second > pozycjaTraktoraY) + Move('s'); + if (p.second < pozycjaTraktoraY) + Move('w'); + Sleep(1000); + } + if (action == "time" || action == "moveWithTime") + { + if ((p.first != src.first || p.second != src.second) + && (p.first != dest.first || p.second != dest.second)) + { + timeToDest += ((double)pole[p.second][p.first][1] - 48)*1.0; + } + } //printf("-> (%d,%d) ", p.first, p.second); //---- informacja wierzchoÅ‚ku - Sleep(1000); + } + if (action == "moveWithPick") + { + if (underTraktor == 'B') { + zebraneBuraki[scoreBuraki] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX]; + scoreBuraki += 1; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX] = "000000000"; + } + else if (underTraktor == 'Z') { + zebraneZiemniaki[scoreZiemniaki] = kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX]; + scoreZiemniaki += 1; + kod_genetyczny[pozycjaTraktoraY][pozycjaTraktoraX] = "000000000"; + } + obslugaAlgorytmuGenetycznego(); + plantVeg(); } return; } -void aStarSearch(int grid[][COL],Pair src, Pair dest) +void aStarSearch(int grid[][COL], Pair src, Pair dest, string action) { - bool closedList[ROW][COL]; + //bool closedList[ROW][COL]; memset(closedList, false, sizeof(closedList)); cell cellDetails[ROW][COL]; @@ -755,7 +842,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) cellDetails[i][j].h = 0.0; cellDetails[i][j].parent_i = i; cellDetails[i][j].parent_j = j; - + set openList; openList.insert(make_pair(0.0, make_pair(i, j))); bool foundDest = false; @@ -770,7 +857,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) double gNew, hNew, fNew; double waga = 1.0; - waga = ((double)pole[j][i][1] - 48)*1.0;//----waga + waga = ((double)pole[j][i][1] - 48) * 1.0;//----waga //----------- 1st Successor (North) ------------ if (isValid(i - 1, j) == true) @@ -780,7 +867,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) cellDetails[i - 1][j].parent_i = i; cellDetails[i - 1][j].parent_j = j; //printf("The destination cell is found\n"); - tracePath(cellDetails, dest); + tracePath(cellDetails, dest, action); foundDest = true; return; } @@ -814,7 +901,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) cellDetails[i + 1][j].parent_i = i; cellDetails[i + 1][j].parent_j = j; //printf("The destination cell is found\n"); - tracePath(cellDetails, dest); + tracePath(cellDetails, dest, action); foundDest = true; return; } @@ -844,7 +931,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) cellDetails[i][j + 1].parent_i = i; cellDetails[i][j + 1].parent_j = j; //printf("The destination cell is found\n"); - tracePath(cellDetails, dest); + tracePath(cellDetails, dest, action); foundDest = true; return; } @@ -875,7 +962,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) cellDetails[i][j - 1].parent_i = i; cellDetails[i][j - 1].parent_j = j; //printf("The destination cell is found\n"); - tracePath(cellDetails, dest); + tracePath(cellDetails, dest, action); foundDest = true; return; } @@ -905,7 +992,7 @@ void aStarSearch(int grid[][COL],Pair src, Pair dest) return; } -void gogo(int endX,int endY) +void gogo(int endX, int endY) { updatePola(); Sleep(1000); @@ -919,17 +1006,21 @@ void gogo(int endX,int endY) } Pair src = make_pair(pozycjaTraktoraX, pozycjaTraktoraY); Pair dest = make_pair(endX, endY); - aStarSearch(grid, src, dest); - + //aStarSearch(grid, src, dest); + aStarSearch(grid, src, dest, "moveWithPick"); } void test1() { pole[1][3][0] = 'B'; pole[1][3][1] = '9'; + poleInt[1][3][0] = 0; + poleInt[1][3][1] = 1; pole[3][1][0] = 'Z'; pole[3][1][1] = '9'; - + poleInt[3][1][0] = 0; + poleInt[3][1][1] = 1; + kod_genetyczny[1][3] = przypiszKod("buraki"); kod_genetyczny[3][1] = przypiszKod("ziemniaki"); } @@ -941,7 +1032,8 @@ void test2() { pole[i][j][0] = 'B'; pole[i][j][1] = '9'; - + poleInt[i][j][0] = 0; + poleInt[i][j][1] = 1; kod_genetyczny[i][j] = przypiszKod("buraki"); } } @@ -983,6 +1075,33 @@ void testSI1() } } +/*void plantVeg() +{ + int x = pozycjaTraktoraX, y = pozycjaTraktoraY; + underTraktor = poleRecive[x][y]; + przypiszKodGenetyczny(x, y, poleRecive[x][y]); + if (poleRecive[x][y] == '.') + { + underTraktorWeight = '1'; + poleInt[x][y][0] = 0; + poleInt[x][y][1] = 0; + } + else + { + if (poleRecive[x][y] == 'Z') + { + underTraktorWeight = '5'; + poleInt[x][y][0] = 0; + poleInt[x][y][1] = 1; + } + else + { + underTraktorWeight = '9'; + poleInt[x][y][0] = 0; + poleInt[x][y][1] = 1; + } + } +}*/ void sendState() { ofstream write("dane.txt"); @@ -1013,26 +1132,7 @@ void reciveState() int j = 1; while (read >> plant) { - if (j == 25) - { - gogo(1, i+1); - } - else - { - gogo(j+1 , i ); - } - pole[i][j][0] = plant; - - przypiszKodGenetyczny(i,j,plant); - - if (plant == '.') - { - pole[i][j][1] = '1'; - } - else - { - pole[i][j][1] = '9'; - } + poleRecive[j][i] = plant; if (j == 25) { j = 1; @@ -1042,32 +1142,366 @@ void reciveState() { j += 1; } - - } } } +//----------neuro------------// +double countTimeToDest(int endX, int endY) +{ + //updatePola(); + int grid[27][27]; + for (int i = 0; i < 27; i++) + { + for (int j = 0; j < 27; j++) + { + grid[i][j] = 0; + } + } + Pair src = make_pair(pozycjaTraktoraX, pozycjaTraktoraY); + Pair dest = make_pair(endX, endY); + aStarSearch(grid, src, dest, "time"); + return timeToDest; +} + +double Sigmoid(double number) +{ + int tempInt = 0; + if (number < 0) + { + tempInt = 1; + } + return tempInt + (number / (1.0 + abs(number))); +} +double pSigmoid(double number) +{ + int tempInt = 1; + if (number < 0) + { + tempInt = -1; + } + return tempInt * (number / ((1.0 + abs(number))*(1.0 + abs(number)))); +} +double lookOfVege(int x, int y) +{ + int state = poleInt[y][x][1]; + int proOrFer = poleInt[y][x][0]; + if (state == 0)// - brak + { + return 0.0; + } + if (state >= 1 && state < 15)// - kiełek + { + return 1.0; + } + if (state >= 15 && state < 30)// - młoda roślina + { + return 2.0; + } + if (state >= 30 && state < 60)// - dojrzała + { + return 3.0; + } + if (state >= 60 && state < 85)// - przejrzała + { + if (proOrFer == 2 && state < 70)// - z środkiem dojrzała + { + return 3.0; + } + return 4.0; + } + if (state >= 85 && state <= 100)// - zniszczona + { + if (proOrFer == 2 && state < 90)// - z środkiem przejrzała + { + return 4.0; + } + return 5.0; + } +} +double setValusesRange(double a, double b, double num) +{ + int temp = 1; + if (a > b) + { + temp = -1; + } + double avr = ((a + b) / 2)*temp; + return Sigmoid(num - avr); +} +void gradient(double desiredOutput[25][25]) +{ + const int numberOfCellsInPole = (25 * 25); + const int inputNeuronsCount = numberOfCellsInPole * 4; + double z; + for (int i = 0; i < numberOfCellsInPole; i++) + { + for (int j = 0; j < inputNeuronsCount; j++) + { + if (weightMatrix[i][j] != 0) + { + int x, y; + y = i / 25; + x = i % 25; + grad[i][j] = 2 * pSigmoid(weightMatrix[i][j] * inputNeurons[j]) * inputNeurons[j] * (neuroOutputPole[y][x] - desiredOutput[y][x]); + } + else + { + grad[i][j] = 0; + } + } + } + //cout << "grad set" << endl; +} + +void matrixFromFile() +{ + ifstream file; + file.open("matrix.txt"); + string line; + int im = 0; + while (getline(file, line)) { + istringstream iss(line); + double a, b, c, d; + iss >> a >> b >> c >> d; + weightMatrix[im][(im * 4)] = a; + weightMatrix[im][(im * 4) + 1] = b; + weightMatrix[im][(im * 4) + 2] = c; + weightMatrix[im][(im * 4) + 3] = d; + im++; + } + file.close(); +} +void buildFirstMatrix() +{ + const int numberOfCellsInPole = (25 * 25); + const int inputNeuronsCount = numberOfCellsInPole * 4; + weightMatrix = (double **)malloc(numberOfCellsInPole * sizeof(double *)); + inputNeurons = (double *)malloc(inputNeuronsCount * sizeof(double)); + outputLayer = (double *)malloc(numberOfCellsInPole * sizeof(double)); + //memset(closedList, false, sizeof(closedList)); + for (int i = 0; i < numberOfCellsInPole; i++) + { + weightMatrix[i] = (double *)malloc(inputNeuronsCount * sizeof(double)); + } +} +void buildMatrix() +{ + const int numberOfCellsInPole = (25 * 25); + const int inputNeuronsCount = numberOfCellsInPole * 4; + for (int i = 0; i < numberOfCellsInPole; i++) + { + for (int j = 0; j < inputNeuronsCount; j++) + { + weightMatrix[i][j] = 0.0; + } + } + matrixFromFile(); +} + +double neuronsInputBuild(double desiredOutput[25][25]) +{ + const int numberOfCellsInPole = (25 * 25);// -1; + const int inputNeuronsCount = numberOfCellsInPole * 4; + + double typeOfVege[numberOfCellsInPole]; + double timeToGetToVege[numberOfCellsInPole]; + double protectOrFertilize[numberOfCellsInPole]; + double stateOfVege[numberOfCellsInPole]; + + for (int i = 1; i <= 25; i++) + { + for (int j = 1; j <= 25; j++) + { + int tempCell = (((i - 1) * 25) + (j - 1)); + if (pole[i][j][0] == 'T') + { + /*if (j >= pozycjaTraktoraX && i >= pozycjaTraktoraY) + { + int tempCell = (((i - 1) * 25) + (j - 1))-1; + }*/ + typeOfVege[tempCell] = 0;//type after weight 1-9 + timeToGetToVege[tempCell] = 0;//time x.0 + protectOrFertilize[tempCell] = 0;//0.0 1.0 2.0 3.0 + stateOfVege[tempCell] = 0;//0.0-5.0 + } + else + { + typeOfVege[tempCell] = setValusesRange(1, 9, ((double)pole[i][j][1] - 48));//type after weight 1-9 + timeToGetToVege[tempCell] = setValusesRange(0, 25 * 25 * 9, countTimeToDest(j, i));//time x.0 + protectOrFertilize[tempCell] = setValusesRange(3, 0, poleInt[i][j][0]);//0.0 1.0 2.0 3.0 + stateOfVege[tempCell] = setValusesRange(0, 5, lookOfVege(j, i));//0.0-5.0 + } + } + } + //cout << "set neurons"; + for (int i = 0; i < numberOfCellsInPole; i++) + { + inputNeurons[i * 4] = Sigmoid(typeOfVege[i]); + inputNeurons[(i * 4) + 1] = Sigmoid(timeToGetToVege[i]); + inputNeurons[(i * 4) + 2] = Sigmoid(protectOrFertilize[i]); + inputNeurons[(i * 4) + 3] = Sigmoid(stateOfVege[i]); + } + for (int i = 0; i < numberOfCellsInPole; i++) + { + double sum = 0; + for (int j = 0; j < inputNeuronsCount; j++) + { + sum += weightMatrix[i][j] * inputNeurons[j]; + } + outputLayer[i] = Sigmoid(sum); + } + for (int i = 0; i < 25; i++) + { + for (int j = 0; j < 25; j++) + { + int tempCell = ((i * 25) + j); + neuroOutputPole[i][j] = outputLayer[tempCell]; + } + } + double cost = 0.0; + for (int i = 0; i < 25; i++) + { + for (int j = 0; j < 25; j++) + { + double tempNum = neuroOutputPole[i][j] - desiredOutput[i][j]; + cost += (tempNum*tempNum); + } + } + //updatePola(); + return cost; +} +void backProp(double desiredOuput[25][25]) +{ + const int numberOfCellsInPole = (25 * 25); + const int inputNeuronsCount = numberOfCellsInPole * 4; + double cost; + cost = neuronsInputBuild(desiredOuput); + oldcost = cost + 2; + int i = 0; + while ((abs(cost - oldcost) > 0.05 || cost > 1) && i < 100) + { + cout << i << "-" << cost << " "; + gradient(desiredOuput); + + for (int i = 0; i < numberOfCellsInPole; i++) + { + for (int j = 0; j < inputNeuronsCount; j++) + { + weightMatrix[i][j] -= grad[i][j]; + } + } + oldcost = cost; + cost = neuronsInputBuild(desiredOuput); + i++; + } + cout << "--END--" << endl; + /*for (int i = 0; i < numberOfCellsInPole; i++) + { + for (int j = 0; j < inputNeuronsCount; j++) + { + if (weightMatrix[i][j] != 0) + { + avrGrad[i][j] += ((baseMatrix[i][j] - weightMatrix[i][j]) / numberOfTests); + } + } + }*/ +} +void network(int desiredX, int desiredY) +{ + double desiredPole[25][25]; + for (int i = 0; i < 25; i++) + { + for (int j = 0; j < 25; j++) + { + desiredPole[i][j] = 0; + } + } + desiredPole[desiredY - 1][desiredX - 1] = 1; + //double cost = neuronsInputBuild(desiredPole); + backProp(desiredPole); +} + +void chousePath() +{ + double tempOut[25][25]; + for (int i = 0; i < 25; i++) + { + for (int j = 0; j < 25; j++) + { + tempOut[i][j] = 0; + } + } + neuronsInputBuild(tempOut); + /* + cout.precision(15); + for (int i = 0; i < 25; i++) + { + for (int j = 0; j < 25; j++) + { + cout << neuroOutputPole[i][j] << " "; + } + }*/ + //Sleep(1000); + const int numberOfCellsInPole = (25 * 25); + const int inputNeuronsCount = numberOfCellsInPole * 4; + double bestX = 0, bestY = 0, bestChance = 0; + for (int i = 0; i < 25; i++) + { + for (int j = 0; j < 25; j++) + { + //cout << neuroOutputPole[i][j] << " "; + + double tempChance; + if (pole[i + 1][j + 1][0] == 'T') + { + tempChance = 0; + } + else + { + tempChance = neuroOutputPole[i][j]; + } + //cout << tempChance << " "; + //cout << j + 1 << "_" << i + 1<<"--"; + double diff = (int)((tempChance - bestChance)*pow(10, 10)); + if (tempChance > bestChance && diff != 0) + { + bestX = j; + bestY = i; + bestChance = tempChance; + } + } + } + //cout << bestChance << " " << bestX + 1 << " " << bestY + 1 << endl; + Sleep(1000); + gogo(bestX + 1, bestY + 1); + //Sleep(100000); +} +//----------end------------// + + void start1() { - int goalX = 3, goalY = 4; - test1(); - testSI1(); + //int goalX = 3, goalY = 4; + test1();//yes + testSI1();//trzeba pole[1][1][0] = 'T'; - pole[1][1][1] = '1'; - pole[goalY][goalX][0] = 'G'; - pole[goalY][goalX][1] = '9'; - gogo(goalX, goalY); - gogo(goalX - 1, goalY); - pole[goalY][goalX][0] = 'Z'; - pole[goalY][goalX][1] = '9'; - - kod_genetyczny[goalY][goalX] = przypiszKod("ziemniaki"); - + pole[1][1][1] = '9'; + poleInt[1][1][0] = 0; + poleInt[1][1][1] = 0; + //pole[goalY][goalX][0] = 'G'; + //pole[goalY][goalX][1] = '9'; + //gogo(goalX, goalY); + //gogo(goalX - 1, goalY); + //pole[goalY][goalX][0] = 'Z'; + //pole[goalY][goalX][1] = '9'; + + //kod_genetyczny[goalY][goalX] = przypiszKod("ziemniaki"); + updatePola(); - - - //sendState(); //trzeba rÄ™cznie zmieniać miÄ™dzy wysyÅ‚aniem stanu a pobieraniem stanu pola + + + //sendState(); //trzeba recznie zmienial miedzy wysylaniem stanu a pobieraniem stanu pola reciveState(); } void start2() @@ -1094,7 +1528,7 @@ void start3() int main() { srand(time(0)); - + SetWindow(50, 30); //create pola// for (int i = 0; i < 27; i++) @@ -1114,6 +1548,8 @@ int main() { pole[i][j][0] = '.'; pole[i][j][1] = '1'; + poleInt[i][j][0] = 0; + poleInt[i][j][1] = 1; } } @@ -1121,25 +1557,33 @@ int main() { pole[i + 1][i + 1][0] = 'B'; pole[i + 1][i + 1][1] = '9'; + poleInt[i + 1][i + 1][0] = 0; + poleInt[i + 1][i + 1][1] = 1; } - - for (int i = 0; i <25; i++) { - for (int j = 0; j <10; j++) { + + for (int i = 0; i < 25; i++) { + for (int j = 0; j < 10; j++) { pole[j + 1][i + 1][0] = 'B'; pole[j + 1][i + 1][1] = '9'; - } + poleInt[j + 1][i + 1][0] = 0; + poleInt[j + 1][i + 1][1] = 1; + } } - for (int i = 0; i <25; i++) { - for (int j = 10; j <20; j++) { + for (int i = 0; i < 25; i++) { + for (int j = 10; j < 20; j++) { pole[j + 1][i + 1][0] = 'Z'; - pole[j + 1][i + 1][1] = '9'; - } + pole[j + 1][i + 1][1] = '5'; + poleInt[j + 1][i + 1][0] = 0; + poleInt[j + 1][i + 1][1] = 1; + } } - + generujKody(); + buildFirstMatrix(); + buildMatrix(); + updatePola(); - start1(); // testy start 1-3 //---------start---------// @@ -1149,6 +1593,8 @@ int main() do { + chousePath(); + /* akcja = _getch(); if (akcja == 'w' || akcja == 's' || akcja == 'a' || akcja == 'd') { @@ -1158,7 +1604,7 @@ int main() { traktorDziala = false; } - + */ } while (traktorDziala); //---------end---------// diff --git a/decisionTree.sav b/decisionTree.sav new file mode 100644 index 0000000000000000000000000000000000000000..0b036404bf9cdef9c619fccfc2b9ae1eea07a307 GIT binary patch literal 2166 zcma)8&1)M+6kpkrEn9YQ0*;-2;fq1eK_mtnA7ZqL4S`H6yNL;eP=?iNlv%Rc-OSF~ zF>ydS#KADPObb2szbLea^xXfTh2ldF$-(5%d)qg=GwRBUi1whj@4er9^FDqWsayR1 zaoI{AF&{tniNk^#XN1(S>pO8wVks_f6W5EqFxUh8ma=+nk1+XKuDp=XWmQbM%;SUs zLW)Tea27^~Qk3J!_c++4C^kvVrI_kCPjQPxoXUo{*zp1!JDtcUF;1ZpjfuIu6{=}V zR1k~GctE^Il;bvYTn;DU)OkBA-Lk}t%H1XoPZ-qP5HrjPT44vr+~EZD3(Buza1gdq z#JtMtb)p1{KZLSeMx2<)|5IM-17sya;&d*$97sGF!GR%z_NJjVMqD_r1--g%gdIPk zPA+35=#_{iDvIdQp($U=NfXdN*VjCiuwdUQHbz1-H zx6iuEzns+%^7-C;XPf+nKt|7C%l6Uz^@Yl__x1IBoP}(~%>46@Ry6F5fzO(kR9+o9 zZY3Yr-5xpaWW{{jk5Y_xp$XT0X9OXXNv~%*R=qBgZZF#ckN>1u?Pj_z7IRANlI3JL;9B4^D3V zY^c<|XQxSE8(FeVEgx#Rk;wsEh93O9s_`b@AR@D9+%Wffd#}Fp4y^+#hIl?<9@6j7 zC^MH~0F%%7_56(5ljm_g$0uI0EhkMehxH|n_X$(~8sJCkT5WZ;wpxqAm|vGkv-Te! CEmT+l literal 0 HcmV?d00001 diff --git a/injectCode.py b/injectCode.py new file mode 100644 index 0000000..3e7b70b --- /dev/null +++ b/injectCode.py @@ -0,0 +1,33 @@ +import pickle +import sys + + +def prediction(warzywo, nawoz ,srodek, stan_wzrostu): + filename = 'decisionTree.sav' + tree = pickle.load(open(filename, 'rb')) + val = (tree.predict([[warzywo, nawoz, srodek, stan_wzrostu]])) + save(val) + +def save(prediction): + pred = str(prediction) + plik = open('dec.txt', 'w') + plik.write(pred[1]) + plik.close() + +def decision(prediction): + if prediction == 0: + return "Nie_podejmuj_dzialania" + elif prediction == 1: + return "Zastosuj_nawoz" + elif prediction == 2: + return "Zastosuj_srodek" + elif prediction == 4: + return "Zbierz" + elif prediction == 5: + return "Roslina_juz_zgnila__zbierz_i_wyrzuc" + + + +if __name__ == '__main__': + # Map command line arguments to function arguments. + prediction(*sys.argv[1:]) \ No newline at end of file