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");
}
}
}