Projet Tondeuse

Faut s'organiser, on n'a que peu de temps : si nous développons les même programmes chacun de notre côté, on risque de ne pas ariver à tout finir.

Suite à la discussion avec M. Collet au sujet des mouvement en diagonal, abandonnons ces mouvements, qui peuvent encore se produire si les actions droit, bas, droit, bas (par exemple) cycle dans un état : il n'y aura plus que 40 actions pour un état, cinq mouvement précédents possbiles [(-1,0),(0,-1),(0,0),(1,0),(0,1)] fois les huit possibilités arbre * périmètre * herbe.

S'il n'y a plus que 40 actions par état, un automate comportera 280 actions pour sept états : SIZE=280.

Quel morceau Exemple Principe Qui Quand
GenomeClass {float x[SIZE];
float sigma[SIZE];}
{ int actions[SIZE][3];} avec SIZE un multiple du nombre de signaux. Ou fait-on plus compliqué, avec des blocs?
::initialiser Genome.x[i]=(float)random(_,_) alea = random(_,_);
if (alea < 0.2) {Genome.actions[i][0]=0;Genome.actions[1]=-1;}
else if alea>=0.2 & alea < 0.4 Genome.actions[i][0]=-1;Genome.actions[i][1]=0;
else if (alea >=0.4 & alea < 0.6) {Genome.actions[i][0]=0;Genome.actions[i][1]=0;}
else if (alea >=0.6 & alea < 0.8) {Genome.actions[i][0]=1;Genome.actions[i][1]=0;}
else if (alea >=0.8) {Genome.actions[i][0]=0;Genome.actions[i][1]=1;}
mais on peut réduire ou éliminer la chance de (0,0). Calcul similaire pour actions[i][2], le nombre de décalages à effectuer pour arriver dans l'état suivant (peut être 0), loi de proba à étudier?
::crossover : child.x[i] = alpha*parent1.x[i]+(1-alpha)*parent2.x[i]; alea=random(); if alea < 0.5 {child.actions[i][0] = parent1.actions[i][0];child.actions[i][1] = parent1.actions[i][1];child.actions[i][2] = parent1.actions[i][2];} else {child.actions[i][0] = parent2.actions[i][0];child.actions[i][1] = parent2.actions[i][1];child.actions[i][2] = parent2.actions[i][2];}.
::mutator compliqué. même chose que dans initialiser?
::evaluator score=rosenbruck(Genome.x); return score; score = casesTondues(Genome.actions, scenarios); return score;
Ceci suppose avoir préparé scenarios dans \before everything else, et scenarios est une liste de trois (ou cinq) liste de 21 pixels, les vingt premiers signifiant les arbre et le 21ième le point de départ pour la tondeuse, ces indiquant le coin à plus faibles indices du carré 10*10.
maurice
tests et finalisation (débogage) diane?? :?:
16/05
:?:
\before everything else scenarateur() qui calcule les emplacements, et enregistre les “jardins” dans un fichier. diane
\at the end of each generation remplaceScenario() qui remplace un des scenarii avec un noouveau (et log le changement dans un fichier)
selection operator : Tournament ? Tournament: 2; demandons à Frédéric comment on spécifie, si ce n'est pas claire dans l'exemple.

Calcul des Scénarios et Fitness

caseTondues

Dans un premier temps, faisons simple, sans affichage d'une image.

Le plus simple me parait d'utiliser une tableau map (int ou short) des dimensions données, initialiser à 0. Lire le scénario, placer les arbres en mettant (un cadre 10 x 10) map[x][y]=2. Ensuite, on met des 1 là ou passe la tondeuse. A la fin, on compte les 1, et traite un autre scénario, jusqu'à plus de scénarios. On renvoye la somme des casesTondues dans la liste des scénarios.

Bon, c'est écrit, globalement. casesTondues.cpp – pourquoi ai-je oublié un s à case?

genJardin()

Le générateur de scénarios. Un scénario sera un int[21][2] par exemple, pour contenir les x et y des coins des arbres et coin de la tondeuse au départ.

* based on : rand example: guess the number * from Lien externe

Le code (qui compile et semble marcher) est maintenant dans une page avec le main qui l'utilise (pour des tests).

Il débute ainsi :

 #include <stdio.h>
 #include <stdlib.h>
 #include <iostream>
 #define MAXOBJECTS 50
 #include <time.h>
 #include <vector>
 
 using namespace std;
 
 
 std::vector<std::vector <int> > genJardin (int combien, int largJardin, int hautJardin, int coteObjet)
 {

et finit ainsi :

   return scenario;
 }

 
mower/project_track.txt · Dernière modification: 2010/05/16 10:28 par suitable