コード例 #1
0
        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);
        }
コード例 #2
0
        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);
                }
            }
        }