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(" "); }
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(" "); }
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; }
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(" "); }
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; }