CodeExamples / Weasels / Program.cs
Program.cs
Raw
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Weasels
{
    class Program
    {

        static int pop_size = 500;

        static void Main(string[] args)
        {
            HillClimber();
            Tournament(false);
            Tournament(true);

            Console.ReadLine();
        }

        static void HillClimber()
        {
            Console.WriteLine("=====================================================================================");
            Console.WriteLine("Starting Hill Climber...");

            Weasel a = new Weasel();
            Weasel b;

            int stepCount = 0;

            while (a.Fitness() < Weasel.GENOME_LENGTH)
            {
                b = (Weasel)a.Mutate();
                if (b.Fitness() > a.Fitness())
                {
                    a = b;
                    Console.WriteLine(a.genome);
                }
                stepCount++;
            }
            Console.WriteLine("-------------------------------------------------------------------------------------");
            Console.WriteLine("Perfect fitness achieved in: " + stepCount.ToString() + "steps");
        }

        static void Tournament(bool sexual)
        {
            Console.WriteLine("=====================================================================================");
            Console.WriteLine("Starting tournament with" + ((!sexual) ? "out" :"") + " crossover");
            Weasel[] pop = new Weasel[pop_size];

            for (int i = 0; i < pop_size; i++)
            {
                pop[i] = new Weasel();
            }

            Random r = new Random();
            int stepCount = 0;

            int maxFit = 0;

            while (!pop.Any(x => x.Fitness() == Weasel.GENOME_LENGTH))
            {
                int m = pop.Max(x => x.Fitness());
                if (m != maxFit)
                {
                    maxFit = m;
                    Console.WriteLine("Max fitness is: " + maxFit);
                }
                stepCount++;
                Weasel parent1, parent2 = null;

                //choose parent 1
                Weasel a = pop[r.Next(pop_size)];
                Weasel b = pop[r.Next(pop_size)];

                if (a.Fitness() < b.Fitness())
                {
                    parent1 = b;
                }
                else
                {
                    parent1 = a;
                }

                //generate child
                Weasel child;

                if (sexual)
                {
                    //choose 2nd parent
                    a = pop[r.Next(pop_size)];
                    b = pop[r.Next(pop_size)];

                    if (a.Fitness() < b.Fitness())
                    {
                        parent2 = b;
                    }
                    else
                    {
                        parent2 = a;
                    }
                    child = (Weasel)parent1.Reproduce(parent2);
                }
                else
                {
                    child = (Weasel)parent1.Reproduce();
                }

                //Replace randomly chosen member
                int cI = r.Next(pop_size);
                int dI = r.Next(pop_size);
                Weasel c = pop[cI];
                Weasel d = pop[dI];

                if (c.Fitness() < d.Fitness())
                {
                    pop[cI] = child;
                }
                else
                {
                    pop[dI] = child;
                }
            }
            Console.WriteLine("-------------------------------------------------------------------------------------");
            Console.WriteLine("Perfect fitness achieved in: " + stepCount.ToString() + "steps");
        }
    }
}