コード例 #1
0
    private void DumpStopLocation(TrainIndividual pIndividual)
    {
        mStopLocationOcupation = pIndividual.GetStopLocationOcupation();

        DebugLog.Logar(" ");
        DebugLog.Logar(" -------------------------------------- DumpStopLocations ----------------------------------- ");
        foreach (StopLocation lvStopLocation in mStopLocationOcupation.Keys)
        {
            foreach (Gene lvGene in mStopLocationOcupation[lvStopLocation])
            {
                DebugLog.Logar(" -----------------------");
                DebugLog.Logar("StopLocation = " + lvStopLocation);
                DebugLog.Logar(" ");
                DebugLog.Logar("lvGene.TrainId = " + lvGene.TrainId);
                DebugLog.Logar("lvGene.TrainName = " + lvGene.TrainName);
                if (lvGene.StopLocation != null)
                {
                    DebugLog.Logar("lvGene.StopLocation.Location = " + lvGene.StopLocation.Location);
                }
                DebugLog.Logar("lvGene.Track = " + lvGene.Track);
                DebugLog.Logar("lvGene.Location = " + lvGene.Location);
                DebugLog.Logar("lvGene.UD = " + lvGene.UD);
                DebugLog.Logar("lvGene.Coordinate = " + lvGene.Coordinate);
                DebugLog.Logar("lvGene.End = " + lvGene.End);
                DebugLog.Logar("lvGene.Time = " + lvGene.Time);

                DebugLog.Logar(" ");
                DebugLog.Logar(" -----------------------");
                DebugLog.Logar(" ");
            }
        }
        DebugLog.Logar(" ------------------------------------------------------------------------------------------- ");
        DebugLog.Logar(" ");
    }
コード例 #2
0
    private void DumpDuplicateStopLocation(TrainIndividual pIndividual)
    {
        Dictionary<double, StopLocation> lvGenesId = new Dictionary<double, StopLocation>();
        StopLocation lvStopLocationOrign = null;

        mStopLocationOcupation = pIndividual.GetStopLocationOcupation();

        DebugLog.Logar(" ");
        DebugLog.Logar(" --------------------------------------  DumpDuplicateStopLocation ----------------------------------- ");
        foreach (StopLocation lvStopLocation in mStopLocationOcupation.Keys)
        {
            foreach (Gene lvGene in mStopLocationOcupation[lvStopLocation])
            {
                if (lvGenesId.ContainsKey(lvGene.TrainId))
                {
                    DebugLog.Logar(" -----------------------");
                    DebugLog.Logar("StopLocation = " + lvStopLocation);

                    lvStopLocationOrign = lvGenesId[lvGene.TrainId];
                    DebugLog.Logar(" ");
                    DebugLog.Logar("lvStopLocationOrign = " + lvStopLocationOrign);

                    DebugLog.Logar(" ");
                    DebugLog.Logar("lvGene.TrainId = " + lvGene.TrainId);
                    DebugLog.Logar("lvGene.TrainName = " + lvGene.TrainName);
                    if (lvGene.StopLocation != null)
                    {
                        DebugLog.Logar("lvGene.StopLocation.Location = " + lvGene.StopLocation.Location);
                    }
                    DebugLog.Logar("lvGene.Track = " + lvGene.Track);
                    DebugLog.Logar("lvGene.Location = " + lvGene.Location);
                    DebugLog.Logar("lvGene.UD = " + lvGene.UD);
                    DebugLog.Logar("lvGene.Coordinate = " + lvGene.Coordinate);
                    DebugLog.Logar("lvGene.End = " + lvGene.End);
                    DebugLog.Logar("lvGene.Time = " + lvGene.Time);

                    DebugLog.Logar(" ");
                    DebugLog.Logar(" -----------------------");
                    DebugLog.Logar(" ");
                }
                else
                {
                    lvGenesId.Add(lvGene.TrainId, lvStopLocation);
                }
            }
        }
        DebugLog.Logar(" ------------------------------------------------------------------------------------------- ");
        DebugLog.Logar(" ");
    }
コード例 #3
0
    private bool VerifyPendentGene(TrainIndividual pIndividual, TrainIndividual pParentIndividual, int pIndinit, int pIndEnd)
    {
        bool lvRes = false;
        int lvPedentCount = 0;
        int lvPedentVerify = 0;

        HashSet<Gene> lvPendent = pIndividual.GetDeadLockResponsible();
        lvPedentCount = lvPendent.Count;

        foreach (Gene lvGene in lvPendent)
        {
            for (int i = pIndinit; i < pIndEnd; i++)
            {
                if (lvGene.Equals(pParentIndividual.GetGene(i)))
                {
                    lvPedentVerify++;
                    DebugLog.Logar("VerifyPendentGene para retirar (" + lvGene + ") no indice = " + i);
                    break;
                }
            }
        }

        if ((lvPedentVerify >= lvPedentCount) && (lvPedentCount > 0))
        {
            lvRes = true;
        }
        else
        {
            lvRes = false;
        }

        return lvRes;
    }
コード例 #4
0
    public Population(IFitness<Gene> pFitness, int pSize, int pMutationRate, bool pUse2PointCrossOver, DateTime pInitialDate, DateTime pFinalDate, string pStrPriority)
    {
        IIndividual<Gene> lvIndividual = null;
        bool lvValidIndividual = false;

        mFitness = pFitness;
        mMutationRate = pMutationRate;
        USE_CROSSOVER_2_PONTOS = pUse2PointCrossOver;
        mInitialDate = pInitialDate;
        mFinalDate = pFinalDate;
        mPriority = new Dictionary<string, int>();

        if (DateTime.Now.Date == mInitialDate.Date)
        {
            mDateRef = DateTime.Now;
        }
        else
        {
            mDateRef = mFinalDate;
        }

        if (!bool.TryParse(ConfigurationManager.AppSettings["ALLOW_NO_DESTINATION_TRAIN"], out mAllowNoDestinationTrain))
        {
            mAllowNoDestinationTrain = true;
        }

        if (!double.TryParse(ConfigurationManager.AppSettings["INVALID_FITNESS_VALUE"], out mInvalidIndividualFitness))
        {
            mInvalidIndividualFitness = 10000.0;
        }

        if (!Int32.TryParse(ConfigurationManager.AppSettings["INITIAL_VALID_COORDINATE"], out mInitialValidCoordinate))
        {
            mInitialValidCoordinate = Int32.MinValue;
        }

        if (!Int32.TryParse(ConfigurationManager.AppSettings["END_VALID_COORDINATE"], out mInitialValidCoordinate))
        {
            mEndValidCoordinate = Int32.MaxValue;
        }

        mStopLocationOcupation = new Dictionary<StopLocation, HashSet<Gene>>();
        mStopLocationDeparture = new Dictionary<StopLocation, Gene[]>();

        foreach (StopLocation lvStopLocation in StopLocation.GetList())
        {
            mStopLocationOcupation.Add(lvStopLocation, new HashSet<Gene>());
            mStopLocationDeparture.Add(lvStopLocation, new Gene[lvStopLocation.Capacity]);
        }

        LoadTrainList(pStrPriority);

        DebugLog.Logar(" ");
        DebugLog.Logar("Gerando Individuos:");

        mSize = pSize;

        mIndividuals = new List<IIndividual<Gene>>();
        for (int i = 0; i < pSize; i++)
        {
            lvIndividual = new TrainIndividual(mFitness, mDateRef, mStopLocationOcupation, mStopLocationDeparture);
            DebugLog.Logar("Individuo " + lvIndividual.GetUniqueId() + ":");
            lvValidIndividual = lvIndividual.GenerateIndividual(mTrainList, mPlanList);
            DebugLog.Logar("Individuo Info = " + lvIndividual.ToString());
            DebugLog.Logar(" ");

            if (lvValidIndividual)
            {
                mIndividuals.Add(lvIndividual);
            }
        }
        DebugLog.Logar(" ");
    }
コード例 #5
0
    private IIndividual<Gene> Mutate(IIndividual<Gene> pIndividual)
    {
        Random lvRandom = new Random(DateTime.Now.Millisecond);
        int lvRandomValue = lvRandom.Next(1, 101);
        int lvNewPosition = -1;
        IIndividual<Gene> lvMutatedIndividual = null;
        List<Gene> lvNextMov = null;
        Queue<Gene> lvQueue = new Queue<Gene>();
        Gene lvRefGene = null;
        Gene lvGene = null;
        HashSet<Gene> lvHashSet = new HashSet<Gene>();
        int lvPrevGene = -1;
        int lvNextGene = -1;
        int lvEndIndex = -1;

        if (lvRandomValue <= mMutationRate)
        {
            lvRandomValue = lvRandom.Next(0, pIndividual.Count - 1);
            lvRefGene = pIndividual.GetGene(lvRandomValue);
            while (lvRefGene.HeadWayTime != DateTime.MinValue)
            {
                lvRandomValue++;
                lvRefGene = pIndividual.GetGene(lvRandomValue);

                if (lvRefGene == null)
                {
                    lvRandomValue = pIndividual.Count - 1;
                }
            }

            lvPrevGene = 0;
            for (int i = lvRandomValue - 1; i >= 0; i--)
            {
                lvGene = pIndividual.GetGene(i);

                if ((lvGene.TrainId == lvRefGene.TrainId) && (lvRefGene.HeadWayTime == DateTime.MinValue))
                {
                    lvPrevGene = i + 1;
                    break;
                }
            }

            lvNextGene = pIndividual.Count - 1;
            for (int i = lvRandomValue + 2; i < pIndividual.Count; i++)
            {
                lvGene = pIndividual.GetGene(i);

                if ((lvGene.TrainId == lvRefGene.TrainId) && (lvRefGene.HeadWayTime == DateTime.MinValue))
                {
                    lvNextGene = i - 1;
                    break;
                }
            }

            lvNewPosition = lvRandom.Next(lvPrevGene, lvNextGene + 1);

            if (lvNewPosition != lvRandomValue)
            {
                lvMutatedIndividual = new TrainIndividual(mFitness, mDateRef, null, null);
                if (lvNewPosition < lvRandomValue)
                {
                    lvEndIndex = lvNewPosition - 1;
                }
                else
                {
                    lvEndIndex = lvRandomValue - 1;
                }
                lvMutatedIndividual.AddGenes(pIndividual.GetGenes(0, lvEndIndex));

                for (int i = lvRandomValue + 1; i < lvNewPosition; i++)
                {
                    lvGene = pIndividual.GetGene(i);
                    if (lvGene.HeadWayTime == DateTime.MinValue)
                    {
                        AddFromQueue(lvMutatedIndividual, lvQueue, lvHashSet);
                        lvNextMov = lvMutatedIndividual.GetNextPosition(lvGene, DateTime.MaxValue);
                        if (lvNextMov != null)
                        {
                            lvMutatedIndividual.AddGenes(lvNextMov);
                        }
                        else
                        {
                            lvQueue.Enqueue(lvGene);
                        }
                    }
                }

                /* Insere o Gene na nova posição */
                AddFromQueue(lvMutatedIndividual, lvQueue, lvHashSet);
                lvNextMov = lvMutatedIndividual.GetNextPosition(lvRefGene);
                if (lvNextMov != null)
                {
                    lvMutatedIndividual.AddGenes(lvNextMov);
                }
                else
                {
                    lvQueue.Enqueue(lvGene);
                }

                if (lvNewPosition < lvRandomValue)
                {
                    for (int i = lvNewPosition + 1; i < pIndividual.Count; i++)
                    {
                        lvGene = pIndividual.GetGene(i);
                        if ((lvGene.HeadWayTime == DateTime.MinValue) && (lvGene != lvRefGene))
                        {
                            AddFromQueue(lvMutatedIndividual, lvQueue, lvHashSet);
                            lvNextMov = lvMutatedIndividual.GetNextPosition(lvGene);
                            if (lvNextMov != null)
                            {
                                lvMutatedIndividual.AddGenes(lvNextMov);
                            }
                            else
                            {
                                lvQueue.Enqueue(lvGene);
                            }
                        }
                    }
                }
                else
                {
                    for (int i = lvNewPosition; i < pIndividual.Count; i++)
                    {
                        lvGene = pIndividual.GetGene(i);
                        if (lvGene.HeadWayTime == DateTime.MinValue)
                        {
                            AddFromQueue(lvMutatedIndividual, lvQueue, lvHashSet);
                            lvNextMov = lvMutatedIndividual.GetNextPosition(lvGene);
                            if (lvNextMov != null)
                            {
                                lvMutatedIndividual.AddGenes(lvNextMov);
                            }
                            else
                            {
                                lvQueue.Enqueue(lvGene);
                            }
                            lvMutatedIndividual.AddGenes(lvNextMov);
                        }
                    }
                }
            }

            if (lvQueue.Count > 0)
            {
                AddFromQueue(lvMutatedIndividual, lvQueue, lvHashSet);
            }

            if (lvQueue.Count > 0)
            {
                lvMutatedIndividual = null;
            }
        }

        return lvMutatedIndividual;
    }