usingSystem;usingSystem.Text;usingSystem.Collections.Generic;namespaceMethinks{classProgram{staticStringGOAL="METHINKSITISAWEASEL";staticStringCHARS="ABCDEFGHIJKLMNOPQRSTUVWXYZ";publicstaticvoidMain(string[]args){Console.WriteLine("Hello World!");intCAPACITY_SMALL=300;//容量intCHILDREN=3;//子供の数intINTRON=4;//ムダ領域SortedList<int,String>[]pools=newSortedList<int,String>[]{newSortedList<int,String>(),newSortedList<int,String>()};Randomrand=newRandom();for(inti=0;i<CAPACITY_SMALL;i++){StringBuildersb=newStringBuilder();for(intn=0;n<(GOAL.Length+INTRON);n++){sb.Append(CHARS[rand.Next(CHARS.Length)]);}AddMember(pools[0],sb.ToString());}intg=0;intturn=g%2;while(pools[turn].Values[0].Substring(0,GOAL.Length)!=GOAL){Console.WriteLine("{0}: Top = [{1}], {2}",g,pools[turn].Values[0],pools[turn].Keys[0]);intnext=(g+1)%2;pools[next].Clear();for(inti=0;i<CAPACITY_SMALL;i++){for(intc=0;c<CHILDREN;c++){intpos=rand.Next(GOAL.Length+INTRON);StringBuilderchild=newStringBuilder();child.Append(pools[turn].Values[i].Substring(0,pos));child.Append(CHARS[rand.Next(CHARS.Length)]);child.Append(pools[turn].Values[i].Substring(pos+1));AddMember(pools[next],child.ToString());}}g++;turn=g%2;}Console.WriteLine("{0}: Top = [{1}], {2}",g,pools[turn].Values[0],pools[turn].Keys[0]);Console.Write("Press any key to continue . . . ");Console.ReadKey(true);}staticvoidAddMember(SortedList<int,String>pool,Stringmember){intscore=GetScore(member);while(pool.ContainsKey(score)){score++;}pool.Add(score,member);}staticintGetScore(Strings){intscore=0;for(inti=0;i<GOAL.Length;i++){if(s[i]==GOAL[i]){score--;}}returnscore*1000;}}}
syat
#6306()
[
C#
]
Rating0/0=0.00
みんな言ってるけど、3じゃだめですね・・・。 評価関数を工夫してどうにかしようと奮闘したけどだめでした。
遺伝子(と呼びたい)に、ムダな領域を追加すると、3でも収束します。実質、変異率を下げたのと同じことですが。
Rating0/0=0.00-0+
[ reply ]