public static float Calculate(char[] xstr, char[] ystr, Costs costs = null) { if (costs == null) costs = new Costs(); int xSize = xstr.Length; int ySize = ystr.Length; float[,] costMatrix = new float[xSize + 1, ySize + 1]; costMatrix[0, 0] = 0; for (int x = 1; x <= xSize; x++) { costMatrix[x, 0] = costs.Delete * x; } for (int y = 1; y <= ySize; y++) { costMatrix[0, y] = costs.Add * y; } for (int x = 1; x <= xSize; x++) { for (int y = 1; y <= ySize; y++) { char xChar = xstr[x - 1]; char yChar = ystr[y - 1]; // The default cost is to substitute the character that's supposed to be here // with anotehr character float cost = costMatrix[x - 1, y - 1] + costs.Substitute; if (xChar == yChar) // The two current characters match cost = Math.Min(cost, costMatrix[x - 1, y - 1]); else if (Char.ToLower(xChar) == Char.ToLower(yChar)) // The characters match if case insensitive cost = Math.Min(cost, costMatrix[x - 1, y - 1] + costs.CaseChange); // Cost of deletion cost = Math.Min(cost, costMatrix[x - 1, y] + costs.Delete); // Cost of addition cost = Math.Min(cost, costMatrix[x, y - 1] + costs.Add); if (x >= 2 && y >= 2 && xstr[x - 2] == yChar && ystr[y - 2] == xChar) // Transposition cost = Math.Min(cost, costMatrix[x - 2, y - 2] + costs.Transpose); costMatrix[x,y] = cost; } } return costMatrix[xstr.Length, ystr.Length]; }
/// <summary> /// Add new Value to the Column /// </summary> /// <param name="value">Value to be added.</param> public void Add(ushort value) { Costs.Add(new APValue(value)); }
public void ExecuteMetaheuristic(ref Solution bestSolution) { int bestIteration = 0; Solution partialSolution = GenericCopier <Solution> .DeepCopy(bestSolution); int control_Diversify = 0; SummaryDetails summary = new SummaryDetails(); Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_BEST_SOLUTION, bestSolution.Fitness); double pertCost = 0, vnsCost = 0; int iterations = 0; //Guardar coste inicial. summary.ILSSummary.InitCost = bestSolution.Parc_Cost; for (int i = 0; iterations < _ilsSettings.MaxILSIterations && i < _ilsSettings.MaxILSNoImprovement; i++) { //Control de intensificación-diversificación. if (i % _DIVERSIFY_MAX == 0) { _diversify--; } _diversify = _diversify < 3 ? 3 : _diversify; if (i % 100 == 0) { _diversify = _DIVERSIFY_MAX; } //Guardar valores estadísticos. var initCost = partialSolution.Parc_Cost; var initFitness = partialSolution.Fitness; Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_ILS_TOTAL_ITERATIONS, iterations + 1); //Apply VNS local search. _vns.ExecuteMetaheuristic(ref partialSolution); //Validator.ValidateSolution(ref partialSolution, _problem); bool feasible = partialSolution.Feasible; //Guardar valores estadísticos. vnsCost = Costs.ParcialCostSolution(partialSolution, _problem); // partialSolution.Parc_Cost; var vnsFitness = partialSolution.Fitness; if (vnsFitness < initFitness) { summary.ILSSummary.TotalImpPrevious++; //Incrementar el número de veces que se mejora la solución previa (perturbada). } if (bestSolution.Feasible) { if (partialSolution.Feasible && (Math.Round(partialSolution.Fitness, 2) < Math.Round(bestSolution.Fitness, 2))) { bestSolution = GenericCopier <Solution> .DeepCopy(partialSolution); //Actualizar la mejor solución con los nuevos parámetros. control_Diversify = 0; bestIteration = i; i = 0; _diversify = _DIVERSIFY_MAX; summary.ILSSummary.BestIteration = iterations + 1; //Guardar mejor iteración encontrada. summary.ILSSummary.TotalImpBest++; //Incrementar el número de veces que se mejora la mejor solución. Singleton.Instance.UpdatePenaltyTerms(partialSolution); Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_ILS_IMPROVEMENTS, summary.ILSSummary.TotalImpBest); Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_BEST_SOLUTION, Math.Round(bestSolution.Fitness, 2)); } else { control_Diversify++; } } else { if (partialSolution.Feasible || Math.Round(partialSolution.Fitness, 2) < Math.Round(bestSolution.Fitness, 2)) { if (partialSolution.Feasible && summary.ILSSummary.FirstItFeasible == null) { summary.ILSSummary.FirstItFeasible = iterations + 1; //Guardar primera iteración factible. } bestSolution = GenericCopier <Solution> .DeepCopy(partialSolution); control_Diversify = 0; i = 0; _diversify = _DIVERSIFY_MAX; summary.ILSSummary.BestIteration = iterations + 1; //Guardar mejor iteración encontrada. summary.ILSSummary.TotalImpBest++; //Incrementar el número de veces que se mejora la mejor solución. Singleton.Instance.UpdatePenaltyTerms(partialSolution); //bestSolution.Fitness = Costs.EvaluationSolution(bestSolution, _problem); Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_ILS_IMPROVEMENTS, summary.ILSSummary.TotalImpBest); Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_BEST_SOLUTION, bestSolution.Fitness); } else { control_Diversify++; } } if (control_Diversify > _diversify) { partialSolution = GenericCopier <Solution> .DeepCopy(bestSolution); control_Diversify = 0; } var perturbation = _perturbations.ExecutePerturbation(ref partialSolution); //Guardar valores estadísticos. pertCost = partialSolution.Parc_Cost; var pertFitness = partialSolution.Fitness; //Añadir resumen de la iteración. summary.VNSOperators.Add(new VNSOperators(iterations, _vns.ShiftInter, 0, _vns.WRI_IntraOP, _vns.IntraRouteInsertionOP, _vns.IntraSwap)); summary.ILSEvolution.Add(new ILSEvolution(iterations, Math.Round(initCost, 2), Math.Round(initFitness, 2), Math.Round(vnsCost, 2), Math.Round(vnsFitness, 2), perturbation, Math.Round(pertFitness, 2), Math.Round(pertCost, 2), feasible)); Splash.SplashGlobalData.SetSplashData(Constants.SPLASH_PROGRESS, Convert.ToDouble(Splash.SplashGlobalData.GetSplashData <double>(Constants.SPLASH_PROGRESS)) + _coef_Updater_Splash); //Guardar cambios de cada operador. iterations++; } //Recalcular con el proceso de 8 pasos y actualizar el coste. foreach (var vehicle in bestSolution.Vehicles) { DARPAlgorithms.EightStepsEvaluationProcedure(ref bestSolution, vehicle, _problem); } bestSolution.TotalDuration = bestSolution.Vehicles.Sum(t => t.VehicleDuration); bestSolution.TimeWindowViolation = bestSolution.Vehicles.Sum(t => t.TotalTimeWindowViolation); bestSolution.RideTimeViolation = bestSolution.Vehicles.Sum(r => r.TotalRideTimeViolation); bestSolution.DurationViolation = bestSolution.Vehicles.Sum(d => d.TotalDurationViolation); bestSolution.LoadViolation = bestSolution.Vehicles.Sum(l => l.TotalLoadViolation); bestSolution.TotalWaitingTime = bestSolution.Vehicles.Sum(t => t.TotalWaitingTime); DARPAlgorithms.UpdateConstraintsSolution(ref bestSolution, _problem); bestSolution.Fitness = Costs.EvaluationSolution(bestSolution, _problem); bestSolution.Parc_Cost = Costs.ParcialCostSolution(bestSolution, _problem); summary.ILSSummary.TotalIterations = iterations + 1; summary.ILSSummary.FinalCost = bestSolution.Parc_Cost; bestSolution.SummaryDetails = summary; }
private IEnumerable <Costs> GetUpgradeRequirementsBase(int fromStars, int toStars, SQLiteContext context, Hero upgradeHero = null) { if (upgradeHero != null && toStars == upgradeHero.MinStars) { return(null); } var upgradeData = context.UpgradeData.Where(x => x.ToStars > fromStars && x.ToStars <= toStars).ToList(); if (upgradeData.Count() == 0) { return(null); } var result = new List <Costs>(); if (upgradeHero == null) { upgradeHero = new Hero() { Name = _defaultHeroName, Faction = Factions.Specific, Stars = toStars }; } var currentFaction = upgradeHero.Faction == Factions.Any ? Factions.Specific : upgradeHero.Faction; var fodderHeroName = upgradeHero.Stars - 1 == upgradeHero.MinStars ? upgradeHero.Fodder1 : upgradeHero.Fodder2 ?? upgradeHero.Fodder1; foreach (var item in upgradeData) { var fodderList = new List <Hero>(); var req = new Costs() { IsFusion = item.IsFusion, MinStones = item.MinStones, MaxStones = item.MaxStones, MinSpirit = item.MinSpirit, MaxSpirit = item.MaxSpirit, MinGold = item.MinGold, MaxGold = item.MaxGold, ToStars = item.ToStars, FromStars = item.ToStars - 1, Hero = upgradeHero }; //Always need one of our current var currentHero = new Hero(upgradeHero) { Stars = upgradeHero.Stars - 1 }; //if(currentHero.HasCosts) // currentHero.Costs = GetCosts(currentHero); fodderList.Add(currentHero); //Any additional of the current for (var i = 0; i < item.CurrentHeroCount; i++) { fodderList.Add(new Hero(upgradeHero) { Stars = item.CurrentHeroStars }); } //Get specific fodder heroes var fodderHero = new Hero(_heroDataService.GetHero(fodderHeroName)) { Stars = item.SpecificFodderHeroStars }; for (var i = 0; i < item.SpecificFodderHeroCount; i++) { fodderList.Add(new Hero(fodderHero) { Name = fodderHero?.Name ?? _defaultHeroName, Faction = currentFaction, Stars = item.SpecificFodderHeroStars }); } //Get typed fodder heroes for (var i = 0; i < item.TypedFodderHeroCount; i++) { fodderList.Add(new Hero() { Name = _defaultHeroName, Faction = currentFaction, Stars = item.TypedFodderHeroStars }); } for (var i = 0; i < item.TypedFodderHeroCount2; i++) { fodderList.Add(new Hero() { Name = _defaultHeroName, Faction = currentFaction, Stars = item.TypedFodderHeroStars2 }); } for (var i = 0; i < item.AnyFodderHeroCount; i++) { fodderList.Add(new Hero() { Name = _defaultHeroName, Faction = Factions.Any, Stars = item.AnyFodderHeroStars }); } req.Fodder = fodderList; result.Add(req); } return(result); }
public static void SetReward(Costs reward) { MissionReward = reward; }
/// <summary> /// Calculate the cost to edit a source string into a destination string, where /// the set of possible operations (add char, delete char, substitute one char for another, /// transpose adjacent characters, or change the case of a character) can be set by the /// caller. /// </summary> /// <param name="sourceString">The string to be changed (edited).</param> /// <param name="destinationString">The string that the source string should be turned into through edits.</param> /// <param name="costs">The cost of each of the types of changes that can be made.</param> /// <returns>The lowest cost with which the edits can be made to change the <param name="sourceString"/> /// into the <paramref name="destinationString"/>.</returns> public static float Calculate(string sourceString, string destinationString, Costs costs = null) { return Calculate(sourceString.ToCharArray(), destinationString.ToCharArray(), costs); }
private void InfoCost_OnChangeIsReturn() { IncomingsAndExpenses.First().ExpenseCompensation = Costs.Where(x => x.IsReturn).Sum(c => !c.IsIncoming ? c.Summ : 0); }
private void SummChange() { IncomingsAndExpenses.First().Incoming = Costs.Sum(c => c.IsIncoming ? c.Summ : 0); IncomingsAndExpenses.First().Expense = Costs.Sum(c => !c.IsIncoming ? c.Summ : 0); }
public bool Equals(DestinyVendorSaleItemComponent input) { if (input == null) { return(false); } return (( SaleStatus == input.SaleStatus || (SaleStatus != null && SaleStatus.Equals(input.SaleStatus)) ) && ( RequiredUnlocks == input.RequiredUnlocks || (RequiredUnlocks != null && RequiredUnlocks.SequenceEqual(input.RequiredUnlocks)) ) && ( UnlockStatuses == input.UnlockStatuses || (UnlockStatuses != null && UnlockStatuses.SequenceEqual(input.UnlockStatuses)) ) && ( FailureIndexes == input.FailureIndexes || (FailureIndexes != null && FailureIndexes.SequenceEqual(input.FailureIndexes)) ) && ( Augments == input.Augments || (Augments != null && Augments.Equals(input.Augments)) ) && ( ItemValueVisibility == input.ItemValueVisibility || (ItemValueVisibility != null && ItemValueVisibility.SequenceEqual(input.ItemValueVisibility)) ) && ( VendorItemIndex == input.VendorItemIndex || (VendorItemIndex.Equals(input.VendorItemIndex)) ) && ( ItemHash == input.ItemHash || (ItemHash.Equals(input.ItemHash)) ) && ( OverrideStyleItemHash == input.OverrideStyleItemHash || (OverrideStyleItemHash.Equals(input.OverrideStyleItemHash)) ) && ( Quantity == input.Quantity || (Quantity.Equals(input.Quantity)) ) && ( Costs == input.Costs || (Costs != null && Costs.SequenceEqual(input.Costs)) ) && ( OverrideNextRefreshDate == input.OverrideNextRefreshDate || (OverrideNextRefreshDate != null && OverrideNextRefreshDate.Equals(input.OverrideNextRefreshDate)) ) && ( ApiPurchasable == input.ApiPurchasable || (ApiPurchasable != null && ApiPurchasable.Equals(input.ApiPurchasable)) )); }
protected void Page_Load(object sender, EventArgs e) { if (Request.Cookies["adminid"] != null && Request.Cookies["adminid"].Value != "") { intProfile = Int32.Parse(Request.Cookies["adminid"].Value); } else { Reload(); } oPlatform = new Platforms(intProfile, dsn); oOrganization = new Organizations(intProfile, dsn); oRequestItem = new RequestItems(intProfile, dsn); oUserAt = new Users_At(intProfile, dsn); oCost = new Costs(intProfile, dsn); oService = new Services(intProfile, dsn); oRequestField = new RequestFields(intProfile, dsn); oReport = new Reports(intProfile, dsn); oSites = new Sites(intProfile, dsn); oType = new Types(intProfile, dsn); oModel = new Models(intProfile, dsn); oRacks = new Racks(intProfile, dsn); oBanks = new Banks(intProfile, dsn); oDepot = new Depot(intProfile, dsn); oShelf = new Shelf(intProfile, dsn); oClasses = new Classes(intProfile, dsn); oRooms = new Rooms(intProfile, dsn); oFloor = new Floor(intProfile, dsn); oEnvironment = new Environments(intProfile, dsn); oForecast = new Forecast(intProfile, dsn); oSolution = new Solution(intProfile, dsn); oConfidence = new Confidence(intProfile, dsn); oLocation = new Locations(intProfile, dsn); oField = new Field(intProfile, dsn); oServiceDetail = new ServiceDetails(intProfile, dsn); oDomainController = new DomainController(intProfile, dsn); oDomain = new Domains(intProfile, dsn); oServerName = new ServerName(intProfile, dsn); oOperatingSystems = new OperatingSystems(intProfile, dsn); oOnDemand = new OnDemand(intProfile, dsn); oServicePack = new ServicePacks(intProfile, dsn); oServer = new Servers(intProfile, dsn); oHost = new Host(intProfile, dsn); oVirtualHDD = new VirtualHDD(intProfile, dsn); oVirtualRam = new VirtualRam(intProfile, dsn); oRestart = new Restart(intProfile, dsn); oSegment = new Segment(intProfile, dsn); oServiceEditor = new ServiceEditor(intProfile, dsnServiceEditor); oProjectRequest = new ProjectRequest(intProfile, dsn); oVMWare = new VMWare(intProfile, dsn); oWorkstation = new Workstations(intProfile, dsn); //oNew = new New(intProfile, dsn); oWhatsNew = new WhatsNew(intProfile, dsn); oMaintenanceWindow = new MaintenanceWindow(intProfile, dsn); //oRecoveryLocations = new RecoveryLocations(intProfile, dsn); oTSM = new TSM(intProfile, dsn); oDNS = new DNS(intProfile, dsn); oSolaris = new Solaris(intProfile, dsn); oZeus = new Zeus(intProfile, dsn); oError = new Errors(intProfile, dsn); oDesign = new Design(intProfile, dsn); oResiliency = new Resiliency(intProfile, dsn); oEnhancement = new Enhancements(intProfile, dsn); if (Request.QueryString["type"] != null && Request.QueryString["type"] != "") { lblType.Text = Request.QueryString["type"]; } if (Request.QueryString["id"] != null && Request.QueryString["id"] != "") { lblId.Text = Request.QueryString["id"]; } string strControl = ""; if (Request.QueryString["control"] != null) { strControl = Request.QueryString["control"]; } btnSave.Attributes.Add("onclick", "return Update('hdnUpdateOrder','" + strControl + "');"); btnClose.Attributes.Add("onclick", "return HidePanel();"); imgOrderUp.Attributes.Add("onclick", "return MoveOrderUp(" + lstOrder.ClientID + ");"); imgOrderDown.Attributes.Add("onclick", "return MoveOrderDown(" + lstOrder.ClientID + ");"); LoadList(); }
public BaseTraveler(int startLocation) { CurrentLocation = startLocation; costs = new Costs(); }
private static AButton[] GetButtons(ContentManager content) { var buttonPositionX = 195; const int buttonPositionY = 700; const int buttonWidth = 175; const int buttonHeight = 175; const int buttonPaddingX = 20; var buildingTypes = new List<UnitTypes> { UnitTypes.Gate, UnitTypes.Wall }; var buildingModels = new Dictionary<UnitTypes, ModelManager.Model> { {UnitTypes.Gate, ModelManager.GetInstance().Gate}, {UnitTypes.Wall, ModelManager.GetInstance().Wall} }; var buildingDisplayNames = new Dictionary<UnitTypes, string> { {UnitTypes.Gate, Properties.BuildMenuPanel.Gate}, {UnitTypes.Wall, Properties.BuildMenuPanel.Wall} }; var buttons = new List<AButton>(); foreach (var building in buildingTypes) { var buildingText = new[] {buildingDisplayNames[building], Costs.SerializeUnitCost(building)}; buttons.Add(new BuildButton(content, buttonPositionX, buttonPositionY, buttonWidth, buttonHeight, building, false, buildingText, buildingModels[building])); buttonPositionX += buttonWidth + buttonPaddingX; } const int deleteButtonHeight = 40; buttons.Add(new BuildButton(content, buttonPositionX, buttonPositionY + buttonHeight - deleteButtonHeight, buttonWidth, deleteButtonHeight, null, false, new[] {Properties.BuildMenuPanel.Delete}, null)); buttons.Add(new BuildButton(content, buttonPositionX, buttonPositionY + buttonHeight - 3 * deleteButtonHeight, buttonWidth, deleteButtonHeight, null, true, new[] {Properties.BuildMenuPanel.ToggleGate}, null)); return buttons.ToArray(); }
public IEnumerable <Costs> GetAllCosts() { return(Costs.GetAll()); }
public IEnumerable <CostClone> GetCostByInstanceId(int instanceId, string username) { return(Costs.GetCostByInstanceId(instanceId, username)); //return Costs.GetAll(); //return new string[] { "value1", "value2" }; }
/// <summary> /// Método principal para la construcción de úna solución DARP inicial. /// </summary> /// <param name="solution"></param> /// <param name="problem"></param> internal static void BuildInitialSolution(ref Solution solution, Problem problem, ref Random _random) { var upperT = 0.0; var lowerT = 0.0; var diff = 0.0; foreach (var request in problem.Requests) { if (request.ID_Unique == 0) { continue; } if (request.IsCritical) { upperT += request.TimeWindow.UpperBound; lowerT += request.TimeWindow.LowerBound; diff += (request.TimeWindow.UpperBound - request.TimeWindow.LowerBound); } } //Ordenar los n clientes (Total REquests / 2) por su media de tiempo de ventana. var requestsOrder = problem.Requests.Where(t => !t.RequestType.Equals(Request.TypeOfRequest.DEPOT)).Take(problem.TotalCustomers).OrderBy(t => (t.TimeWindow.LowerBound + t.TimeWindow.UpperBound) / 2).ToList(); requestsOrder = requestsOrder.GetRange(0, requestsOrder.Count); //Coger los N clientes, omitiendo el depósito. //Inicializar matriz de arcos factibles. //problem.CalculateAvgTimeWindow(true); problem.CalculateFeasibleArcs(0); //Crear vehículos. List <Vehicle> vehicles = new List <Vehicle>(); int i; for (i = 0; i < problem.NumVehicles; i++) { vehicles.Add(new Vehicle()); } var index = 0; foreach (var request in requestsOrder) { if (index < problem.NumVehicles) { //Añadir los m primeros uno en cada vehículo.. request.RequiredLoad = 1; vehicles[index].Requests.Add(request); //Inicio petición. var destination = problem.Requests.Find(t => t.PairID == request.PairID && t.Origin != request.Origin); vehicles[index].Requests.Add(destination); //Se añade también el final de la petición. index++; } else { //Los n - m restantes se irán insertando por cercanía en base a la regla de los 4 criterios. InsertRequestBy4Criterion(ref solution, vehicles, request, problem, ref _random); } } solution.AddVehicles(vehicles, problem); foreach (var vehicle in solution.Vehicles) { EightStepsEvaluationProcedure(ref solution, vehicle, problem); } //Actualizar estado de la solución. solution.TotalDuration = solution.Vehicles.Sum(t => t.VehicleDuration); solution.TimeWindowViolation = solution.Vehicles.Sum(t => t.TotalTimeWindowViolation); solution.RideTimeViolation = solution.Vehicles.Sum(r => r.TotalRideTimeViolation); solution.DurationViolation = solution.Vehicles.Sum(d => d.TotalDurationViolation); solution.LoadViolation = solution.Vehicles.Sum(l => l.TotalLoadViolation); solution.TotalWaitingTime = solution.Vehicles.Sum(t => t.TotalWaitingTime); solution.Fitness = Costs.EvaluationSolution(solution, problem); PrintDataCSV(problem); }
private void SwapPerturbation(ref Solution solution) { solution.Vehicles = solution.Vehicles.Select(t => { t.Perturbed = false; return(t); }).ToList(); //Seleccionar el primer vehículo. int v1 = _random.Next(0, PerturbationMechanism.Keys.Count); if (PerturbationMechanism[v1].Count == 0) { ResetPerturbationMechanism(false, v1); } int v2; do { v2 = PerturbationMechanism[v1][_random.Next(0, PerturbationMechanism[v1].Count)]; }while (v1 == v2); PerturbationMechanism[v1].Remove(v2); PerturbationMechanism[v2].Remove(v1); var posA = _random.Next(1, solution.Vehicles[v1].Requests.Count - 1); var node1 = solution.Vehicles[v1].Requests[posA]; var node2 = solution.Vehicles[v1].Requests.Find(t => t.PairID == node1.PairID && t.Origin != node1.Origin); var posB = solution.Vehicles[v1].Requests.IndexOf(node2); //Determinamos nodo crítico (será el primero a insertar). Request originA; Request destinationA; int posOriginA = -1; int posDestinationA = -1; if (node1.Origin) { originA = node1; destinationA = node2; posOriginA = posA; posDestinationA = posB; } else { originA = node2; destinationA = node1; posOriginA = posB; posDestinationA = posA; } int minPos = -1; double min = Double.MaxValue; for (int i = 1; i < solution.Vehicles[v2].Requests.Count - 1; i++) { //if (!ValidTimeWindow(solution, node1, _problem, i + 1, v2)) continue; // var distance = Problem.EuclideanDistance(node1.TimeWindow.LowerBound, node1.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[i].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[i].TimeWindow.UpperBound); double twDist = 0.0; if (i == 1) { if (!ValidTimeWindow(solution, node1, _problem, i + 1, v2)) { continue; } twDist = CalculateDistance(node1, v2, i - 1, solution); } else if (i == solution.Vehicles[v2].Requests.Count - 2) { if (!ValidTimeWindow(solution, node1, _problem, i - 1, v2)) { continue; } twDist = CalculateDistance(node1, v2, i - 1, solution); } else { if (!ValidTimeWindow(solution, node1, _problem, i + 1, v2) || !ValidTimeWindow(solution, node1, _problem, i - 1, v2)) { continue; } twDist = (CalculateDistance(node1, v2, i + 1, solution) + CalculateDistance(node1, v2, i - 1, solution)) / 2.0; } if (twDist < min) { minPos = i; min = twDist; } } if (minPos == -1) { return; } var nodeB1 = solution.Vehicles[v2].Requests[minPos]; var nodeB2 = solution.Vehicles[v2].Requests.Find(t => t.PairID == nodeB1.PairID && t.Origin != nodeB1.Origin); var posNodeB2 = solution.Vehicles[v2].Requests.IndexOf(nodeB2); //Determinamos nodo crítico (será el primero a insertar). Request originB; Request destinationB; if (nodeB1.Origin) { originB = nodeB1; destinationB = nodeB2; } else { originB = nodeB2; destinationB = nodeB1; var aux = minPos; minPos = posNodeB2; posNodeB2 = aux; } solution.Vehicles[v2].Requests[minPos] = originA; solution.Vehicles[v2].Requests[posNodeB2] = destinationA; solution.Vehicles[v1].Requests[posOriginA] = originB; solution.Vehicles[v1].Requests[posDestinationA] = destinationB; Validator.Positions(ref solution, _problem); solution.Vehicles[v2].Perturbed = true; solution.Vehicles[v1].Perturbed = true; DARPAlgorithms.EightStepsEvaluationProcedure(ref solution, solution.Vehicles[v1], _problem); DARPAlgorithms.EightStepsEvaluationProcedure(ref solution, solution.Vehicles[v2], _problem); solution.TotalDuration = solution.Vehicles.Sum(t => t.VehicleDuration); solution.TimeWindowViolation = solution.Vehicles.Sum(t => t.TotalTimeWindowViolation); solution.RideTimeViolation = solution.Vehicles.Sum(r => r.TotalRideTimeViolation); solution.DurationViolation = solution.Vehicles.Sum(d => d.TotalDurationViolation); solution.LoadViolation = solution.Vehicles.Sum(l => l.TotalLoadViolation); solution.TotalWaitingTime = solution.Vehicles.Sum(t => t.TotalWaitingTime); solution.Fitness = Costs.EvaluationSolution(solution, _problem); Validator.Positions(ref solution, _problem); }
void Start() { LangSystem.Init(); dateControl.Load(); amountControl.Load(); // Загрузка сохранений if (PlayerPrefs.HasKey("Incomes")) { incomes = JsonUtility.FromJson <Incomes>(PlayerPrefs.GetString("Incomes")); } if (PlayerPrefs.HasKey("Costs")) { costs = JsonUtility.FromJson <Costs>(PlayerPrefs.GetString("Costs")); } if (PlayerPrefs.HasKey("Purses")) { purses = JsonUtility.FromJson <Purses>(PlayerPrefs.GetString("Purses")); } if (dateControl.HasMonthPassed()) { UpdateMonth(); } else if (dateControl.IsDayEnd()) { UpdateDayStat(); } dateControl.Render(); amountControl.Render(); incomeControl.LoadAndRender(); costControl.LoadAndRender(); pursesControl.LoadAndRender(); // Language Loading //Lang lang = LangSystem.Load(); LangSystem.Init(); LangSystem.Load(); for (int i = 0; i < tMenuOther.Length; i++) { tMenuOther[i].text = LangSystem.lang.Menu_Other[i]; } for (int i = 0; i < tCostsInfo.Length; i++) { tCostsInfo[i].text = LangSystem.lang.CostsInfo[i]; } for (int i = 0; i < tPursesInfo.Length; i++) { tPursesInfo[i].text = LangSystem.lang.PursesInfo[i]; } for (int i = 0; i < tIncomesInfo.Length; i++) { tIncomesInfo[i].text = LangSystem.lang.IncomesInfo[i]; } for (int i = 0; i < tSwitcher.Length; i++) { tSwitcher[i].text = LangSystem.lang.Switcher[i]; } for (int i = 0; i < tItemInfo.Length; i++) { tItemInfo[i].text = LangSystem.lang.ItemInfo[i]; } for (int i = 0; i < tPurseInfo.Length; i++) { tPurseInfo[i].text = LangSystem.lang.PurseInfo[i]; } for (int i = 0; i < tAddingControl.Length; i++) { tAddingControl[i].text = LangSystem.lang.AddingControl[i]; } for (int i = 0; i < tAddingPurse.Length; i++) { tAddingPurse[i].text = LangSystem.lang.AddingPurse[i]; } for (int i = 0; i < tNoPursesModal.Length; i++) { tNoPursesModal[i].text = LangSystem.lang.NoPursesModal[i]; } }
private void SpecialPerturbation(ref Solution solution) { solution.Vehicles = solution.Vehicles.Select(t => { t.Perturbed = true; return(t); }).ToList(); //1. Sacar un vehículo aleatorio. var vehicle = solution.Vehicles[_random.Next(0, solution.Vehicles.Count - 1)]; List <int> numbers = new List <int>(); //2. Sacar un cliente crítico. var client = vehicle.Requests[_random.Next(1, vehicle.Requests.Count - 1)]; List <Tuple <Request, Tuple <int, int> > > data = new List <Tuple <Request, Tuple <int, int> > >(); if (!client.Origin) { client = vehicle.Requests.Find(t => t.Origin && t.PairID == client.PairID); } var vehicle_pos = solution.Vehicles.IndexOf(vehicle); var client_pos = vehicle.Requests.IndexOf(client); numbers.Add(client.PairID); data.Add(new Tuple <Request, Tuple <int, int> >(client, new Tuple <int, int>(vehicle_pos, client_pos))); //3. Sacar sus N vecinos críticos. var neighbours = _problem.CloseTWMatrix[client.ID_Unique]; List <Request> vecinos = new List <Request>(); for (int i = 0; vecinos.Count < Convert.ToInt32(Math.Sqrt(_problem.NumRequests)) && i < neighbours.Count; i++) { if (_problem.Requests.Find(t => t.ID_Unique == neighbours[i]).Origin) { vecinos.Add(_problem.Requests.Find(t => t.ID_Unique == neighbours[i])); numbers.Add(vecinos[vecinos.Count - 1].PairID); } } //4. Sacar vehículo y posición de cada uno foreach (var v in vecinos) { for (int i = 0; i < solution.Vehicles.Count; i++) { if (solution.Vehicles[i].Requests.Find(t => t.ID_Unique == v.ID_Unique) != null) { data.Add(new Tuple <Request, Tuple <int, int> >(v, new Tuple <int, int>(i, solution.Vehicles[i].Requests.IndexOf(solution.Vehicles[i].Requests.Find(t => t.ID_Unique == v.ID_Unique))))); } } } List <Tuple <Request, Tuple <int, int> > > movements = new List <Tuple <Request, Tuple <int, int> > >(); foreach (var element in data) { var request = element.Item1; int selected = -1; if (numbers.Count == 1 && numbers.First() == element.Item1.PairID) { break; } //5. Mezclarlos. do { selected = numbers[_random.Next(0, numbers.Count)]; }while (selected == request.ID_Unique); numbers.Remove(selected); //eliminarlo. var posInterchange = data.Find(t => t.Item1.ID_Unique == selected); //solution.Vehicles[element.Item2.Item1].Requests[element.Item2.Item2] = posInterchange.Item1; //solution.Vehicles[posInterchange.Item2.Item1].Requests[posInterchange.Item2.Item2] = element.Item1; //los destinos. var destinoElement = solution.Vehicles[element.Item2.Item1].Requests.Find(t => t.PairID == element.Item1.PairID && t.Origin == false); var destinoInterchange = solution.Vehicles[posInterchange.Item2.Item1].Requests.Find(t => t.PairID == posInterchange.Item1.PairID && t.Origin == false); //solution.Vehicles[element.Item2.Item1].Requests[solution.Vehicles[element.Item2.Item1].Requests.IndexOf(destinoElement)] = destinoInterchange; //solution.Vehicles[posInterchange.Item2.Item1].Requests[solution.Vehicles[posInterchange.Item2.Item1].Requests.IndexOf(destinoInterchange)] = destinoElement; movements.Add(new Tuple <Request, Tuple <int, int> >(element.Item1, new Tuple <int, int>(posInterchange.Item2.Item1, posInterchange.Item2.Item2))); movements.Add(new Tuple <Request, Tuple <int, int> >(destinoElement, new Tuple <int, int>(posInterchange.Item2.Item1, solution.Vehicles[posInterchange.Item2.Item1].Requests.IndexOf(destinoInterchange)))); } foreach (var entry in movements) { solution.Vehicles[entry.Item2.Item1].Requests[entry.Item2.Item2] = entry.Item1; } //Recalcular con el proceso de 8 pasos y actualizar el coste. foreach (var veh in solution.Vehicles) { DARPAlgorithms.EightStepsEvaluationProcedure(ref solution, veh, _problem); } solution.TotalDuration = solution.Vehicles.Sum(t => t.VehicleDuration); solution.TimeWindowViolation = solution.Vehicles.Sum(t => t.TotalTimeWindowViolation); solution.RideTimeViolation = solution.Vehicles.Sum(r => r.TotalRideTimeViolation); solution.DurationViolation = solution.Vehicles.Sum(d => d.TotalDurationViolation); solution.LoadViolation = solution.Vehicles.Sum(l => l.TotalLoadViolation); solution.TotalWaitingTime = solution.Vehicles.Sum(t => t.TotalWaitingTime); DARPAlgorithms.UpdateConstraintsSolution(ref solution, _problem); solution.Fitness = Costs.EvaluationSolution(solution, _problem); }
private void RefreshFilters() { if (RCs == null || InOuts == null || TransportCompanies == null || Notes == null) { return; } SelectedRC = RCs.First(); SelectedInOut = InOuts.First(); SelectedTransportCompany = TransportCompanies.First(); SelectedNote = Notes.First(); Filter(); BC.DataContext.Configuration.AutoDetectChangesEnabled = false; RCs.Clear(); var rcEmpty = new DirectoryRC { Name = null }; RCs.Add(rcEmpty); foreach (var rc in Costs.Select(c => c.DirectoryRC).Distinct()) { RCs.Add(rc); } InOuts.Clear(); InOuts.Add(""); if (Costs.Any(c => c.IsIncoming)) { InOuts.Add("Приход"); } if (Costs.Any(c => !c.IsIncoming)) { InOuts.Add("Расход"); } TransportCompanies.Clear(); var transportCompanyEmpty = new DirectoryTransportCompany { Name = null }; TransportCompanies.Add(transportCompanyEmpty); foreach (var transportCompany in Costs.Select(c => c.DirectoryTransportCompany).Where(t => t != null).Distinct()) { TransportCompanies.Add(transportCompany); } Notes.Clear(); var noteEmpty = new DirectoryNote { Description = null }; Notes.Add(noteEmpty); foreach (var masNotes in Costs.Select(c => c.CurrentNotes.Select(n => n.DirectoryNote))) { foreach (var note in masNotes) { if (!Notes.Contains(note)) { Notes.Add(note); } } } OrderNotes(); BC.DataContext.Configuration.AutoDetectChangesEnabled = true; }
private void ChainPerturbation(ref Solution solution) { try { //marcar todos los vehículos como no perturbados. solution.Vehicles = solution.Vehicles.Select(t => { t.Perturbed = false; return(t); }).ToList(); //Seleccionar el primer vehículo. int v1 = _random.Next(0, PerturbationMechanism.Keys.Count); if (PerturbationMechanism[v1].Count == 0) { ResetPerturbationMechanism(false, v1); } int v2; do { v2 = PerturbationMechanism[v1][_random.Next(0, PerturbationMechanism[v1].Count)]; }while (v1 == v2); //routes.Remove(v2); PerturbationMechanism[v1].Remove(v2); PerturbationMechanism[v2].Remove(v1); //Seleccionar el tamaño de la cadena int maxSizeR1 = Math.Min(2, solution.Vehicles[v1].Requests.Count - 2); int maxSizeR2 = Math.Min(2, solution.Vehicles[v2].Requests.Count - 2); if (maxSizeR1 == 0) { maxSizeR1 = 1; } if (maxSizeR2 == 0) { maxSizeR2 = 1; } int size_R1 = _random.Next(1, maxSizeR1); int size_R2 = _random.Next(1, maxSizeR2); //Posición inicial desde la que coger elementos. int init_PosR1 = _random.Next(1, solution.Vehicles[v1].Requests.Count - 1); int init_PosR2 = _random.Next(1, solution.Vehicles[v2].Requests.Count - 1); if (init_PosR1 <= 0) { init_PosR1 = 1; } if (init_PosR2 <= 0) { init_PosR2 = 1; } //Obtener los elementos seleccionados en cada rango. var elementsR1 = solution.Vehicles[v1].Requests.GetRange(init_PosR1, size_R1); var elementsR2 = solution.Vehicles[v2].Requests.GetRange(init_PosR2, size_R2); foreach (var element in elementsR1) { solution.Vehicles[v1].Requests.RemoveAll(t => t.PairID == element.ID_Unique); } foreach (var element in elementsR2) { solution.Vehicles[v2].Requests.RemoveAll(t => t.PairID == element.ID_Unique); } //Marcar ambas rutas como perturbadas. solution.Vehicles[v1].Perturbed = true; solution.Vehicles[v2].Perturbed = true; List <Node> chainR1ToR2 = new List <Node>(); List <Node> chainR2ToR1 = new List <Node>(); List <int> tabu = new List <int>(); foreach (var node in elementsR1) { if (tabu.Contains(node.PairID)) { continue; } tabu.Add(node.PairID); var secondNode = _problem.Requests.Find(t => t.PairID == node.PairID && t.Origin != node.Origin); //solution.Vehicles[v1].Requests.RemoveAll(t => t.PairID.Equals(node.PairID)); //Eliminar el destino y el origen Request criticalNode; Request notCriticalNode; if (node.IsCritical) { criticalNode = node; notCriticalNode = secondNode; } else { criticalNode = secondNode; notCriticalNode = node; } double min_Dif = double.MaxValue; int bestCriticalPos = -1; //Si el nodo actual es crítico, insertarlo en su primera posición válida respecto a TW. for (int i = 1; i < solution.Vehicles[v2].Requests.Count; i++) { //if (!_problem.FeasibleTravel[solution.Vehicles[v2].Requests[i].ID_Unique][criticalNode.ID_Unique]) continue; double twDist = 0.0; if (i == 1) { if ((criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[i].ID_Unique]) > solution.Vehicles[v2].Requests[i].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(criticalNode, v2, i, solution); } else if (i == solution.Vehicles[v2].Requests.Count - 1) { if ((solution.Vehicles[v2].Requests[i - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[i - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(criticalNode, v2, i - 1, solution); } else { if (((solution.Vehicles[v2].Requests[i - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[i - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) || (criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[i].ID_Unique]) > solution.Vehicles[v2].Requests[i].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(criticalNode, v2, i, solution) + CalculateDistance(criticalNode, v2, i - 1, solution)) / 2.0; } if (twDist < min_Dif) { min_Dif = twDist; bestCriticalPos = i; } } if (bestCriticalPos == -1) { bestCriticalPos = 1; solution.Vehicles[v2].Requests.Insert(1, criticalNode); } else { solution.Vehicles[v2].Requests.Insert(bestCriticalPos, criticalNode); } //La posición actual es válida para insertar el nodo crítico. Insertar el no crítico en su mejor posición if (criticalNode.Origin) { double bestCost = double.PositiveInfinity; int bestPos = bestCriticalPos + 1; //Insertar el nodo no crítico después. for (int j = bestCriticalPos + 1; j < solution.Vehicles[v2].Requests.Count; j++) { if (!_problem.FeasibleTravel[notCriticalNode.ID_Unique][solution.Vehicles[v2].Requests[j].ID_Unique]) { continue; } //var diff = Problem.EuclideanDistance(notCriticalNode.TimeWindow.LowerBound, notCriticalNode.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.UpperBound); double twDist = 0.0; if (j == solution.Vehicles[v2].Requests.Count - 1) { if ((solution.Vehicles[v2].Requests[j - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[j - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(notCriticalNode, v2, j - 1, solution); } else { if (((solution.Vehicles[v2].Requests[j - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[j - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) || (criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[j].ID_Unique]) > solution.Vehicles[v2].Requests[j].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(notCriticalNode, v2, j, solution) + CalculateDistance(notCriticalNode, v2, j - 1, solution)) / 2.0; } if (twDist < bestCost) { bestPos = j; bestCost = twDist; } } //Insertar en la mejor posición declarada. solution.Vehicles[v2].Requests.Insert(bestPos, notCriticalNode); } else //El nodo no crítico es el origen. { double bestCost = double.PositiveInfinity; int bestPos = bestCriticalPos; //Insertar el nodo no crítico después. //Insertar el nodo no crítico antes. for (int j = bestCriticalPos; j > 0; j--) { if (!_problem.FeasibleTravel[solution.Vehicles[v2].Requests[j - 1].ID_Unique][notCriticalNode.ID_Unique]) { continue; } //var diff = Problem.EuclideanDistance(notCriticalNode.TimeWindow.LowerBound, notCriticalNode.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.UpperBound); double twDist = 0.0; if (j == 1) { if ((criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[j].ID_Unique]) > solution.Vehicles[v2].Requests[j].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(notCriticalNode, v2, j, solution); } else { if (((solution.Vehicles[v2].Requests[j - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[j - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) || (criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v2].Requests[j].ID_Unique]) > solution.Vehicles[v2].Requests[j].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(notCriticalNode, v2, j, solution) + CalculateDistance(notCriticalNode, v2, j - 1, solution)) / 2.0; } if (twDist < bestCost) { bestPos = j; bestCost = twDist; } } //Insertar en la mejor posición declarada. solution.Vehicles[v2].Requests.Insert(bestPos, notCriticalNode); //break; //terminamos. } } //Mismo proceso para los elementos de R2. tabu.Clear(); foreach (var node in elementsR2) { if (tabu.Contains(node.PairID)) { continue; } tabu.Add(node.PairID); var secondNode = _problem.Requests.Find(t => t.PairID == node.PairID && t.Origin != node.Origin); //solution.Vehicles[v2].Requests.Find(t => t.PairID == node.PairID && t.Origin != node.Origin); //solution.Vehicles[v2].Requests.RemoveAll(t => t.PairID.Equals(node.PairID)); //Eliminar el destino y el origen Request criticalNode; Request notCriticalNode; if (node.IsCritical) { criticalNode = node; notCriticalNode = secondNode; } else { criticalNode = secondNode; notCriticalNode = node; } double min_Dif = double.MaxValue; int bestCriticalPos = -1; //Si el nodo actual es crítico, insertarlo en su primera posición válida respecto a TW. for (int i = 1; i < solution.Vehicles[v1].Requests.Count; i++) { double twDist = 0.0; if (i == 1) { if ((criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[i].ID_Unique]) > solution.Vehicles[v1].Requests[i].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(criticalNode, v1, i, solution); } else if (i == solution.Vehicles[v1].Requests.Count - 1) { if ((solution.Vehicles[v1].Requests[i - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[i - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(criticalNode, v1, i - 1, solution); } else { if (((solution.Vehicles[v1].Requests[i - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[i - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) || (criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[i].ID_Unique]) > solution.Vehicles[v1].Requests[i].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(criticalNode, v1, i, solution) + CalculateDistance(criticalNode, v1, i - 1, solution)) / 2.0; } if (twDist < min_Dif) { min_Dif = twDist; bestCriticalPos = i; } } if (bestCriticalPos == -1) { bestCriticalPos = 1; solution.Vehicles[v1].Requests.Insert(1, criticalNode); } else { solution.Vehicles[v1].Requests.Insert(bestCriticalPos, criticalNode); } //La posición actual es válida para insertar el nodo crítico. Insertar el no crítico en su mejor posición if (criticalNode.Origin) { double bestCost = double.PositiveInfinity; int bestPos = bestCriticalPos + 1; //Insertar el nodo no crítico después. for (int j = bestCriticalPos + 1; j < solution.Vehicles[v1].Requests.Count; j++) { if (!_problem.FeasibleTravel[notCriticalNode.ID_Unique][solution.Vehicles[v1].Requests[j].ID_Unique]) { continue; } //var diff = Problem.EuclideanDistance(notCriticalNode.TimeWindow.LowerBound, notCriticalNode.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.UpperBound); double twDist = 0.0; if (j == solution.Vehicles[v1].Requests.Count - 1) { if ((solution.Vehicles[v1].Requests[j - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[j - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(notCriticalNode, v1, j - 1, solution); } else { if (((solution.Vehicles[v1].Requests[j - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[j - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) || (criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[j].ID_Unique]) > solution.Vehicles[v1].Requests[j].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(notCriticalNode, v1, j, solution) + CalculateDistance(notCriticalNode, v1, j - 1, solution)) / 2.0; } if (twDist < bestCost) { bestPos = j; bestCost = twDist; } } //Insertar en la mejor posición declarada. solution.Vehicles[v1].Requests.Insert(bestPos, notCriticalNode); //break; //terminamos. } else //El nodo no crítico es el origen. { double bestCost = double.PositiveInfinity; int bestPos = bestCriticalPos; //Insertar el nodo no crítico después. //Insertar el nodo no crítico antes. for (int j = bestCriticalPos; j > 0; j--) { if (!_problem.FeasibleTravel[solution.Vehicles[v1].Requests[j - 1].ID_Unique][notCriticalNode.ID_Unique]) { continue; } //var diff = Problem.EuclideanDistance(notCriticalNode.TimeWindow.LowerBound, notCriticalNode.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[j + 1].TimeWindow.UpperBound); double twDist = 0.0; if (j == 1) { if ((criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[j].ID_Unique]) > solution.Vehicles[v1].Requests[j].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(notCriticalNode, v1, j, solution); } else { if (((solution.Vehicles[v1].Requests[j - 1].TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[j - 1].ID_Unique]) > criticalNode.TimeWindow.UpperBound) || (criticalNode.TimeWindow.LowerBound + _problem.Distances[criticalNode.ID_Unique][solution.Vehicles[v1].Requests[j].ID_Unique]) > solution.Vehicles[v1].Requests[j].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(notCriticalNode, v1, j, solution) + CalculateDistance(notCriticalNode, v1, j - 1, solution)) / 2.0; } if (twDist < bestCost) { bestPos = j; bestCost = twDist; } } //Insertar en la mejor posición declarada. solution.Vehicles[v1].Requests.Insert(bestPos, notCriticalNode); //break; //terminamos. } } //CorrectPositions(solution.Vehicles); //Recalcular con el proceso de 8 pasos y actualizar el coste. foreach (var vehicle in solution.Vehicles) { DARPAlgorithms.EightStepsEvaluationProcedure(ref solution, vehicle, _problem); } solution.TotalDuration = solution.Vehicles.Sum(t => t.VehicleDuration); solution.TimeWindowViolation = solution.Vehicles.Sum(t => t.TotalTimeWindowViolation); solution.RideTimeViolation = solution.Vehicles.Sum(r => r.TotalRideTimeViolation); solution.DurationViolation = solution.Vehicles.Sum(d => d.TotalDurationViolation); solution.LoadViolation = solution.Vehicles.Sum(l => l.TotalLoadViolation); solution.TotalWaitingTime = solution.Vehicles.Sum(t => t.TotalWaitingTime); solution.Fitness = Costs.EvaluationSolution(solution, _problem); Validator.ValidateSolution(ref solution, _problem); } catch (Exception ex) { Console.WriteLine(); } }
public ActionResult Create([Bind(Include = "CostTypeID,Amount,Date,Note,Description")] Costs costs, string VehicleID, string TransportationLogID) { if (ModelState.IsValid) { costs.CostID = Guid.NewGuid(); costs.DateCreated = DateTime.Now; costs.DateModified = costs.DateCreated; costs.CreatedBy = Guid.Parse(User.Identity.GetUserId()); costs.ModifiedBy = costs.CreatedBy; db.Costs.Add(costs); db.SaveChanges(); // Da shranis v tabelo VehicleCosts if (VehicleID != null) { Guid latestCostID = costs.CostID; VehicleCosts vehicleCosts = new VehicleCosts(); vehicleCosts.VehicleCostID = Guid.NewGuid(); vehicleCosts.DateCreated = costs.DateCreated; vehicleCosts.DateModified = costs.DateModified; vehicleCosts.CreatedBy = costs.CreatedBy; vehicleCosts.ModifiedBy = costs.ModifiedBy; vehicleCosts.VehicleID = Guid.Parse(VehicleID); vehicleCosts.CostID = latestCostID; db.VehicleCosts.Add(vehicleCosts); db.SaveChanges(); return(RedirectToAction("Details/" + VehicleID, "Vehicles")); } // Da shranis v tabelo TransporationLog if (TransportationLogID != null) { Guid latestCostID = costs.CostID; DrivingCosts drivingCosts = new DrivingCosts(); drivingCosts.DrivingCostID = Guid.NewGuid(); drivingCosts.DateCreated = costs.DateCreated; drivingCosts.DateModified = costs.DateModified; drivingCosts.CreatedBy = costs.CreatedBy; drivingCosts.ModifiedBy = costs.ModifiedBy; drivingCosts.TransportationLogID = Guid.Parse(TransportationLogID); drivingCosts.CostID = latestCostID; db.DrivingCosts.Add(drivingCosts); db.SaveChanges(); return(RedirectToAction("Details/" + TransportationLogID, "TransportationLog")); } return(RedirectToAction("Index")); } ViewBag.CostTypeID = new SelectList(db.CostTypes, "CostTypeID", "Name", costs.CostTypeID); return(View(costs)); }
private void ShiftPerturbation(ref Solution solution) { int v1 = -1, v2 = -1; //marcar todos los vehículos como no perturbados. solution.Vehicles = solution.Vehicles.Select(t => { t.Perturbed = true; return(t); }).ToList(); //Recorrer todos los vehículos //for (int v = 0; v < solution.Vehicles.Count; v++) //{ //Seleccionar el primer vehículo. do { v1 = _random.Next(0, PerturbationMechanism.Keys.Count); }while (solution.Vehicles[v1].Requests.Count <= 4); if (PerturbationMechanism[v1].Count == 0) { ResetPerturbationMechanism(false, v1); } do { v2 = PerturbationMechanism[v1][_random.Next(0, PerturbationMechanism[v1].Count)]; }while (v1 == v2); //Seleccionar aleatoriamente un cliente de v1. List <Request> nodes = new List <Request>(); var node = solution.Vehicles[v1].Requests[_random.Next(1, solution.Vehicles[v1].Requests.Count - 1)]; nodes = solution.Vehicles[v1].Requests.FindAll(t => t.PairID.Equals(node.PairID)); //Extraemos inicio y destino. //Siguiente paso. Insertarlos en su mejor posición posible. var origin = nodes.Find(t => t.Origin == true); int posOrigin = solution.Vehicles[v1].Requests.IndexOf(origin); var destination = nodes.Find(t => t.Origin == false); int posDestination = solution.Vehicles[v1].Requests.IndexOf(destination); if (solution.Vehicles[v2].Requests.Count == 2) { solution.Vehicles[v2].Requests.Insert(1, destination); solution.Vehicles[v2].Requests.Insert(1, origin); } else { solution.Vehicles[v1].Requests.RemoveAll(t => t.PairID.Equals(nodes.First().PairID)); //Los eliminamos de su ruta inicio. //Determinamos nodo crítico (será el primero a insertar). Request critical; Request notCritical; if (origin.IsCritical) { critical = origin; notCritical = destination; } else { critical = destination; notCritical = origin; } //Seleccionar posiciones en el vehículo v2 Dictionary <int, int> bestPair = new Dictionary <int, int>(); int bestPosSource = -1; double min = double.MaxValue; for (int pos = 1; pos < solution.Vehicles[v2].Requests.Count; pos++) { double twDist = 0.0; if (pos == 1) { if ((critical.TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[pos].ID_Unique]) > solution.Vehicles[v2].Requests[pos].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(critical, v2, pos, solution); } else if (pos == solution.Vehicles[v2].Requests.Count - 1) { if ((solution.Vehicles[v2].Requests[pos].TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[pos].ID_Unique]) > critical.TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(critical, v2, pos - 1, solution); } else { if (((solution.Vehicles[v2].Requests[pos - 1].TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[pos - 1].ID_Unique]) > critical.TimeWindow.UpperBound) || (critical.TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[pos].ID_Unique]) > solution.Vehicles[v2].Requests[pos].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(critical, v2, pos, solution) + CalculateDistance(critical, v2, pos - 1, solution)) / 2.0; } if (twDist < min) { bestPosSource = pos; min = twDist; } } if (bestPosSource == -1) //Insertar en pos = 1; { bestPosSource = 1; } solution.Vehicles[v2].Requests.Insert(bestPosSource, critical); int notCriticalPos = -1; min = double.MaxValue; //Insertar no crítico. if (critical.Origin) { //De pos en adelante. for (int init = bestPosSource + 1; init < solution.Vehicles[v2].Requests.Count; init++) { if ((solution.Vehicles[v2].Requests[init - 1].TimeWindow.LowerBound + _problem.Distances[solution.Vehicles[v2].Requests[init - 1].ID_Unique][notCritical.ID_Unique]) > notCritical.TimeWindow.UpperBound) { continue; } double twDist = 0.0; if (init == solution.Vehicles[v2].Requests.Count) { if ((solution.Vehicles[v2].Requests[init - 1].TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[init - 1].ID_Unique]) > critical.TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(critical, v2, init - 1, solution); } else { if (((solution.Vehicles[v2].Requests[init - 1].TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[init - 1].ID_Unique]) > critical.TimeWindow.UpperBound) || (critical.TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[init].ID_Unique]) > solution.Vehicles[v2].Requests[init].TimeWindow.UpperBound) { continue; } twDist = (CalculateDistance(critical, v2, init, solution) + CalculateDistance(critical, v2, init - 1, solution)) / 2.0; } //var diff = Problem.EuclideanDistance(notCritical.TimeWindow.LowerBound, notCritical.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[init - 1].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[init - 1].TimeWindow.UpperBound); if (twDist < min) { notCriticalPos = init; min = twDist; } } } else { //De pos hacia atrás. for (int init = bestPosSource; init > 0; init--) { if ((notCritical.TimeWindow.LowerBound + _problem.Distances[notCritical.ID_Unique][solution.Vehicles[v2].Requests[init].ID_Unique]) > solution.Vehicles[v2].Requests[init].TimeWindow.UpperBound) { continue; } //var diff = Problem.EuclideanDistance(notCritical.TimeWindow.LowerBound, notCritical.TimeWindow.UpperBound, solution.Vehicles[v2].Requests[init].TimeWindow.LowerBound, solution.Vehicles[v2].Requests[init].TimeWindow.UpperBound); double twDist = 0.0; if (init == 1) { if ((critical.TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[init].ID_Unique]) > solution.Vehicles[v2].Requests[init].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(critical, v2, init, solution); } else { if (((solution.Vehicles[v2].Requests[init - 1].TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[init - 1].ID_Unique]) > critical.TimeWindow.UpperBound) || (critical.TimeWindow.LowerBound + _problem.Distances[critical.ID_Unique][solution.Vehicles[v2].Requests[init].ID_Unique]) > solution.Vehicles[v2].Requests[init].TimeWindow.UpperBound) { continue; } twDist = CalculateDistance(critical, v2, init, solution); } if (twDist < min) { notCriticalPos = init; min = twDist; } } } solution.Vehicles[v2].Requests.Insert(notCriticalPos, notCritical); } // } //Recalcular con el proceso de 8 pasos y actualizar el coste. foreach (var vehicle in solution.Vehicles) { DARPAlgorithms.EightStepsEvaluationProcedure(ref solution, vehicle, _problem); } solution.TotalDuration = solution.Vehicles.Sum(t => t.VehicleDuration); solution.TimeWindowViolation = solution.Vehicles.Sum(t => t.TotalTimeWindowViolation); solution.RideTimeViolation = solution.Vehicles.Sum(r => r.TotalRideTimeViolation); solution.DurationViolation = solution.Vehicles.Sum(d => d.TotalDurationViolation); solution.LoadViolation = solution.Vehicles.Sum(l => l.TotalLoadViolation); solution.TotalWaitingTime = solution.Vehicles.Sum(t => t.TotalWaitingTime); DARPAlgorithms.UpdateConstraintsSolution(ref solution, _problem); solution.Fitness = Costs.EvaluationSolution(solution, _problem); try { Validator.Positions(ref solution, _problem); Validation.Validator.ValidateSolution(ref solution, _problem); } catch (Exception ex) { Console.WriteLine(); } }
public void OnGet() { Run = queries.GetLastRun(); Costs = queries.GetCostReports(Run.RunID); CostsByGroup = Costs.GroupBy(c => c.GroupName.ToLower()).OrderByDescending(g => g.Sum(r => r.MonthlyCost)); }
public void ShowCost(Costs cost) { ShowCost(cost.metal, cost.yellowGem, cost.blueGem, cost.greenGem); }
public override void VisitRoster(RosterNode node) { Costs.Clear(); Visit(node.Forces); }
bool wasFirstRoadBuilt = false; // for tutorial mode void Awake() { mobileTouchCamera = FindObjectOfType <BitBenderGames.MobileTouchCamera>(); costs = FindObjectOfType <Costs>(); tutorial = FindObjectOfType <Tutorial>(); }
public Costs UpdateCosts(Costs costs) { dbContext.Entry(costs).State = EntityState.Modified; dbContext.SaveChanges(); return(costs); }
// Reduces a matrix. // Creates a new matrix, with the same values as the current // instance, with the change that each row and each column // is reduced so that there is at least 1 zero in each. // LowerBound is increased by the amount subtracted from // each row and column. public Matrix Reduce() { double lowerBound = LowerBound; double[,] costs = Costs.Clone() as double[, ]; for (int i = 0; i < costs.GetLength(0); i++) { int lowestJInd = 0; double lowestJ = costs[i, 0]; // Find the lowest for (int j = 1; j < costs.GetLength(0); j++) { if (costs[i, j] < lowestJ) { lowestJInd = j; lowestJ = costs[i, j]; } } if (!Double.IsInfinity(lowestJ)) { // Increase lower bound and decrease each element in row lowerBound += lowestJ; for (int j = 0; j < costs.GetLength(0); j++) { costs[i, j] -= lowestJ; } } } for (int j = 0; j < costs.GetLength(0); j++) { int lowestIInd = 0; double lowestI = costs[0, j]; // Find lowest for (int i = 1; i < costs.GetLength(0); i++) { if (costs[i, j] < lowestI) { lowestIInd = i; lowestI = costs[i, j]; } } if (!Double.IsInfinity(lowestI)) { // Increase lower bound and decrease each element in row lowerBound += lowestI; for (int i = 0; i < costs.GetLength(0); i++) { costs[i, j] -= lowestI; } } } // Return a new instance (don't change current in any way) return(new Matrix(Cities, costs, lowerBound, CitiesVisited)); }
private void BtnOk_Click(object sender, RoutedEventArgs e) { Purse pList = purseListCB.SelectedItem as Purse; CostCategories ccList = costCategorListCB.SelectedItem as CostCategories; double sum; DateTimeOffset date = (DateTimeOffset)dateCost.Date; string dateFormat = date.Date.ToString("dd.MM.yyyy"); if (pList == null) { errorText.Text = "Выберите счет"; return; } if (!Double.TryParse(ConvertToStringFormat(costSum.Text), out sum)) { errorText.Text = "Некоректная сумма"; return; } if (sum < 0) { errorText.Text = "Некоректная сумма"; return; } if (ccList == null) { errorText.Text = "Выберите категорию"; return; } //if(costComment.Text.Length == 0) //{ // costComment.Text = " "; //} //dateFormat = dateFormat.ToString(""); using (PFContext db = new PFContext()) { if (cost != null) { int purseId_Old = cost.PurseId; double summaCost_Old = cost.Summa; currency = db.Currency.FirstOrDefault(c => c.Id == pList.CurrencyId); if (pList.Id == purseId_Old && summaCost_Old == sum) // неизменный кошелек и сумма { cost.Summa = sum; cost.DateOperation = dateFormat; cost.PurseId = pList.Id; cost.CostCategoriesId = ccList.Id; cost.Comment = costComment.Text; cost.Purse = pList; cost.CostCategories = ccList; cost.CurrencyId = pList.CurrencyId; cost.Currency = currency; } else if (pList.Id == purseId_Old && summaCost_Old != sum) // изменяется только сумма { Purse purseChangeSumElement = db.Purse.FirstOrDefault(p => p.Id == pList.Id); purseChangeSumElement.Balance = purseChangeSumElement.Balance - (sum - summaCost_Old); db.Purse.Update(purseChangeSumElement); cost.Summa = sum; cost.DateOperation = dateFormat; cost.PurseId = pList.Id; cost.CostCategoriesId = ccList.Id; cost.Comment = costComment.Text; cost.Purse = pList; cost.CostCategories = ccList; cost.CurrencyId = pList.CurrencyId; cost.Currency = currency; } else if (pList.Id != purseId_Old) //изменяется кошелек { Purse purseChangeOld; Purse purseChangeNew; purseChangeOld = db.Purse.FirstOrDefault(p => p.Id == purseId_Old); purseChangeOld.Balance = purseChangeOld.Balance + summaCost_Old; db.Purse.Update(purseChangeOld); purseChangeNew = db.Purse.FirstOrDefault(p => p.Id == pList.Id); purseChangeNew.Balance = purseChangeNew.Balance - sum; db.Purse.Update(purseChangeNew); cost.Summa = sum; cost.DateOperation = dateFormat; cost.PurseId = pList.Id; cost.CostCategoriesId = ccList.Id; cost.Comment = costComment.Text; cost.Purse = pList; cost.CostCategories = ccList; cost.CurrencyId = pList.CurrencyId; cost.Currency = currency; } db.Costs.Update(cost); } else { currency = db.Currency.FirstOrDefault(c => c.Id == pList.CurrencyId); Costs costNew = new Costs { Summa = sum, DateOperation = dateFormat, PurseId = pList.Id, CostCategoriesId = ccList.Id, Comment = costComment.Text, Purse = pList, CostCategories = ccList, CurrencyId = pList.CurrencyId, Currency = currency }; db.Purse.Attach(pList); db.CostCategories.Attach(ccList); db.Currency.Attach(currency); /* Update Purse*/ purse = db.Purse.FirstOrDefault(p => p.Id == costNew.PurseId); purse.Balance = purse.Balance - costNew.Summa; db.Purse.Update(purse); db.Costs.Add(costNew); } db.SaveChanges(); } GoToPreviousPage(); }
private void GameEvents_GameSaved(object sender, Events.GameEvents.SaveLoadEventArgs e) { ES2.Save <EntityCost>(Costs.GetEntityCosts(), e.savePath + "?tag=CostTweaking_Costs"); }
public House(SpriteFrame spriteFrame, Vector2 position, Rectangle rect, Actions type, Costs costs) : base(spriteFrame, position, rect, type, costs) { }
public double[,] solveUV(out int cycles) { //Account for minimum delivery adjustMinimumDelivery_FromSupplyAndDemand(false); //Subtract away //Get dimensions int rows = Costs.GetLength(0); int cols = Costs.GetLength(1); //Get Northwest approximation double[,] solutionCurr = solveNorthWest(false); //Cycle until end condion met cycles = 0; //For statistics while (true) { #region Calculate UV values double[] u; double[] v; calculateUV_Values(solutionCurr, out u, out v); #endregion #region Calculate penalty values, track location of greatest penalty double[,] penalties = new double[rows, cols]; int rMax = -1; int cMax = -1; double penaltyMax = double.NegativeInfinity; bool allNegative = true; //Calculate penalties for (int r = 0; r < rows; r++) { for (int c = 0; c < cols; c++) { //Calculate only for unassigned cells if (solutionCurr[r, c] == 0) { //Get and store value double penalty = u[r] + v[c] - Costs[r, c]; penalties[r, c] = penalty; //Check sign if (penalty > 0) { allNegative = false; } //Check for max if (penalty > penaltyMax) { penaltyMax = penalty; rMax = r; cMax = c; } } } } #endregion //Check end condion if (allNegative) { //Finished break; } #region Generate new iteration of solution //Identify loop int rLoopStart = rMax; int cLoopStart = cMax; int[,] loop = findLoop(solutionCurr, rLoopStart, cLoopStart); //Get lowest number in "negative" group (odd entries of loop) double minValue = double.PositiveInfinity; for (int p = 0; p < loop.GetLength(0); p++) { //Get cell value int r = loop[p, 0]; int c = loop[p, 1]; //Determine current operation if (p % 2 == 1) //odd (negative operation numbers) { if (solutionCurr[r, c] < minValue) { minValue = solutionCurr[r, c]; } } } //Adjust current solution for (int p = 0; p < loop.GetLength(0); p++) { //Get cell value int r = loop[p, 0]; int c = loop[p, 1]; //Determine current operation if (p % 2 == 0) //even or zero { //Add the minimum value to the solution solutionCurr[r, c] += minValue; } else //odd { //Remove the minimum value from the solution solutionCurr[r, c] -= minValue; } } #endregion cycles++; } //Account for minimum delivery addMinimumDelivery_ToSolution(solutionCurr); adjustMinimumDelivery_FromSupplyAndDemand(true); //Add back return(solutionCurr); }