Changeset 168
- Timestamp:
- 03/11/14 14:45:29 (11 years ago)
- Location:
- cpp/frams/genetics
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/genetics/f9/conv_f9.cpp
r157 r168 13 13 { 14 14 name = "Turtle3D-ortho encoding"; 15 in_format 15 in_format = '9'; 16 16 out_format = '0'; 17 17 mapsupport = 0; //would be easy and nice to add! … … 19 19 20 20 21 const char* turtle_commands_f9 = "LRDUBF";21 const char* turtle_commands_f9 = "LRDUBF"; 22 22 23 23 //const char* turtle_commandsX_f9="-+0000"; … … 31 31 Model m; 32 32 m.open(); 33 int recently_added =addSegment(m,vertices,current,0xDead);34 for (int i=0;i<in.len();i++)33 int recently_added = addSegment(m, vertices, current, 0xDead); 34 for (int i = 0; i < in.len(); i++) 35 35 { 36 char command =in[i];37 char *ptr =strchr((char*)turtle_commands_f9,command);36 char command = in[i]; 37 char *ptr = strchr((char*)turtle_commands_f9, command); 38 38 if (ptr) 39 39 { 40 int delta[] ={0,0,0};41 int pos =ptr-turtle_commands_f9;42 int axis =pos/2;43 int dir =pos%2;44 (*(delta +axis))+=dir*2-1; //+1 or -1 in the given axis40 int delta[] = { 0, 0, 0 }; 41 int pos = ptr - turtle_commands_f9; 42 int axis = pos / 2; 43 int dir = pos % 2; 44 (*(delta + axis)) += dir * 2 - 1; //+1 or -1 in the given axis 45 45 current.add(delta); 46 recently_added =addSegment(m,vertices,current,recently_added);46 recently_added = addSegment(m, vertices, current, recently_added); 47 47 } 48 48 } … … 57 57 } 58 58 59 int GenoConv_f90::addSegment(Model &m, vector<XYZ_LOC> &vertices,const XYZ_LOC &new_vertex,int recently_added)59 int GenoConv_f90::addSegment(Model &m, vector<XYZ_LOC> &vertices, const XYZ_LOC &new_vertex, int recently_added) 60 60 { 61 if (vertices.size() <1) //empty model?61 if (vertices.size() < 1) //empty model? 62 62 { 63 return addNewVertex(m,vertices,new_vertex); 64 } else 63 return addNewVertex(m, vertices, new_vertex); 64 } 65 else 65 66 { 66 int vertex_here =findVertexAt(vertices,new_vertex);67 if (vertex_here <0) //need to create a new Part67 int vertex_here = findVertexAt(vertices, new_vertex); 68 if (vertex_here < 0) //need to create a new Part 68 69 { 69 vertex_here =addNewVertex(m,vertices,new_vertex);70 vertex_here = addNewVertex(m, vertices, new_vertex); 70 71 } //else there already exists a Part in new_vertex; new Joint may or may not be needed 71 Part *p1 =m.getPart(recently_added);72 Part *p2 =m.getPart(vertex_here);73 if (m.findJoint(p1, p2)<0 && m.findJoint(p2,p1)<0) //new Joint needed? should always be true if we just created a new Part (vertex_here was <0)72 Part *p1 = m.getPart(recently_added); 73 Part *p2 = m.getPart(vertex_here); 74 if (m.findJoint(p1, p2) < 0 && m.findJoint(p2, p1) < 0) //new Joint needed? should always be true if we just created a new Part (vertex_here was <0) 74 75 { 75 m.addNewJoint(p1, p2);76 m.addNewJoint(p1, p2); 76 77 } 77 78 return vertex_here; … … 79 80 } 80 81 81 int GenoConv_f90::findVertexAt(vector<XYZ_LOC> &vertices, const XYZ_LOC &vertex)82 int GenoConv_f90::findVertexAt(vector<XYZ_LOC> &vertices, const XYZ_LOC &vertex) 82 83 { 83 for (int i=0;i<vertices.size();i++)84 for (int i = 0; i < vertices.size(); i++) 84 85 if (vertices[i].same_coordinates(vertex)) return i; 85 86 return -1; … … 87 88 88 89 89 int GenoConv_f90::addNewVertex(Model &m, vector<XYZ_LOC> &vertices,const XYZ_LOC &new_vertex)90 int GenoConv_f90::addNewVertex(Model &m, vector<XYZ_LOC> &vertices, const XYZ_LOC &new_vertex) 90 91 { 91 Part *p =new Part;92 p->p.x =new_vertex.x;93 p->p.y =new_vertex.y;94 p->p.z =new_vertex.z;92 Part *p = new Part; 93 p->p.x = new_vertex.x; 94 p->p.y = new_vertex.y; 95 p->p.z = new_vertex.z; 95 96 m.addPart(p); 96 97 97 98 vertices.push_back(new_vertex); 98 return vertices.size() -1;99 return vertices.size() - 1; 99 100 } 100 101 101 double mix(int *colortab, int maxind,double ind)102 double mix(int *colortab, int maxind, double ind) 102 103 { 103 int indpre =(int)ind;104 int indpost =indpre+1;105 if (indpost >maxind) indpost=maxind;106 int v1 =colortab[indpre];107 int v2 =colortab[indpost];108 double d1 =ind-indpre;109 double d2 =indpost-ind;110 double v =indpre==indpost?v1:d2*v1+d1*v2; //d1+d2==1104 int indpre = (int)ind; 105 int indpost = indpre + 1; 106 if (indpost > maxind) indpost = maxind; 107 int v1 = colortab[indpre]; 108 int v2 = colortab[indpost]; 109 double d1 = ind - indpre; 110 double d2 = indpost - ind; 111 double v = indpre == indpost ? v1 : d2*v1 + d1*v2; //d1+d2==1 111 112 return v; 112 113 } … … 115 116 { 116 117 //a rainbow on Joints: from the first one red, through middle green, to blue or violet - last 117 static int r[] ={1,1,0,0,0,1};118 static int g[] ={0,1,1,1,0,0};119 static int b[] ={0,0,0,1,1,1};120 int maxind =ARRAY_LENGTH(r)-1;118 static int r[] = { 1, 1, 0, 0, 0, 1 }; 119 static int g[] = { 0, 1, 1, 1, 0, 0 }; 120 static int b[] = { 0, 0, 0, 1, 1, 1 }; 121 int maxind = ARRAY_LENGTH(r) - 1; 121 122 122 int joints_count =m.getJointCount();123 for (int i=0;i<joints_count;i++)123 int joints_count = m.getJointCount(); 124 for (int i = 0; i < joints_count; i++) 124 125 { 125 Joint *j =m.getJoint(i);126 double x =joints_count<2?0:(double)i/(joints_count-1); //0..1, postion in the rainbow127 double ind =x*maxind;128 j->vcolor.x =mix(r,maxind,ind);129 j->vcolor.y =mix(g,maxind,ind);130 j->vcolor.z =mix(b,maxind,ind);126 Joint *j = m.getJoint(i); 127 double x = joints_count < 2 ? 0 : (double)i / (joints_count - 1); //0..1, postion in the rainbow 128 double ind = x*maxind; 129 j->vcolor.x = mix(r, maxind, ind); 130 j->vcolor.y = mix(g, maxind, ind); 131 j->vcolor.z = mix(b, maxind, ind); 131 132 } 132 133 133 int parts_count =m.getPartCount();134 int parts_count = m.getPartCount(); 134 135 SList jlist; 135 for (int i=0;i<parts_count;i++)136 for (int i = 0; i<parts_count; i++) 136 137 { 137 Part *p =m.getPart(i);138 Part *p = m.getPart(i); 138 139 jlist.clear(); 139 int count =m.findJoints(jlist,p);140 Pt3D averagecolor(0, 0,0); //Parts will get averaged colors from all attached Joints141 FOREACH(Joint*, j,jlist)142 averagecolor +=j->vcolor;143 if (count>5) count=5; //avoid too fat...144 p->vsize=0.3+count/15.0; //the more Joints is attached to a Part, the fatter it is145 p->v color=averagecolor/count;140 int count = m.findJoints(jlist, p); 141 Pt3D averagecolor(0, 0, 0); //Parts will get averaged colors from all attached Joints 142 FOREACH(Joint*, j, jlist) 143 averagecolor += j->vcolor; 144 p->vcolor = averagecolor / count; 145 if (count>5) count = 5; //avoid too fat... 146 p->vsize = 0.3 + count / 15.0; //the more Joints is attached to a Part, the fatter it is 146 147 } 147 148 } … … 149 150 void GenoConv_f90::perturbPartLocations(Model &m) //deterministic "body noise", see APPLY_DETERMINISTIC_BODY_NOISE 150 151 { 151 for (int i=0;i<m.getPartCount();i++)152 for (int i = 0; i < m.getPartCount(); i++) 152 153 { 153 Part *p =m.getPart(i);154 Part *p = m.getPart(i); 154 155 Pt3D noise( 155 ((i +1) %10)-4.5,156 ((3 *i+5)%10)-4.5,157 ((7 *i+2)%10)-4.5156 ((i + 1) % 10) - 4.5, 157 ((3 * i + 5) % 10) - 4.5, 158 ((7 * i + 2) % 10) - 4.5 158 159 ); //-4.5 .. 4.5 in each axis 159 p->p +=noise/1000;160 p->p += noise / 1000; 160 161 } 161 162 } -
cpp/frams/genetics/f9/oper_f9.cpp
r145 r168 9 9 10 10 #define FIELDSTRUCT GenoOper_f9 11 static ParamEntry GENOf9param_tab[] =11 static ParamEntry GENOf9param_tab[] = 12 12 { 13 { "Genetics: f9",1,1,},14 { "f9_mut",0,0,"Mutation probability","f 0 1 0.1",FIELD(mut_prob),"How many genes should be mutated during single mutation (1=all genes, 0.1=ten percent)",},15 { 0,},13 { "Genetics: f9", 1, 1, }, 14 { "f9_mut", 0, 0, "Mutation probability", "f 0 1 0.1", FIELD(mut_prob), "How many genes should be mutated during single mutation (1=all genes, 0.1=ten percent)", }, 15 { 0, }, 16 16 }; 17 17 #undef FIELDSTRUCT … … 23 23 par.select(this); 24 24 par.setDefault(); 25 supported_format ='9';25 supported_format = '9'; 26 26 } 27 27 … … 29 29 { 30 30 if (!gene[0]) return 1; //empty is not valid 31 bool ok =true;31 bool ok = true; 32 32 int i; 33 for (i=0;i<strlen(gene);i++) if (!strchr(turtle_commands_f9,gene[i])) {ok=false; break;}34 return ok ? GENOPER_OK : i +1;33 for (i = 0; i < strlen(gene); i++) if (!strchr(turtle_commands_f9, gene[i])) { ok = false; break; } 34 return ok ? GENOPER_OK : i + 1; 35 35 } 36 36 … … 39 39 { 40 40 SString validated; //new genotype (everything except turtle_commands_f9 is skipped) 41 for (int i=0;i<strlen(gene);i++)42 if (strchr(turtle_commands_f9, gene[i])) validated+=gene[i]; //validated contains only turtle_commands_f941 for (int i = 0; i < strlen(gene); i++) 42 if (strchr(turtle_commands_f9, gene[i])) validated += gene[i]; //validated contains only turtle_commands_f9 43 43 free(gene); 44 gene =strdup(validated); //reallocate44 gene = strdup(validated); //reallocate 45 45 return GENOPER_OK; 46 46 } 47 47 48 48 ///Very simple mutation 49 int GenoOper_f9::mutate(char *&gene, float &chg,int &method)49 int GenoOper_f9::mutate(char *&gene, float &chg, int &method) 50 50 { 51 method =0;52 int changes =0,len=strlen(gene);53 int symbols =strlen(turtle_commands_f9);51 method = 0; 52 int changes = 0, len = strlen(gene); 53 int symbols = strlen(turtle_commands_f9); 54 54 55 for (int i=0;i<len;i++)55 for (int i = 0; i < len; i++) 56 56 { 57 if (rnd01 <mut_prob) //normalize prob with the length of the genotype57 if (rnd01 < mut_prob) //normalize prob with the length of the genotype 58 58 { 59 char oldgene =gene[i];60 gene[i] =turtle_commands_f9[randomN(symbols)];61 if (gene[i] !=oldgene) changes++;59 char oldgene = gene[i]; 60 gene[i] = turtle_commands_f9[randomN(symbols)]; 61 if (gene[i] != oldgene) changes++; 62 62 } 63 63 } 64 64 65 if (rnd01 <mut_prob) //add or delete a random char65 if (rnd01 < mut_prob) //add or delete a random char 66 66 { 67 67 SString newgeno(gene); 68 if (randomN(2) ==0) //add68 if (randomN(2) == 0) //add 69 69 { 70 int symbols =strlen(turtle_commands_f9);71 int p =randomN(len+1); //random location70 int symbols = strlen(turtle_commands_f9); 71 int p = randomN(len + 1); //random location 72 72 //printf("before add: %s\n",(const char*)newgeno); 73 newgeno =newgeno.substr(0,p)+SString(turtle_commands_f9+randomN(symbols),1)+newgeno.substr(p);73 newgeno = newgeno.substr(0, p) + SString(turtle_commands_f9 + randomN(symbols), 1) + newgeno.substr(p); 74 74 //printf("after add: %s\n",(const char*)newgeno); 75 75 changes++; 76 } else if (len>1) //delete 76 } 77 else if (len > 1) //delete 77 78 { 78 int p =randomN(len); //random location79 int p = randomN(len); //random location 79 80 //printf("before delete: %s\n",(const char*)newgeno); 80 newgeno =newgeno.substr(0,p)+newgeno.substr(p+1);81 newgeno = newgeno.substr(0, p) + newgeno.substr(p + 1); 81 82 //printf("after delete: %s\n",(const char*)newgeno); 82 83 changes++; 83 84 } 84 85 free(gene); 85 gene =strdup(newgeno); //reallocate86 gene = strdup(newgeno); //reallocate 86 87 } 87 88 88 chg =(float)changes/len;89 return changes >0?GENOPER_OK:GENOPER_OPFAIL; //no changes => OPFAIL so that genman will call mutate again89 chg = (float)changes / len; 90 return changes > 0 ? GENOPER_OK : GENOPER_OPFAIL; //no changes => OPFAIL so that GenMan will call mutate again 90 91 } 91 92 92 93 ///A simple one-point crossover 93 int GenoOper_f9::crossOver(char *&g1, char *&g2,float& chg1,float& chg2)94 int GenoOper_f9::crossOver(char *&g1, char *&g2, float& chg1, float& chg2) 94 95 { 95 int len1 =strlen(g1),len2=strlen(g2);96 int p1 =randomN(len1); //random cut point for first genotype97 int p2 =randomN(len2); //random cut point for second genotype98 char *child1 =(char*)malloc(p1+len2-p2+1);99 char *child2 =(char*)malloc(p2+len1-p1+1);100 strncpy(child1, g1,p1); strcpy(child1+p1,g2+p2);101 strncpy(child2, g2,p2); strcpy(child2+p2,g1+p1);102 free(g1); g1 =child1;103 free(g2); g2 =child2;104 chg1 =(float)p1/strlen(child1);105 chg2 =(float)p2/strlen(child2);96 int len1 = strlen(g1), len2 = strlen(g2); 97 int p1 = randomN(len1); //random cut point for first genotype 98 int p2 = randomN(len2); //random cut point for second genotype 99 char *child1 = (char*)malloc(p1 + len2 - p2 + 1); 100 char *child2 = (char*)malloc(p2 + len1 - p1 + 1); 101 strncpy(child1, g1, p1); strcpy(child1 + p1, g2 + p2); 102 strncpy(child2, g2, p2); strcpy(child2 + p2, g1 + p1); 103 free(g1); g1 = child1; 104 free(g2); g2 = child2; 105 chg1 = (float)p1 / strlen(child1); 106 chg2 = (float)p2 / strlen(child2); 106 107 return GENOPER_OK; 107 108 } … … 110 111 unsigned long GenoOper_f9::style(const char *g, int pos) 111 112 { 112 char ch =g[pos];113 unsigned long style =GENSTYLE_CS(0,GENSTYLE_INVALID); //default, should be changed below114 char *ptr =strchr((char*)turtle_commands_f9,ch);113 char ch = g[pos]; 114 unsigned long style = GENSTYLE_CS(0, GENSTYLE_INVALID); //default, should be changed below 115 char *ptr = strchr((char*)turtle_commands_f9, ch); 115 116 if (ptr) 116 117 { 117 int pos =ptr-turtle_commands_f9;118 int axis =pos/2;119 style =GENSTYLE_RGBS(axis==0?200:0,axis==1?200:0,axis==2?200:0,GENSTYLE_NONE);118 int pos = ptr - turtle_commands_f9; 119 int axis = pos / 2; 120 style = GENSTYLE_RGBS(axis == 0 ? 200 : 0, axis == 1 ? 200 : 0, axis == 2 ? 200 : 0, GENSTYLE_NONE); 120 121 } 121 122 return style; -
cpp/frams/genetics/genman.cpp
r145 r168 227 227 Geno GenMan::Validate(const Geno& geny) 228 228 { 229 char format =geny.getFormat();230 GenoOperators *gf =getOper_f(format);231 if (gf ==NULL)232 return Geno(SString::empty(), -1,SString::empty(),SString::sprintf("GENOPER_NOOPER: Validate(): don't know how to handle genetic format %c",format));233 char *g2 =strdup(geny.getGene()); //copy for validation234 int res =gf->validate(g2);235 SString sg2 =g2;229 char format = geny.getFormat(); 230 GenoOperators *gf = getOper_f(format); 231 if (gf == NULL) 232 return Geno(SString::empty(), -1, SString::empty(), SString::sprintf("GENOPER_NOOPER: Validate(): don't know how to handle genetic format %c", format)); 233 char *g2 = strdup(geny.getGene()); //copy for validation 234 int res = gf->validate(g2); 235 SString sg2 = g2; 236 236 free(g2); 237 if (res ==GENOPER_OK)238 return Geno(sg2, format,geny.getName(),geny.getComment());237 if (res == GENOPER_OK) 238 return Geno(sg2, format, geny.getName(), geny.getComment()); 239 239 else 240 return Geno(SString::empty(), -1,SString::empty(),SString::sprintf("GENOPER_NOOPER: validate() for format %c returned invalid value",format));240 return Geno(SString::empty(), -1, SString::empty(), SString::sprintf("GENOPER_NOOPER: validate() for format %c returned invalid value", format)); 241 241 } 242 242 … … 245 245 float chg; //how many changes 246 246 int method; //mutation method 247 char format =g.getFormat();248 GenoOperators *gf =getOper_f(format);249 if (gf ==NULL)250 return Geno(SString::empty(), -1,SString::empty(),SString::sprintf("GENOPER_NOOPER: Mutate(): don't know how to handle genetic format %c",format));251 Geno gv =g;252 bool canvalidate =true;253 if (testValidity(gv, canvalidate)>0 && canvalidate==false)254 return Geno("", -1,"","GENOPER_OPFAIL: Mutate(): cannot validate invalid source genotype");255 bool ok =false;256 int pcount =count;247 char format = g.getFormat(); 248 GenoOperators *gf = getOper_f(format); 249 if (gf == NULL) 250 return Geno(SString::empty(), -1, SString::empty(), SString::sprintf("GENOPER_NOOPER: Mutate(): don't know how to handle genetic format %c", format)); 251 Geno gv = g; 252 bool canvalidate = true; 253 if (testValidity(gv, canvalidate) > 0 && canvalidate == false) 254 return Geno("", -1, "", "GENOPER_OPFAIL: Mutate(): cannot validate invalid source genotype"); 255 bool ok = false; 256 int pcount = count; 257 257 while (!ok) 258 258 { 259 char *gn =strdup(gv.getGene()); //copy for mutation260 chg =0;261 if (gf->mutate(gn, chg,method)==GENOPER_OK)259 char *gn = strdup(gv.getGene()); //copy for mutation 260 chg = 0; 261 if (gf->mutate(gn, chg, method) == GENOPER_OK) 262 262 { 263 263 ErrorHandler eh(ErrorHandler::StoreFirstMessage); //mute testValidity() 264 Geno G(gn,gv.getFormat(),"",""); 265 canvalidate=true; 266 int res=testValidity(G,canvalidate); 267 if (res==GENOPER_OK && canvalidate==false) {valid_m++; ok=true;} else 268 if (res>0 && canvalidate==false) invalid_m++; else 269 {validated_m++; ok=true;} 270 if (ok) gv=G; 271 } else failed_m++; 264 Geno G(gn, gv.getFormat(), "", ""); 265 canvalidate = true; 266 int res = testValidity(G, canvalidate); 267 if (res == GENOPER_OK && canvalidate == false) { valid_m++; ok = true; } 268 else 269 if (res > 0 && canvalidate == false) invalid_m++; else 270 { 271 validated_m++; ok = true; 272 } 273 if (ok) gv = G; 274 } 275 else failed_m++; 272 276 free(gn); 273 277 count++; 274 if (!ok && (count -pcount>100))275 { 276 FMprintf("GenMan", "Mutate",2,"Tried 100x and failed: %s",(const char*)g.getGene());277 return Geno("", -1,"","GENOPER_OPFAIL: Mutate() tried 100x and failed");278 } 279 } 280 mutchg +=chg;281 if (history) saveLink((const char*)g.getGene(), (const char*)gv.getGene(),chg);278 if (!ok && (count - pcount > 100)) 279 { 280 FMprintf("GenMan", "Mutate", 2, "Tried 100x and failed: %s", (const char*)g.getGene()); 281 return Geno("", -1, "", "GENOPER_OPFAIL: Mutate() tried 100x and failed"); 282 } 283 } 284 mutchg += chg; 285 if (history) saveLink((const char*)g.getGene(), (const char*)gv.getGene(), chg); 282 286 SString mutinfo; 283 if (extmutinfo == 0) mutinfo = SString::sprintf("%.2f%% mutation of '%s'", 100*chg,(const char*)g.getName()); else287 if (extmutinfo == 0) mutinfo = SString::sprintf("%.2f%% mutation of '%s'", 100 * chg, (const char*)g.getName()); else 284 288 if (extmutinfo == 1) mutinfo = SString::sprintf("%.2f%% mutation(%d) of '%s'", 100 * chg, method, (const char*)g.getName()); else 285 289 mutinfo = SString::sprintf("%.2f%% mutation(%s) of '%s'", 100 * chg, gf->mutation_method_names ? gf->mutation_method_names[method] : "unspecified method name", (const char*)g.getName()); … … 320 324 { 321 325 char *gn; 322 if (g1n[0] && g2n[0]) if (randomN(2) == 0) g1n[0] = 0; else g2n[0] = 0; // we want only one326 if (g1n[0] && g2n[0]) if (randomN(2) == 0) g1n[0] = 0; else g2n[0] = 0; //both provided? we want only one 323 327 if (g1n[0]) { gn = g1n; chg = chg1; } 324 328 else { gn = g2n; chg = chg2; } … … 474 478 int ind = operformats.find(format); 475 479 if (ind == -1) return NULL; 476 int ktoryopformatu= seloper[ind];480 int which_oper_of_format = seloper[ind]; 477 481 for (unsigned int i = 0; i < oper_fx_list.size(); i++) 478 482 if (oper_fx_list[i]->supported_format == format) 479 if ( ktoryopformatu == 0) return oper_fx_list[i]; else ktoryopformatu--;483 if (which_oper_of_format == 0) return oper_fx_list[i]; else which_oper_of_format--; 480 484 return NULL; //should never happen 481 485 } -
cpp/frams/genetics/oper_fx.cpp
r158 r168 9 9 #include <frams/util/rndutil.h> 10 10 11 static double distrib_force[] = // for '!'12 { 13 3,// distribution 0 -__/ +114 0.001, 0.2,// "slow" neurons15 0.001, 1,16 11 static double distrib_force[] = // for '!' 12 { 13 3, // distribution 0 -__/ +1 14 0.001, 0.2, // "slow" neurons 15 0.001, 1, 16 1, 1, // "fast" neurons 17 17 }; 18 static double distrib_inertia[] = // for '='19 { 20 2,// distribution 0 |..- +121 0, 0,// "fast" neurons22 0.7, 0.98,18 static double distrib_inertia[] = // for '=' 19 { 20 2, // distribution 0 |..- +1 21 0, 0, // "fast" neurons 22 0.7, 0.98, 23 23 }; 24 static double distrib_sigmo[] = // for '/'25 { 26 5,// distribution -999 -..-^-..- +99927 -999, -999,//"perceptron"28 29 -5, -1,// nonlinear30 31 -1, 1,// ~linear24 static double distrib_sigmo[] = // for '/' 25 { 26 5, // distribution -999 -..-^-..- +999 27 -999, -999, //"perceptron" 28 999, 999, 29 -5, -1, // nonlinear 30 1, 5, 31 -1, 1, // ~linear 32 32 }; 33 33 34 34 35 int GenoOperators::roulette(const double *probtab, const int count)36 { 37 double sum=0;38 39 for (i=0;i<count;i++) sum+=probtab[i];40 double sel=rnd01*sum;41 for (sum=0,i=0;i<count;i++) {sum+=probtab[i]; if (sel<sum) return i;}42 43 } 44 45 bool GenoOperators::getMinMaxDef(ParamInterface *p, int i,double &mn,double &mx,double &def)46 { 47 mn=mx=def=0;48 int defined=0;49 if (p->type(i)[0]=='f')50 51 double _mn=0,_mx=1,_def=0.5;52 defined=p->getMinMax(i,_mn,_mx,_def);53 if (defined==1) _mx=_mn+1.0;54 if (_mx<_mn && defined==3) _mn=_mx=_def; //only default was defined, let's assume min=max=default55 if (defined<3) _def=(_mn+_mx)/2.0;56 mn=_mn; mx=_mx; def=_def;57 58 if (p->type(i)[0]=='d')59 60 long _mn=0,_mx=1,_def=0;61 defined=p->getMinMax(i,_mn,_mx,_def);62 if (defined==1) _mx=_mn+1;63 if (_mx<_mn && defined==3) _mn=_mx=_def; //only default was defined, let's assume min=max=default64 if (defined<3) _def=(_mn+_mx)/2;65 mn=_mn; mx=_mx; def=_def;66 67 return defined==3;35 int GenoOperators::roulette(const double *probtab, const int count) 36 { 37 double sum = 0; 38 int i; 39 for (i = 0; i < count; i++) sum += probtab[i]; 40 double sel = rnd01*sum; 41 for (sum = 0, i = 0; i < count; i++) { sum += probtab[i]; if (sel < sum) return i; } 42 return -1; 43 } 44 45 bool GenoOperators::getMinMaxDef(ParamInterface *p, int i, double &mn, double &mx, double &def) 46 { 47 mn = mx = def = 0; 48 int defined = 0; 49 if (p->type(i)[0] == 'f') 50 { 51 double _mn = 0, _mx = 1, _def = 0.5; 52 defined = p->getMinMax(i, _mn, _mx, _def); 53 if (defined == 1) _mx = _mn + 1.0; 54 if (_mx < _mn && defined == 3) _mn = _mx = _def; //only default was defined, let's assume min=max=default 55 if (defined < 3) _def = (_mn + _mx) / 2.0; 56 mn = _mn; mx = _mx; def = _def; 57 } 58 if (p->type(i)[0] == 'd') 59 { 60 long _mn = 0, _mx = 1, _def = 0; 61 defined = p->getMinMax(i, _mn, _mx, _def); 62 if (defined == 1) _mx = _mn + 1; 63 if (_mx < _mn && defined == 3) _mn = _mx = _def; //only default was defined, let's assume min=max=default 64 if (defined < 3) _def = (_mn + _mx) / 2; 65 mn = _mn; mx = _mx; def = _def; 66 } 67 return defined == 3; 68 68 } 69 69 70 70 int GenoOperators::selectRandomProperty(Neuro* n) 71 71 { 72 int neuext=n->extraProperties().getPropCount(),73 neucls=n->getClass()==NULL?0:n->getClass()->getProperties().getPropCount();74 if (neuext+neucls==0) return -1; //no properties in this neuron75 int index=randomN(neuext+neucls);76 if (index>=neuext) index=index-neuext+100;77 78 } 79 80 double GenoOperators::mutateNeuProperty(double current, Neuro *n,int i)81 { 82 if (i==-1) return mutateCreepNoLimit('f',current,-10,10); //i==-1: mutating weight of neural connection83 84 if (i>=100) {i-=100; p=n->getClass()->getProperties();}85 else p=n->extraProperties();86 double newval=current;87 /*bool ok=*/getMutatedProperty(p,i,current,newval);88 89 } 90 91 bool GenoOperators::mutatePropertyNaive(ParamInterface &p, int i)92 { 93 double mn,mx,df;94 if (p.type(i)[0]!='f' && p.type(i)[0]!='d') return false; //don't know how to mutate95 getMinMaxDef(&p,i,mn,mx,df);96 97 98 p.get(i,ev);99 ev.setDouble(mutateCreep(p.type(i)[0],ev.getDouble(),mn,mx));100 p.set(i,ev);101 102 } 103 104 bool GenoOperators::mutateProperty(ParamInterface &p, int i)105 { 106 107 108 p.get(i,ev);109 bool ok=getMutatedProperty(p,i,ev.getDouble(),newval);110 if (ok) {ev.setDouble(newval); p.set(i,ev);}111 112 } 113 114 bool GenoOperators::getMutatedProperty(ParamInterface &p, int i,double oldval,double &newval)115 { 116 newval=0;117 if (p.type(i)[0]!='f' && p.type(i)[0]!='d') return false; //don't know how to mutate118 const char *n=p.id(i),*na=p.name(i);119 if (strcmp(n,"si")==0 && strcmp(na,"Sigmoid")==0) newval=CustomRnd(distrib_sigmo); else120 if (strcmp(n,"in")==0 && strcmp(na,"Inertia")==0) newval=CustomRnd(distrib_inertia); else121 if (strcmp(n,"fo")==0 && strcmp(na,"Force")==0) newval=CustomRnd(distrib_force); else122 123 double mn,mx,df;124 getMinMaxDef(&p,i,mn,mx,df);125 newval=mutateCreep(p.type(i)[0],oldval,mn,mx);126 127 128 } 129 130 double GenoOperators::mutateCreepNoLimit(char type, double current,double mn,double mx)131 { 132 double result=RndGen.Gauss(current,(mx-mn)/2/5); // /halfinterval, 5 times narrower133 if (type=='d') {result=int(result+0.5); if (result==current) result+=randomN(2)*2-1;}134 else result=floor(result*1000+0.5)/1000.0; //round135 72 int neuext = n->extraProperties().getPropCount(), 73 neucls = n->getClass() == NULL ? 0 : n->getClass()->getProperties().getPropCount(); 74 if (neuext + neucls == 0) return -1; //no properties in this neuron 75 int index = randomN(neuext + neucls); 76 if (index >= neuext) index = index - neuext + 100; 77 return index; 78 } 79 80 double GenoOperators::mutateNeuProperty(double current, Neuro *n, int i) 81 { 82 if (i == -1) return mutateCreepNoLimit('f', current, -10, 10); //i==-1: mutating weight of neural connection 83 Param p; 84 if (i >= 100) { i -= 100; p = n->getClass()->getProperties(); } 85 else p = n->extraProperties(); 86 double newval = current; 87 /*bool ok=*/getMutatedProperty(p, i, current, newval); 88 return newval; 89 } 90 91 bool GenoOperators::mutatePropertyNaive(ParamInterface &p, int i) 92 { 93 double mn, mx, df; 94 if (p.type(i)[0] != 'f' && p.type(i)[0] != 'd') return false; //don't know how to mutate 95 getMinMaxDef(&p, i, mn, mx, df); 96 97 ExtValue ev; 98 p.get(i, ev); 99 ev.setDouble(mutateCreep(p.type(i)[0], ev.getDouble(), mn, mx)); 100 p.set(i, ev); 101 return true; 102 } 103 104 bool GenoOperators::mutateProperty(ParamInterface &p, int i) 105 { 106 double newval; 107 ExtValue ev; 108 p.get(i, ev); 109 bool ok = getMutatedProperty(p, i, ev.getDouble(), newval); 110 if (ok) { ev.setDouble(newval); p.set(i, ev); } 111 return ok; 112 } 113 114 bool GenoOperators::getMutatedProperty(ParamInterface &p, int i, double oldval, double &newval) 115 { 116 newval = 0; 117 if (p.type(i)[0] != 'f' && p.type(i)[0] != 'd') return false; //don't know how to mutate 118 const char *n = p.id(i), *na = p.name(i); 119 if (strcmp(n, "si") == 0 && strcmp(na, "Sigmoid") == 0) newval = CustomRnd(distrib_sigmo); else 120 if (strcmp(n, "in") == 0 && strcmp(na, "Inertia") == 0) newval = CustomRnd(distrib_inertia); else 121 if (strcmp(n, "fo") == 0 && strcmp(na, "Force") == 0) newval = CustomRnd(distrib_force); else 122 { 123 double mn, mx, df; 124 getMinMaxDef(&p, i, mn, mx, df); 125 newval = mutateCreep(p.type(i)[0], oldval, mn, mx); 126 } 127 return true; 128 } 129 130 double GenoOperators::mutateCreepNoLimit(char type, double current, double mn, double mx) 131 { 132 double result = RndGen.Gauss(current, (mx - mn) / 2 / 5); // /halfinterval, 5 times narrower 133 if (type == 'd') { result = int(result + 0.5); if (result == current) result += randomN(2) * 2 - 1; } 134 else result = floor(result * 1000 + 0.5) / 1000.0; //round 135 return result; 136 136 } 137 137 … … 180 180 { 181 181 SListTempl<NeuroClass*> active; 182 for(int i=0;i<Neuro::getClassCount();i++)183 if (Neuro::getClass(i)->genactive) active+=Neuro::getClass(i);184 if (!active==0) return NULL; else return active(randomN(!active));182 for (int i = 0; i < Neuro::getClassCount(); i++) 183 if (Neuro::getClass(i)->genactive) active += Neuro::getClass(i); 184 if (!active == 0) return NULL; else return active(randomN(!active)); 185 185 } 186 186 187 187 NeuroClass* GenoOperators::parseNeuroClass(char*& s) 188 188 { 189 int len=strlen(s);190 int Len=0;191 NeuroClass *I=NULL;192 for(int i=0;i<Neuro::getClassCount();i++)193 194 const char *n=Neuro::getClass(i)->name;195 int l=strlen(n);196 if (len>=l && l>Len && (strncmp(s,n,l)==0)) {I=Neuro::getClass(i); Len=l;}197 198 s+=Len;199 200 } 201 202 Neuro* GenoOperators::findNeuro(const Model *m, const NeuroClass *nc)203 { 204 205 for(int i=0;i<m->getNeuroCount();i++)206 if (m->getNeuro(i)->getClass()==nc) return m->getNeuro(i);207 208 } 209 210 int GenoOperators::neuroClassProp(char*& s, NeuroClass *nc,bool also_v1_N_props)211 { 212 int len=strlen(s);213 int Len=0,I=-1;214 215 216 Param p=nc->getProperties();217 for(int i=0;i<p.getPropCount();i++)218 219 const char *n=p.id(i);220 int l=strlen(n);221 if (len>=l && l>Len && (strncmp(s,n,l)==0)) {I=100+i; Len=l;}222 223 224 if (strcmp(n,"si")==0) n="/"; else225 if (strcmp(n,"in")==0) n="="; else226 if (strcmp(n,"fo")==0) n="!";227 l=strlen(n);228 if (len>=l && l>Len && (strncmp(s,n,l)==0)) {I=100+i; Len=l;}229 230 231 232 233 Param p=n.extraProperties();234 for(int i=0;i<p.getPropCount();i++)235 236 const char *n=p.id(i);237 int l=strlen(n);238 if (len>=l && l>Len && (strncmp(s,n,l)==0)) {I=i; Len=l;}239 240 s+=Len;241 189 int len = strlen(s); 190 int Len = 0; 191 NeuroClass *I = NULL; 192 for (int i = 0; i<Neuro::getClassCount(); i++) 193 { 194 const char *n = Neuro::getClass(i)->name; 195 int l = strlen(n); 196 if (len >= l && l>Len && (strncmp(s, n, l) == 0)) { I = Neuro::getClass(i); Len = l; } 197 } 198 s += Len; 199 return I; 200 } 201 202 Neuro* GenoOperators::findNeuro(const Model *m, const NeuroClass *nc) 203 { 204 if (!m) return NULL; 205 for (int i = 0; i < m->getNeuroCount(); i++) 206 if (m->getNeuro(i)->getClass() == nc) return m->getNeuro(i); 207 return NULL; //neuron of class 'nc' was not found 208 } 209 210 int GenoOperators::neuroClassProp(char*& s, NeuroClass *nc, bool also_v1_N_props) 211 { 212 int len = strlen(s); 213 int Len = 0, I = -1; 214 if (nc) 215 { 216 Param p = nc->getProperties(); 217 for (int i = 0; i<p.getPropCount(); i++) 218 { 219 const char *n = p.id(i); 220 int l = strlen(n); 221 if (len >= l && l>Len && (strncmp(s, n, l) == 0)) { I = 100 + i; Len = l; } 222 if (also_v1_N_props) //recognize old properties symbols /=! 223 { 224 if (strcmp(n, "si") == 0) n = "/"; else 225 if (strcmp(n, "in") == 0) n = "="; else 226 if (strcmp(n, "fo") == 0) n = "!"; 227 l = strlen(n); 228 if (len >= l && l > Len && (strncmp(s, n, l) == 0)) { I = 100 + i; Len = l; } 229 } 230 } 231 } 232 Neuro n; 233 Param p = n.extraProperties(); 234 for (int i = 0; i<p.getPropCount(); i++) 235 { 236 const char *n = p.id(i); 237 int l = strlen(n); 238 if (len >= l && l>Len && (strncmp(s, n, l) == 0)) { I = i; Len = l; } 239 } 240 s += Len; 241 return I; 242 242 } 243 243 244 244 bool GenoOperators::isWS(const char c) 245 {return c==' ' || c=='\n' || c=='\t' || c=='\r';} 245 { 246 return c == ' ' || c == '\n' || c == '\t' || c == '\r'; 247 } 246 248 247 249 void GenoOperators::skipWS(char *&s) 248 250 { 249 if (s ==NULL)251 if (s == NULL) 250 252 FramMessage("GenoOperators", "skipWS", "NULL reference!", FMLV_WARN); 251 253 else … … 253 255 } 254 256 255 bool GenoOperators::areAlike(char *g1, char *g2)257 bool GenoOperators::areAlike(char *g1, char *g2) 256 258 { 257 259 while (*g1 || *g2) … … 260 262 skipWS(g2); 261 263 if (*g1 != *g2) return false; //when difference 262 263 264 264 if (!*g1 && !*g2) break; //both end 265 g1++; 266 g2++; 265 267 } 266 268 return true; //equal 267 269 } 268 270 269 char* GenoOperators::strchrn0(const char *str,char ch) 270 { return ch==0?NULL:strchr((char*)str,ch); } 271 char* GenoOperators::strchrn0(const char *str, char ch) 272 { 273 return ch == 0 ? NULL : strchr((char*)str, ch); 274 } 271 275 272 276 bool GenoOperators::isNeuroClassName(const char firstchar) 273 277 { 274 return isupper(firstchar) || firstchar=='|' || firstchar=='@' || firstchar=='*';275 } 276 278 return isupper(firstchar) || firstchar == '|' || firstchar == '@' || firstchar == '*'; 279 } 280
Note: See TracChangeset
for help on using the changeset viewer.