public double totalvalue(playerparams ppp) { //if (useless) // return 0; double t = 0; foreach (string s in f.Keys) { t += f[s] * ppp.pp[s]; } return(t); }
private void EvolveButton_Click(object sender, EventArgs e) { Label[] playerlabels = new Label[nplayer]; double mutationrate = 1.0; for (int i = 0; i < nplayer; i++) { playerlabels[i] = new Label(); playerpool[i] = new playerclass('z', 0, false, "Player_" + i); playerpool[i].mutate(mutationrate); playerpool[i].namelabel = playerlabels[i]; playerlabels[i].Text = playerpool[i].name; playerlabels[i].Visible = true; playerlabels[i].AutoSize = true; } mutationrate = 0.5; for (int iround = 0; iround < 100; iround++) { memo("Round " + iround); for (int i = 0; i < nplayer; i++) { for (int j = 0; j < nplayer; j++) { if (j == i) { continue; } //memo("Playing " + i + " vs. " + j); NewGame(playerpool[i], playerpool[j]); int winner = makeplay(7, 7, false); if (winner >= 0) { int ijwin = i; int ijlose = j; if (winner > 0) { ijwin = j; ijlose = i; } //memo(" winner: " + ijwin); playerpool[ijwin].wins++; playerpool[ijlose].losses++; } } } int maxwinner = -1; int maxwin = -1; int maxloser = -1; int maxloss = -1; playerparams ppsum = new playerparams(); ppsum.zero(); for (int i = 0; i < nplayer; i++) { memo(playerpool[i].name + ": " + playerpool[i].wins + " wins, " + playerpool[i].losses + " losses."); if (playerpool[i].wins > maxwin) { maxwin = playerpool[i].wins; maxwinner = i; } if (playerpool[i].losses > maxloss) { maxloss = playerpool[i].losses; maxloser = i; } playerpool[i].wins = 0; playerpool[i].losses = 0; foreach (string s in playerpool[i].par.pp.Keys) { ppsum.pp[s] += playerpool[i].par.pp[s]; } } foreach (string s in ppsum.pp.Keys) { memo(s + ": " + (ppsum.pp[s] / nplayer).ToString("F2")); } playerclass ppref = new playerclass('z', 0, false, "ref"); foreach (string s in ppsum.pp.Keys) { memo(s + "(diff): " + (ppsum.pp[s] / nplayer - ppref.par.pp[s]).ToString("F2")); } playerpool[maxloser] = playerpool[maxwinner].spawn(mutationrate); if (iround % 10 == 0) { playerpool[maxloser].par.restoredefaults(); playerpool[maxloser].mutate(3 * mutationrate); playerpool[maxloser].name = "X" + iround; } mutationrate *= 0.98; } string fnbase = "evolution"; string fn; int k = 0; do { fn = fnbase + k + ".txt"; k++; }while (File.Exists(fn)); using (StreamWriter sw = new StreamWriter(fn)) { for (int i = 0; i < nplayer; i++) { string s = playerpool[i].export(); memo(s); sw.WriteLine(s); } } }