using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace SIIT_LAb3 { public struct Point { public int X; public int Y; public Point(int x, int y) { X = x; Y = y; } } public class Dog { private int countOfGenes = 10; public static Random rand = new Random(); public int[] Steps { get; set; } public double Fitness { get; set; } public double SharingFitness { get; set; } public Point Coordinate; public Dog() { Steps = new int[countOfGenes]; for (int i = 0; i < countOfGenes; i++) { Steps[i] = rand.Next(4) + 1; } CalculateCoordinates(); } public Dog(Dog firstParent, Dog secondParent) { int cutPosition = rand.Next(countOfGenes - 1); Steps = Enumerable.Concat(firstParent.Steps.Take(cutPosition), secondParent.Steps.Skip(cutPosition)).ToArray(); CalculateCoordinates(); Dog dog = new Dog(); dog.Steps = Enumerable.Concat(firstParent.Steps.Skip(cutPosition), secondParent.Steps.Take(cutPosition)).ToArray(); dog.CalculateCoordinates(); if (dog.Fitness > Fitness) { Steps = dog.Steps; Fitness = dog.Fitness; } } public void CalculateCoordinates() { Coordinate = new Point(500, 500); for (int i = 0; i < countOfGenes; i++) { switch (Steps[i]) { case 1: Coordinate.X++; break; case 2: Coordinate.X--; break; case 3: Coordinate.Y++; break; case 4: Coordinate.Y--; break; } } CalculateFitness(); } public void CalculateFitness() { int[] distance = new int[4]; distance[0] = Math.Abs(800 - Coordinate.X) + Math.Abs(800 - Coordinate.Y); distance[1] = Math.Abs(800 - Coordinate.X) + Math.Abs(200 - Coordinate.Y); distance[2] = Math.Abs(200 - Coordinate.X) + Math.Abs(800 - Coordinate.Y); distance[3] = Math.Abs(200 - Coordinate.X) + Math.Abs(200 - Coordinate.Y); Fitness = 600 - distance.Min(); } public void CalculateSharingFitness(int[] dogs) { SharingFitness = Fitness / (1 + dogs.Sum()); } } class Program { private static int countOfDogs = 50; private static Random rand = new Random(); public static Dog[] GenerateChilds(Dog[] bestDogs) { Dog[] childs = new Dog[countOfDogs]; for (int i = 0; i < countOfDogs; i++) { var randomNumb1 = rand.Next(bestDogs.Length); var randomNumb2 = rand.Next(bestDogs.Length); while (randomNumb2 == randomNumb1) randomNumb2 = rand.Next(bestDogs.Length); childs[i] = new Dog(bestDogs[randomNumb1], bestDogs[randomNumb2]); } return childs; } static void Main(string[] args) { Dog[] dogs = new Dog[countOfDogs].Select(x => new Dog()).ToArray(); // generate 50 dogs Dog[] bestDogs; int i = 0; while (i < 30) { bestDogs = dogs.OrderByDescending(x => x.Fitness).Take(countOfDogs / 2).ToArray(); Console.Write("[{0}-{1}]", bestDogs[0].Coordinate.X, bestDogs[0].Coordinate.Y); dogs = GenerateChilds(bestDogs); i++; } foreach(var item in dogs) Console.WriteLine("{0}-{1}", item.Coordinate.X, item.Coordinate.Y); } } }