Exemplo n.º 1
0
        public static void Crossover(DecisionTree individual1, DecisionTree individual2, CryptoRandom r)
        {
            //wybranie punktu przeciecia z zakresu elementCount
            //dla obu osobnikow
            //zamiana miejscami tylko poddrzew wybranych elementow

            int  locus1;
            int  locus2;
            Node node1;
            Node node2;

            do
            {
                locus1 = r.Next(1, individual1.elementCount + 1);
                node1  = individual1.Find(locus1, individual1.root);
            } while (node1 is ResultNode);

            do
            {
                locus2 = r.Next(1, individual2.elementCount + 1);
                node2  = individual2.Find(locus2, individual2.root);
            } while (node2 is ResultNode);

            Node tempNode = null;

            tempNode        = node1.leftChild;
            node1.leftChild = node2.leftChild;
            node2.leftChild = tempNode;

            tempNode = null;

            tempNode         = node1.rightChild;
            node1.rightChild = node2.rightChild;
            node2.rightChild = tempNode;

            individual1.RecalculateKeys();
            individual2.RecalculateKeys();
        }
Exemplo n.º 2
0
        public static void CrossoverWithParent(DecisionTree individual1, DecisionTree individual2, CryptoRandom r)
        {
            int  locus1;
            int  locus2;
            Node node1;
            Node node2;
            Node parent1;
            Node parent2;

            locus1  = r.Next(2, individual1.elementCount + 1);
            node1   = individual1.Find(locus1, individual1.root);
            parent1 = individual1.FindParentOfNode(locus1, individual1.root);

            locus2  = r.Next(2, individual2.elementCount + 1);
            node2   = individual2.Find(locus2, individual2.root);
            parent2 = individual2.FindParentOfNode(locus2, individual2.root);

            if (parent1.leftChild.Equals(node1))
            {
                parent1.leftChild = node2;
            }
            else
            {
                parent1.rightChild = node2;
            }

            if (parent2.leftChild.Equals(node2))
            {
                parent2.leftChild = node1;
            }
            else
            {
                parent2.rightChild = node1;
            }

            individual1.RecalculateKeys();
            individual2.RecalculateKeys();
        }
Exemplo n.º 3
0
        static void Main(string[] args)
        {
            string line = "";
            //State state = StateInit();
            State state = new State();

            StateInit(state);
            State               maxValues      = MaxValuesInit();
            List <Test>         tests          = TestsInit();
            int                 iterations     = 100;
            int                 populationSize = 10;
            double              crossoverProb  = 0.1;
            double              mutationProb   = 0.1;
            double              averageFitness = 0;
            CryptoRandom        r          = new CryptoRandom();
            List <DecisionTree> population = new List <DecisionTree>();
            DecisionTree        enemy      = new DecisionTree(new List <int> {
                100, 100, 50, 0
            }, state, maxValues, tests, r);

            //DecisionTree enemy = CreateEnemy(r, state, tests);

            //population init
            for (int i = 0; i < populationSize; i++)
            {
                population.Add(new DecisionTree(new List <int> {
                    100, 100, 50, 0
                }, state, maxValues, tests, r));
                //Console.WriteLine("Wielkosc drzewa: {0}", population[i].elementCount);
                //Console.WriteLine("Wielkosc drzewa': {0}", population[i].CountElements());
            }

            while (iterations > 0)             //glowna petla programu, ustalona ilosc iteracji, pozniej dodac zatrzymanie po stagnacji
            {
                for (int j = 0; j < populationSize; j++)
                {
                    //petla walki
                    int turn = 1;
                    while (turn <= 99 && state["HP"] > 0 && state["enemyHP"] > 0)
                    {
                        //Console.WriteLine("Osobnik {0}, tura: {1}", j, turn);
                        //EnemyMakeMove(enemy.decide(state), state);
                        EnemyMoves(state);
                        MakeMove(population[j].decide(state), state);
                        turn++;
                    }
                    //Console.WriteLine("HP -> {0}", state["HP"]);
                    //Console.WriteLine("enemyHP -> {0}", state["enemyHP"]);
                    //Console.WriteLine("distance -> {0}", state["distance"]);
                    //Console.WriteLine("isInDanger -> {0}", state["isInDanger"]);
                    //Console.WriteLine("enemyIsInDanger -> {0}", state["enemyIsInDanger"]);
                    //Console.WriteLine("isDefending -> {0}", state["isDefending"]);
                    //Console.WriteLine("enemyIsDefending -> {0}", state["enemyIsDefending"]);
                    //Console.ReadLine();

                    population[j].fitness = Evaluate(state, maxValues, turn, population[j].elementCount);

                    //state = StateInit();
                    StateInit(state);
                }

                averageFitness = population.Sum(p => p.fitness) / populationSize;
                Console.WriteLine("srednia wartosc funkcji oceny: " + averageFitness);
                Console.WriteLine("najgorszy osobnik: " + population.Min(p => p.fitness));
                Console.WriteLine("najlepszy osobnik: " + population.Max(p => p.fitness));
                line = String.Concat(line, (averageFitness.ToString() + " " + population.Max(p => p.fitness) + " " + "\r\n"));

                //selekcja
                List <DecisionTree> SelectedIndividuals = EliteRankingSelection(population, populationSize, r);

                //wybranie najlepszego z poprzedniej populacji i ustawienie na enemy
                //enemy = population.OrderByDescending(p => p.fitness).First().Clone();

                population.Clear();                 // usuniecie starej populacji

                //wybranie osobnikow do krzyzowania, przepisanie reszty do nowej populacji
                List <DecisionTree> IndividualsToCross = new List <DecisionTree>();
                for (int i = 0; i < populationSize; i++)
                {
                    if (r.NextDouble() <= crossoverProb)
                    {
                        IndividualsToCross.Add(SelectedIndividuals[i]);
                    }
                    else
                    {
                        population.Add(SelectedIndividuals[i]);
                    }
                }
                //zapewnienie parzystej ilosci osobnikow do krzyzowania
                if (IndividualsToCross.Count % 2 != 0)
                {
                    population.Add(IndividualsToCross.Last());
                    IndividualsToCross.RemoveAt(IndividualsToCross.Count - 1);
                }

                Console.WriteLine("Skrzyzowane osobniki: " + IndividualsToCross.Count);
                //krzyzowanie
                while (IndividualsToCross.Count > 0)
                {
                    DecisionTree Individual1 = IndividualsToCross[r.Next(0, IndividualsToCross.Count)];
                    IndividualsToCross.Remove(Individual1);
                    DecisionTree Individual2 = IndividualsToCross[r.Next(0, IndividualsToCross.Count)];
                    IndividualsToCross.Remove(Individual2);
                    Crossover(Individual1, Individual2, r);
                    population.Add(Individual1);
                    population.Add(Individual2);
                }

                int mutationCount = 0;
                //mutacja
                for (int i = 0; i < populationSize; i++)
                {
                    if (r.NextDouble() <= mutationProb)
                    {
                        Mutation(population[i], r, state, maxValues, tests);
                        mutationCount++;
                    }
                }
                Console.WriteLine("Zmutowane osobniki: " + mutationCount);

                iterations--;
                Console.ReadLine();
            }
            System.IO.StreamWriter file = new System.IO.StreamWriter("d:\\test.txt");
            file.WriteLine(line);

            file.Close();
            Console.ReadLine();
        }