public void TestCurriculaConstraint() { var data = Data.ReadXml(dataPath + ITC_Comp05, "120", "4"); // var formulation = ProblemFormulation.UD2; //Formulation.AvailabilityHardConstraint = false; //Formulation.OverbookingAllowed = 0.35; var ModelParameters = new CCTModel.MIPModelParameters() { UseStageIandII = false, ConstraintPenalty = 50, AbortSolverOnZeroPenalty = true, }; var model = new CCTModel(data, formulation, ModelParameters); var watch = Stopwatch.StartNew(); model.Optimize(30, 0.99); var obj = model.ObjSoftCons; while (watch.Elapsed.TotalSeconds < TimelimitStageI * 2) { model.SetQualConstraint(obj - 5); model.Optimize(120); obj = model.ObjSoftCons; Console.WriteLine($"Objective: {obj}"); } }
public void TestQualConstraint() { var data = Data.ReadXml(dataPath + ITC_Comp08, "120", "4"); var formulation = ProblemFormulation.UD2; var model = new CCTModel(data, formulation); //model.WriteModel(@"c:\temp\model.lp"); model.SetQualConstraint(5); model.Optimize(); }
private void OptimizeSubProblem(int minSoftConsViol, int maxSoftConsViol, double minCost, double maxCost, double alpha) { StartLogging(); double?qual = null; double?budget = null; if (EpsilonOnQuality) { qual = Math.Floor(minSoftConsViol * (1 - alpha) + maxSoftConsViol * alpha); _model.SetQualConstraint((int?)Math.Floor((double)qual)); Console.WriteLine($"Alpha: {alpha:0.00} QualConstraint: {qual}"); } else { budget = minCost * (1 - alpha) + maxCost * alpha; _model.SetBudgetConstraint(budget); Console.WriteLine($"Alpha: {alpha:0.00} BudgetConstraint: {budget}"); } /* * a weighting scheme * model.SetObjective(alpha* minRoomCost, (1-alpha)* minQual); */ if (LocalBranching > 0) { _model.SetProximityOrigin(); } _model.Optimize(Timelimit, MIPGap); Console.WriteLine($"LastSolution:\n(cost,softobj) = {_model.ObjCost} , {_model.ObjSoftCons}"); int?costBound = EpsilonOnQuality ?(int?)Math.Ceiling(_model.ObjBound) : null; int?softobjBound = !EpsilonOnQuality ? (int?)Math.Ceiling(_model.ObjBound) : null; _multiResults.Add(new MultiResult(_model.ObjCost, _model.ObjSoftCons, costBound, softobjBound, _model.GetUsedRooms(), _model.GetAssignments(), budget, qual, (int)_stopwatch.Elapsed.TotalSeconds)); AddAllSolutions(_model); }
public Solution Run() { var stopwatch = Stopwatch.StartNew(); var model = new CCTModel(data, formulation, MIPmodelParameters); model.Optimize(TimelimitStageI - Timetotighten); var userooms = model.GetUsedRooms(); Console.WriteLine($"Used rooms: {userooms.Sum(kv => kv.Value)} over {userooms.Count} "); Console.WriteLine($"OveruseOnTimeslots: {model.GetOverUseOfRooms()} "); // model.PenalizeRoomUsedMoreThanOnce(100); model.PenalizeRoomUsedMoreThanOnce(10, true); model.SetObjective(0, 0, 0.01); //model.SetObjective(0, 0, 0); //model.SetMipHintToCurrent(); model.SetProximityOrigin(); model.SetQualConstraint(model.ObjSoftCons); model.Fixsol(true); model.Optimize(); model.Fixsol(false); // model.Optimize(timetotighten+50,cutoff:500); model.ModelParameters.AbortSolverOnZeroPenalty = true; var tighttimer = Stopwatch.StartNew(); model.Optimize(Timetotighten + 300); tighttimer.Stop(); model.DisplayObjectives(); _solution = new Solution(data, formulation); _solution.SetAssignments(model.GetAssignments()); //timers stopwatch.Stop(); tighttimer.Stop(); totalseconds = (int)stopwatch.Elapsed.TotalSeconds; roomtightseconds = (int)tighttimer.Elapsed.TotalSeconds; return(_solution); }
public List <Tuple <int, Solution, int> > Run() { var before = (int)solutionBefore.Objective; model.SetObjective(0, 0, 1); //model.Fixsol(false); //model.SetProxConstraint(10); var feasible = model.Optimize(Timelimit); if (!feasible) { return(new List <Tuple <int, Solution, int> >()); } var minperb = (int)model.Objective; //Find best objective model.SetObjective(1, 0, 0); var sol = new List <Tuple <int, Solution, int> >(); var currentObjective = 0; for (var pertubations = minperb; pertubations <= minperb + ExtraPerubations && pertubations <= MaxTotalPertubations; pertubations++) { Console.WriteLine($"pertubations = {pertubations}"); model.SetProxConstraint(pertubations); if (PerturbationObjectEqual) { model.SetProcConstraintSenseEqual(true); } // if (RemoveCurrentSolutionAfteritt) model.b //model.Optimize(); int sols; for (sols = 0; sols < SolPerPertubation; sols++) { if (!model.Optimize(Timelimit)) { if (AbortSolverWhenNoImprovement) { break; //infeasibles } else { continue; } } Console.WriteLine("new solution"); //constraint on objective function // if (model.ObjSoftCons == prev) break; currentObjective = model.ObjSoftCons; model.SetQualConstraint(currentObjective); var solututionAfter = new Solution(data, formulation); solututionAfter.SetAssignments(model.GetAssignments()); Console.WriteLine($"Before: {before}\n" + $"After: {model.ObjSoftCons}\n" + $"Perbs: {pertubations}"); Console.WriteLine(solutionBefore.AnalyzeSolution()); Console.WriteLine(solututionAfter.AnalyzeSolution()); var solution = new Solution(data, formulation); solution.SetAssignments(model.GetAssignments()); solution.AnalyzeSolution(); sol.Add(Tuple.Create(pertubations, solution, model.RunTime)); DisplayPertubations(solutionBefore._assignments.ToList(), solututionAfter._assignments.ToList()); //to pertubate more. model.RemoveCurrentSolution(); } if (sols == 0) { break; //previous pertubations didnt find anything } model.SetQualConstraint(currentObjective - 1); } return(sol); }
public List <Tuple <int, Solution, int, int> > Run() { var starttime = DateTime.Now; var before = (int)solutionBefore.Objective; model.SetObjective(0, 0, 1); //model.Fixsol(false); //model.SetProxConstraint(10); var feasible = model.Optimize(Timelimit); if (!feasible) { return(new List <Tuple <int, Solution, int, int> >()); } var minperb = (int)model.Objective; //Find best objective model.SetObjective(1, 0, 0); var sol = new List <Tuple <int, Solution, int, int> >(); var currentObjective = 0; var maxPerturbations = Math.Max(minperb + ExtraPerubations, MaxTotalPertubations); for (var pertubations = minperb; pertubations <= maxPerturbations; pertubations++) { Console.WriteLine($"pertubations = {pertubations}"); model.SetProxConstraint(pertubations); if (PerturbationObjectEqual) { model.SetProcConstraintSenseEqual(true); } // if (RemoveCurrentSolutionAfteritt) model.b //model.Optimize(); int sols; for (sols = 0; sols < SolPerPertubation; sols++) { var timeleft = TotalTimelimit - (int)(DateTime.Now - starttime).TotalSeconds; if (!model.Optimize(timeleft)) { if (AbortSolverWhenNoImprovement) { break; //infeasibles } else { continue; } } Console.WriteLine("new solution"); //constraint on objective function // if (model.ObjSoftCons == prev) break; currentObjective = model.ObjSoftCons; model.SetQualConstraint(currentObjective); var solututionAfter = new Solution(data, formulation); solututionAfter.SetAssignments(model.GetAssignments()); Console.WriteLine($"Before: {before}\n" + $"After: {model.ObjSoftCons}\n" + $"Perbs: {pertubations}"); Console.WriteLine(solutionBefore.AnalyzeSolution()); Console.WriteLine(solututionAfter.AnalyzeSolution()); var solution = new Solution(data, formulation); solution.SetAssignments(model.GetAssignments()); solution.AnalyzeSolution(); sol.Add(Tuple.Create(pertubations, solution, model.RunTime, (int)Math.Ceiling(model.ObjBound))); DisplayPertubations(solutionBefore._assignments.ToList(), solututionAfter._assignments.ToList()); //to pertubate more. model.RemoveCurrentSolution(); } if (sols == 0) { break; //previous pertubations didnt find anything } if (AbortWhenPreviousSolutionValueIsObtained && currentObjective == (int)solutionBefore.Objective) { break; } if ((int)(DateTime.Now - starttime).TotalSeconds > TotalTimelimit) { Console.WriteLine("total timelimit reached"); break; } //overall timelimit? model.SetQualConstraint(currentObjective - 1); } LastRuntimeSeconds = (int)(DateTime.Now - starttime).TotalSeconds; return(sol); }
public List <Tuple <int, int, int, int> > Run() { if (formulationtype < 0 || formulationtype > 1) { throw new ArgumentException("No formulationtype set"); } var stopwatch = Stopwatch.StartNew(); var solutions = new List <Tuple <int, int, int, int> >(); // var newrooms = CreateRoomsFixedSize(data, 25, 1); // data.SetRoomList(newrooms); _model = new CCTModel(data, formulation, MIPmodelParameters); _model.Optimize(Timelimit); var minobj = (int)Math.Round(_model.Objective); solutions.Add(Tuple.Create(data.TimeSlots.Count, (int)Math.Round(_model.Objective), (int)Math.Ceiling(_model.ObjBound), (int)stopwatch.Elapsed.TotalSeconds)); //Minimize timeslots int maxtimeslots = 0; if (formulationtype == 0) { _model.SetQualConstraint(minobj); _model.SetObjective(0, 0, totaltimeslots: 1); _model.Optimize(Timelimit); _model.SetQualConstraint(); maxtimeslots = (int)Math.Round(_model.Objective); _model.SetObjective(1, 0); } else if (formulationtype == 1) { _model.SetBudgetConstraint(minobj); _model.SetObjective(0, 0, totaltimeslots: 1); _model.Optimize(Timelimit); _model.SetBudgetConstraint(); maxtimeslots = (int)Math.Round(_model.Objective); _model.SetObjective(0, 1); } for (int nincluded = 0; nincluded < data.TimeSlots.Count; nincluded++) { if (nincluded > maxtimeslots) { break; } Console.WriteLine($"Nincluded: {nincluded} ({(double)nincluded / data.TimeSlots.Count: 0.00%})"); _model.SetTimeslotsUsedConstraint(nincluded); var sol = _model.Optimize(Timelimit); if (sol) { solutions.Add(Tuple.Create(nincluded, (int)Math.Round(_model.Objective), (int)Math.Ceiling(_model.ObjBound), (int)stopwatch.Elapsed.TotalSeconds)); if ((int)Math.Round(_model.Objective) <= minobj) { break; } } } //Tighten bounds. for (int i = 0; i < solutions.Count; i++) { var item3 = solutions.Where(s => s.Item1 >= solutions[i].Item1).Max(s => s.Item3); solutions[i] = Tuple.Create(solutions[i].Item1, solutions[i].Item2, item3, solutions[i].Item4); } return(solutions); }
public void Lex_soft_cost_withTimeslot(string filename) { var algname = nameof(Lex_soft_cost_withTimeslot); // formulation.AvailabilityHardConstraint = false; var data = Data.ReadXml(dataPath + filename, "120", "4"); var newrooms = CreateRoomsFixedSize(data, 25, 5); data.SetRoomList(newrooms); var par = new CCTModel.MIPModelParameters() { UseStageIandII = false, UseHallsConditions = true, UseRoomHallConditions = true, TuneGurobi = false, UseRoomsAsTypes = false, }; var costmodel = new CCTModel(data, ProblemFormulation.MinimizeRoomCost, par); costmodel.Optimize(); data.SetRoomList(costmodel.GetUsedRooms().Where(kv => kv.Value > 0).Select(kv => kv.Key).ToList()); //var formulation = ProblemFormulation.UD2NoOverbook; // formulation.AvailabilityHardConstraint = false; // formulation.OverbookingAllowed = 0.35; var ModelParameters = new CCTModel.MIPModelParameters() { UseStageIandII = false, TuneGurobi = true, UseHallsConditions = true, UseRoomHallConditions = true, // UseRoomsAsTypes = true, UseRoomsAsTypes = false, RoomBoundForEachTimeSlot = true, }; var model = new CCTModel(data, _problemFormulation, ModelParameters); model.Optimize(300); var userooms = model.GetUsedRooms(); Console.WriteLine($"Used rooms: {userooms.Sum(kv => kv.Value)} over {userooms.Count} "); // model.PenalizeRoomUsedMoreThanOnce(100); model.PenalizeRoomUsedMoreThanOnce(1, true); model.SetObjective(0, 0, 0.001); model.SetProximityOrigin(); model.SetQualConstraint(model.ObjSoftCons); // model.SetProxConstraint(20); model.Fixsol(true); model.Optimize(); model.Fixsol(false); model.Optimize(900); model.DisplayObjectives(); var sol = new Solution(data, ProblemFormulation.MinimizeRoomCost); sol.SetAssignments(model.GetAssignments()); Console.WriteLine(sol.AnalyzeSolution()); File.AppendAllText(@"c:\temp\heuristic.txt", $"{algname};{filename};{model.ObjSoftCons}\n"); }