Beispiel #1
0
        private Genoma Mutate(Genoma genoma)
        {
            Genoma newgenoma = new Genoma();

            int position1 = random.Next(genoma.travel.Count);
            int position2 = random.Next(genoma.travel.Count);

            for (int k = 0; k < genoma.travel.Count; k++)
            {
                int p = k;

                if (position1 == k)
                {
                    p = position2;
                }
                if (position2 == k)
                {
                    p = position1;
                }

                newgenoma.travel.Add(genoma.travel[p]);
            }

            newgenoma.value = this.CalculateValue(newgenoma);

            return(newgenoma);
        }
Beispiel #2
0
        private void BestGenoma(Genoma genoma)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new BestGenomaDelegate(BestGenoma), genoma);
                return;
            }

            travel.DrawTravel(genoma);
            pcbTravel.Image = travel.Image;
            lblValue.Text   = genoma.value.ToString();
        }
Beispiel #3
0
        private Genoma GenerateGenoma()
        {
            Genoma genoma = new Genoma();

            for (int k = 0; k < MapSize * MapSize / 2; k++)
            {
                Point pt = new Point();
                pt.x = this.random.Next(MapSize);
                pt.y = this.random.Next(MapSize);

                genoma.travel.Add(pt);
            }
            return(genoma);
        }
Beispiel #4
0
        private int CalculateValue(Genoma genoma)
        {
            int value = 0;

            Point point1 = null;

            foreach (Point point in genoma.travel)
            {
                if (point1 != null)
                {
                    value += (point.x - point1.x) * (point.x - point1.x) + (point.y - point1.y) * (point.y - point1.y);
                }

                point1 = point;
            }

            return(value);
        }
Beispiel #5
0
        public void DrawTravel(Genoma g)
        {
            graphics.FillRectangle(Brushes.LightGoldenrodYellow, 0, 0, image.Width, image.Height);

            Point p1 = null;

            foreach (Point pt in g.travel)
            {
                if (p1 == null)
                {
                    p1 = pt;
                }
                else
                {
                    graphics.DrawLine(Pens.Black, 10 + p1.x * 20, 10 + p1.y * 20, 10 + pt.x * 20, 10 + pt.y * 20);
                    p1 = pt;
                }
            }
        }
Beispiel #6
0
        private void button1_Click(object sender, EventArgs e)
        {
            Channel genomas   = new Channel();
            Channel evaluated = new Channel();
            Channel bestsofar = new Channel();
            Channel mutator   = new Channel();

            // Generates the initial populations
            GoRoutines.Go(() =>
            {
                Genoma genoma = GenerateGenoma();

                for (int j = 0; j < PopulationSize * 10; j++)
                {
                    genomas.Send(this.Mutate(genoma));
                }
            });

            // Evaluate genomas
            GoRoutines.Go(() =>
            {
                while (true)
                {
                    Genoma genoma = (Genoma)genomas.Receive();
                    genoma.value  = this.CalculateValue(genoma);
                    evaluated.Send(genoma);
                }
            });

            // Collect and select
            GoRoutines.Go(() =>
            {
                GenomaComparer comparer = new GenomaComparer();

                while (true)
                {
                    List <Genoma> genomalist = new List <Genoma>();

                    for (int k = 0; k < PopulationSize; k++)
                    {
                        Genoma genoma = (Genoma)evaluated.Receive();
                        genomalist.Add(genoma);
                    }

                    genomalist.Sort(comparer);

                    GoRoutines.Go(() => bestsofar.Send(genomalist[0]));

                    for (int k = 0; k < PopulationSize / 5; k++)
                    {
                        GoRoutines.Go(() => evaluated.Send(genomalist[k]));
                    }

                    for (int k = 0; k < PopulationSize / 5; k++)
                    {
                        GoRoutines.Go(() => mutator.Send(genomalist[k]));
                        GoRoutines.Go(() => mutator.Send(genomalist[k]));
                        GoRoutines.Go(() => mutator.Send(genomalist[k]));
                        GoRoutines.Go(() => mutator.Send(genomalist[k]));
                    }
                }
            });

            // Mutates
            GoRoutines.Go(() =>
            {
                Random rnd = new Random();
                while (true)
                {
                    Genoma genoma    = (Genoma)mutator.Receive();
                    Genoma newgenoma = this.Mutate(genoma);

                    //if (rnd.Next(2) == 0)
                    //    newgenoma = this.Mutate(newgenoma);

                    while (newgenoma.value >= genoma.value)
                    {
                        if (rnd.Next(3) == 0)
                        {
                            break;
                        }

                        newgenoma = this.Mutate(genoma);
                    }

                    evaluated.Send(newgenoma);
                }
            });

            // Receives and draws the results
            GoRoutines.Go(() =>
            {
                Genoma best = null;

                while (true)
                {
                    Genoma genoma = (Genoma)bestsofar.Receive();

                    if (best == null || best.value > genoma.value)
                    {
                        best = genoma;
                        this.BestGenoma(genoma);
                    }
                }
            });
        }