예제 #1
0
        public Evolution(int populationCount, int variableCount, int valueCount, Random random)
        {
            Id            = ObjectId.GenerateNewId();
            ValueCount    = valueCount;
            VariableCount = variableCount;
            Population    = new List <MemberModel>();
            Generation    = 0;
            Done          = false;
            TotalMembers  = populationCount;

            Target           = new MemberModel();
            Target.Variables = new List <int>();
            History          = new List <int>();

            for (var j = 0; j < variableCount; j++)
            {
                var value = random.Next(0, valueCount);
                Target.Variables.Add(value);
            }

            for (var i = 0; i < populationCount; i++)
            {
                var member = new MemberModel();
                member.Variables = new List <int>();

                for (var j = 0; j < variableCount; j++)
                {
                    var value = random.Next(0, valueCount);
                    member.Variables.Add(value);
                }

                member.SetFitness(Target);
                Population.Add(member);
            }

            Population = Population.OrderByDescending(p => p.Fitness).ToList();

            Insert();
        }
예제 #2
0
        public MemberModel Couplement(MemberModel mate)
        {
            var baby = new MemberModel();

            var random = new Random();

            int  crossIndex   = random.Next(0, Variables.Count);
            bool activeParent = random.Next(0, 1) % 2 == 0;

            for (var i = 0; i < Variables.Count; i++)
            {
                if (activeParent)
                {
                    if (i < crossIndex)
                    {
                        baby.Variables.Add(Variables[i]);
                    }
                    else
                    {
                        baby.Variables.Add(mate.Variables[i]);
                    }
                }
                else
                {
                    if (i < crossIndex)
                    {
                        baby.Variables.Add(mate.Variables[i]);
                    }
                    else
                    {
                        baby.Variables.Add(Variables[i]);
                    }
                }
            }

            return(baby);
        }