public double fit(Explorer ex) { //zakladni fitness funkce int[,] tmap = new int[33, 34]; Array.Copy(map, tmap, 33 * 34); int nkr = kroku;//citac poctu kroku double i = 0; fitc(ex, 0);//orez hlubokyc vetvi ex = ex.ToRoot(); lastnam = 0; Mravenec mr = new Mravenec(2, 2, 1); //smicka behu programu while (true) { if (nkr <= 0) { break; } i += fitt(ex, mr, tmap, ref nkr); //pripocti fitness ex = ex.ToRoot(); //ziskej koren stromu } return(90 - i - (lastnam + 5) / 8000f /*- ex.Chro.WebLen(0)/1250*/); }
public double fitt(Explorer ex, Mravenec mr, int[,] tmap, ref int nkr) { //uzceni fitness if (nkr == 0)//kontrola ujdetych kroku { return(0); } int c = ex.GetNFunc(); //zjisteny arity int f = ex.GetFunc(); //funkce if (c <= 1) //arita mensi jak 2 { nkr--; //odecteni poctu kroku f = f % 3; if (0 == f) //go { mr.Go(); if (!mr.InMap()) { return(0); } mapp[mr.X, mr.Y] = 1; if (tmap[mr.X, mr.Y] == 1) { tmap[mr.X, mr.Y] = 0; lastnam = nkr; return(1); } } if (f == 1)//right { mr.GoRight(); } if (f == 2)//left { mr.GoLeft(); } } if (c == 2) { f = f % 2; if (f == 0) { double bf = fitt(ex.GetNextChildren(), mr, tmap, ref nkr) + fitt(ex.GetNextChildren(), mr, tmap, ref nkr); return(bf); } if (f == 1) { mr.GoB(); if (mr.InMap() && tmap[mr.XB, mr.YB] == 1) { return(fitt(ex.GetNextChildren(), mr, tmap, ref nkr) + 0.00000000000000000000000001); } else { ex.GetNextChildren(); return(fitt(ex.GetNextChildren(), mr, tmap, ref nkr) + 0.00000000000000000000000001); } } } if (c == 3) { return(fitt(ex.GetNextChildren(), mr, tmap, ref nkr) + fitt(ex.GetNextChildren(), mr, tmap, ref nkr) + fitt(ex.GetNextChildren(), mr, tmap, ref nkr)); } return(0); }