Esempio n. 1
0
        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];
        }
Esempio n. 2
0
 /// <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));
 }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
 public static void SetReward(Costs reward)
 {
     MissionReward = reward;
 }
Esempio n. 6
0
 /// <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);
 }
Esempio n. 7
0
 private void InfoCost_OnChangeIsReturn()
 {
     IncomingsAndExpenses.First().ExpenseCompensation = Costs.Where(x => x.IsReturn).Sum(c => !c.IsIncoming ? c.Summ : 0);
 }
Esempio n. 8
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))
                 ));
        }
Esempio n. 10
0
        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();
        }
Esempio n. 11
0
 public BaseTraveler(int startLocation)
 {
     CurrentLocation = startLocation;
     costs           = new Costs();
 }
Esempio n. 12
0
        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();
        }
Esempio n. 13
0
 public IEnumerable <Costs> GetAllCosts()
 {
     return(Costs.GetAll());
 }
Esempio n. 14
0
 public IEnumerable <CostClone> GetCostByInstanceId(int instanceId, string username)
 {
     return(Costs.GetCostByInstanceId(instanceId, username));
     //return Costs.GetAll();
     //return new string[] { "value1", "value2" };
 }
Esempio n. 15
0
        /// <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);
        }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
    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];
        }
    }
Esempio n. 18
0
        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);
        }
Esempio n. 19
0
        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;
        }
Esempio n. 20
0
        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));
        }
Esempio n. 22
0
        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();
            }
        }
Esempio n. 23
0
 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));
 }
Esempio n. 24
0
 public void ShowCost(Costs cost)
 {
     ShowCost(cost.metal, cost.yellowGem, cost.blueGem, cost.greenGem);
 }
Esempio n. 25
0
 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>();
    }
Esempio n. 27
0
 public Costs UpdateCosts(Costs costs)
 {
     dbContext.Entry(costs).State = EntityState.Modified;
     dbContext.SaveChanges();
     return(costs);
 }
Esempio n. 28
0
        // 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");
 }
Esempio n. 31
0
 public House(SpriteFrame spriteFrame, Vector2 position, Rectangle rect, Actions type, Costs costs) : base(spriteFrame, position, rect, type, costs)
 {
 }
Esempio n. 32
0
        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);
        }