123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- /*
- Copyright (C) 2011 Weber Yann, Schuck Clement
-
- This file is part of Tansive.
-
- Tansive is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Tansive is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Tansive. If not, see <http://www.gnu.org/licenses/>.
- */
- #include"genome.h"
-
- t_genome rand_genome()
- {
- t_genome genome;
-
- genome.name = rand_name();
- genome.nb_creat=0;
- genome.nb_nat_dead=0;
- genome.nb_star_dead=0;
- genome.nb_figt_dead=0;
- genome.nb_eat_dead=0;
-
- genome.weight = rand()%(GNOME_MAX_WEIGHT-GNOME_MIN_WEIGHT)+GNOME_MIN_WEIGHT;
- genome.strenght = rand()%GNOME_MAX_STRENGHT+1;
- genome.life = rand()%(GNOME_MAX_LIFE-GNOME_MIN_LIFE)+GNOME_MIN_LIFE;
- genome.speed = rand()%(GNOME_MAX_SPEED-GNOME_MIN_SPEED)+GNOME_MIN_SPEED;
- genome.reprofreq = rand()%(GNOME_MAX_REPROFREQ-GNOME_MIN_REPROFREQ)+GNOME_MIN_REPROFREQ;
- genome.aggression = rand()%GNOME_MAX_AGGRESSION+1;
- genome.perception = rand()%GNOME_MAX_PERCEP;
- genome.lifetime = rand()%(GNOME_MAX_LIFETIME-GNOME_MIN_LIFETIME)+GNOME_MIN_LIFETIME;
- genome.food = rand()%4;
- genome.energy = rand()%GNOME_MAX_ENERGY+1;
- genome.nbchild = rand()%(GNOME_MAX_NBCHILD-GNOME_MIN_NBCHILD)+GNOME_MIN_NBCHILD;
-
-
- genome.mem_capabilities = rand()%8;
- genome.mem_type = rand()%3;
- genome.mem_size = rand()%GNOME_MAX_MEM_SIZE;
-
- return genome;
- }
-
- t_tree_genome* create_new_gnometree_node(t_genome gnome)
- {
- t_tree_genome *res = malloc(sizeof(t_tree_genome));
-
- if(res == NULL)
- {
- fprintf(stderr, "Error while allocating memory\n");
- exit(-1);
- }
-
- res->child = malloc(sizeof(t_tree_genome*));
-
- if(res->child == NULL)
- {
- fprintf(stderr, "Error while allocating memory\n");
- exit(-1);
- }
-
- res->child[0] = NULL;
- res->parent = NULL;
- res->gnome = gnome;
- res->nb_child = 0;
-
- return res;
- }
-
- t_tree_genome* add_child_treegnome(t_tree_genome* t, t_tree_genome* child)
- {
- /*t_tree_genome **sav_child = t->child;
- int i;
-
-
- t->child = malloc(sizeof(t_tree_genome*)*(t->nb_child+1));
-
- if(t->child == NULL)
- {
- fprintf(stderr, "Error while allocating memory\n");
- exit(-1);
- }
-
- for(i=0;i<t->nb_child;i++)
- t->child[i] = sav_child[i];*/
-
- t->child = realloc(t->child, sizeof(t_tree_genome*)*(t->nb_child+1));
-
- if(t->child == NULL)
- {
- fprintf(stderr, "Error while allocating memory\n");
- exit(-1);
- }
-
- //t->child[i] = child;
- t->child[t->nb_child] = child;
- child->parent = t;
-
- //free(sav_child);
-
- t->nb_child++;
-
- return child;
- }
-
- t_tree_genome* del_node_treegnome(t_tree_genome* t)
- {
- if(t->nb_child >0)
- return t;
-
- if(t->parent == NULL)
- {
- free(t);
- return NULL;
- }
- else
- {
- t_tree_genome *parent = t->parent;
- t_tree_genome **sav_child = parent->child;
- parent->child = malloc(sizeof(t_tree_genome*)*(parent->nb_child-1));
- int i,j=0;
- for(i=0;i<parent->nb_child;i++)
- {
- if(sav_child[i] == t)
- {
- free(t->child);
- free(t);
- }
- else
- {
- parent->child[j] = sav_child[i];
- j++;
- }
- }
-
- free(sav_child);
- parent->nb_child--;
- return parent;
- }
- }
-
- char calc_proba(int proba)
- {
- return !(rand()%proba);
- }
-
- t_genome mutation(t_genome orig)
- {
- t_genome genome = orig;
- int i=0;
-
- genome.name = rand_name();
- genome.nb_creat=0;
- genome.nb_nat_dead=0;
- genome.nb_star_dead=0;
- genome.nb_figt_dead=0;
- genome.nb_eat_dead=0;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.weight = (genome.weight += (rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%(GNOME_MAX_WEIGHT-GNOME_MIN_WEIGHT)+GNOME_MIN_WEIGHT);
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.strenght = (genome.strenght += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%GNOME_MAX_STRENGHT+1;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.life = (genome.life += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%(GNOME_MAX_LIFE-GNOME_MIN_LIFE)+GNOME_MIN_LIFE;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.speed = (genome.speed += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%(GNOME_MAX_SPEED-GNOME_MIN_SPEED)+GNOME_MIN_SPEED;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.reprofreq = (genome.reprofreq += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%(GNOME_MAX_REPROFREQ-GNOME_MIN_REPROFREQ)+GNOME_MIN_REPROFREQ;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.aggression = (genome.aggression += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%GNOME_MAX_AGGRESSION+1;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.perception = (genome.perception += rand()%(5-1)+1*(rand()%2?-1:1))%GNOME_MAX_PERCEP;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.lifetime = (genome.lifetime += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%(GNOME_MAX_LIFETIME-GNOME_MIN_LIFETIME)+GNOME_MIN_LIFETIME;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.energy = (genome.energy += rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%GNOME_MAX_ENERGY+1;
-
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.food = (genome.food += (rand()%2*(rand()%2?-1:1)))%4;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.nbchild = (genome.nbchild += (rand()%3*(rand()%2?-1:1))%(GNOME_MAX_NBCHILD-GNOME_MIN_NBCHILD))+GNOME_MIN_NBCHILD;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.mem_capabilities = (genome.mem_capabilities += rand()%2*(rand()%2?-1:1))%8;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.mem_type = (genome.mem_type += rand()%2*(rand()%2?-1:1))%3;
-
- if(calc_proba(GNOME_MUTATION_GNOM_MODIF))
- genome.mem_size = (genome.mem_size = rand()%(GNOME_MUTATION_MAX-GNOME_MUTATION_MIN)+GNOME_MUTATION_MIN*(rand()%2?-1:1))%GNOME_MAX_MEM_SIZE;
-
- return genome;
- }
-
- char rand_char(char type)
- {
- char res = rand()%('z'-'a')+'a';
-
- while(1)
- {
- if(res == 'a' || res == 'e' || res == 'i' || res == 'o' || res == 'u' || res == 'y')
- {
- if(type == 0)
- return res;
- }
- else
- {
- if(type == 1)
- return res;
- }
- res = rand()%('z'-'a')+'a';
- }
- }
-
- char* rand_name()
- {
- int max = rand()%(GNOME_MAX_NAMESIZE-GNOME_MIN_NAMESIZE)+GNOME_MIN_NAMESIZE, type = rand()%2,i;
- char *res = malloc(sizeof(char)*(max+1));
-
- for(i=0;i<max;i++)
- {
- res[i] = rand_char(type);
- type = (++type)%2;
- }
- res[i] = '\0';
-
- return res;
- }
-
- void disp_genome_tree_info(t_tree_genome* t, char eq_zero)
- {
- unsigned long nb_node = 1;
- t_tree_genome **visit = (t_tree_genome**)malloc(sizeof(t_tree_genome*)*nb_node), **tmp;
- #ifdef DEBUG
- if(!visit)
- {
- fprintf(stderr,"Error in malloc\n");
- exit(-1);
- }
- #endif
- visit[0] = t;
-
- unsigned long cur = 0;
- unsigned long i = 0;
-
- do
- {
- if(visit[cur]->gnome.nb_creat>eq_zero)
- printf("Gnome : %s | nb_creat : %d | deads : natural = %d, starved = %d, fight = %d, eat = %d\n", visit[cur]->gnome.name, visit[cur]->gnome.nb_creat, visit[cur]->gnome.nb_nat_dead, visit[cur]->gnome.nb_star_dead, visit[cur]->gnome.nb_figt_dead, visit[cur]->gnome.nb_eat_dead);
-
- if(visit[cur]->nb_child>0)
- {
- //tmp = visit;
- visit = realloc(visit,sizeof(t_tree_genome*)*(nb_node+visit[cur]->nb_child));
- if(!visit)
- {
- fprintf(stderr,"Error in realloc\n");
- exit(-1);
- }
- /*for(i=0;i<nb_node;i++)
- visit[i] = tmp[i];*/
- //free(tmp);
- for(i=nb_node;i<nb_node+visit[cur]->nb_child;i++)
- {
- visit[i] = visit[cur]->child[i-nb_node];
- }
-
- nb_node += visit[cur]->nb_child;
- }
- cur++;
-
- }while(cur<nb_node-1);
- }
-
- void clean_treegnome(t_tree_genome* t)
- {
- int nb_node = 1;
- t_tree_genome **visit = (t_tree_genome**)malloc(sizeof(t_tree_genome*)*nb_node), **tmp;
- visit[0] = t;
-
- int cur = 0;
- t_tree_genome *cur_node = t, *prev = NULL;
- int i = 0;
-
- do
- {
- if(visit[cur]->nb_child>0)
- {
- //tmp = visit;
- visit = realloc(visit, sizeof(t_tree_genome*)*(nb_node+visit[cur]->nb_child));
- if(!visit)
- {
- fprintf(stderr,"Error in realloc\n");
- exit(-1);
- }
- /*for(i=0;i<nb_node;i++)
- visit[i] = tmp[i];*/
- //free(tmp);
- for(i=nb_node;i<nb_node+visit[cur]->nb_child;i++)
- {
- visit[i] = visit[cur]->child[i-nb_node];
- }
-
- nb_node += visit[cur]->nb_child;
- }
- else if(visit[cur]->gnome.nb_creat<=0 && visit[cur] != t)
- {
- #ifndef DEBUG
- if(visit[cur] != t)
- del_node_treegnome(visit[cur]);
- #endif
- #ifdef DEBUG
- if(!del_node_treegnome(visit[cur]))
- {
- fprintf(stderr, "Bug del treegnome\n");
- exit(-1);
- }
- #endif
- }
- cur++;
-
- }while(cur<nb_node-1);
- }
-
- void write_graphviz_genome_tree(FILE* file, t_tree_genome* t)
- {
- fprintf(file, "digraph G {\n");
-
- int nb_node = 1;
- t_tree_genome **visit = (t_tree_genome**)malloc(sizeof(t_tree_genome*)*nb_node), **tmp;
- visit[0] = t;
-
- int cur = 0;
- t_tree_genome *cur_node = t, *prev = NULL;
- int i = 0;
-
- do
- {
- if(visit[cur]->nb_child>0)
- {
- //tmp = visit;
- visit = realloc(visit, sizeof(t_tree_genome*)*(nb_node+visit[cur]->nb_child));
- /*for(i=0;i<nb_node;i++)
- visit[i] = tmp[i];
- free(tmp);*/
- for(i=nb_node;i<nb_node+visit[cur]->nb_child;i++)
- {
- visit[i] = visit[cur]->child[i-nb_node];
- if(visit[i]->nb_child>0)
- {
- fprintf(file, "\t\"%s(%d)\" [fontcolor=%s];\n",visit[cur]->gnome.name,visit[cur]->gnome.nb_creat,(visit[cur]->gnome.food & GNOME_VEGAN?(visit[cur]->gnome.food & GNOME_CARNI?"purple":"green"):"red"));
- fprintf(file, "\t\"%s(%d)\" [fontcolor=%s];\n",visit[cur]->child[i-nb_node]->gnome.name,visit[cur]->child[i-nb_node]->gnome.nb_creat,(visit[cur]->child[i-nb_node]->gnome.food & GNOME_VEGAN?(visit[cur]->child[i-nb_node]->gnome.food & GNOME_CARNI?"purple":"green"):"red"));
- fprintf(file, "\t\"%s(%d)\" -> \"%s(%d)\"\n", visit[cur]->gnome.name,visit[cur]->gnome.nb_creat, visit[cur]->child[i-nb_node]->gnome.name,visit[cur]->child[i-nb_node]->gnome.nb_creat);
- }
- }
-
- nb_node += visit[cur]->nb_child;
- }
- cur++;
-
- }while(cur<nb_node-1);
-
- fprintf(file, "}\n");
- }
|