private void RunEpsilonMethod(int minSoftConsViol, int maxSoftConsViol, double minCost, double maxCost) { List <MultiResult> pareto; var stepsize = (double)1 / (Steps); //(double)1 / (Steps + 1); var proxobj = 0; if (EpsilonOnQuality) { _model.SetObjective(0, 1, proxobj); } else { _model.SetObjective(1, 0, proxobj); } if (LocalBranching > 0) { _model.SetProxConstraint(LocalBranching); } for (var alpha = EpsilonRelaxing ? stepsize : 1 - stepsize; alpha >= 0 && alpha <= 1; //maybe we maybe should solve the last one again.. this seems to give improvementts. alpha += (EpsilonRelaxing ? 1 : -1) * stepsize) { Console.WriteLine($"Elapsed time: {_stopwatch.Elapsed} -- {_stopwatch.ElapsedMilliseconds}ms"); OptimizeSubProblem(minSoftConsViol, maxSoftConsViol, minCost, maxCost, alpha); } if (DoubleSweep) { pareto = GetParetoPoints(_multiResults); var beforepoints = pareto.Count; DisplaySolutions(pareto); //Check if new corner points minCost = pareto.Min(r => r.Cost); maxCost = pareto.Max(r => r.Cost); minSoftConsViol = pareto.Min(r => r.SoftObjective); maxSoftConsViol = pareto.Max(r => r.SoftObjective); Console.WriteLine("Running opposite direction"); if (LocalBranching > 0) { _model.SetProxConstraint(LocalBranching); } for (var alpha = !EpsilonRelaxing ? stepsize : 1 - stepsize; alpha > 0 && alpha < 1; //maybe we maybe should solve the last one again.. this seems to give improvementts. alpha += (!EpsilonRelaxing ? 1 : -1) * stepsize) { Console.WriteLine($"Elapsed time: {_stopwatch.Elapsed} -- {_stopwatch.ElapsedMilliseconds}ms"); OptimizeSubProblem(minSoftConsViol, maxSoftConsViol, minCost, maxCost, alpha); } pareto = GetParetoPoints(_multiResults); Console.WriteLine($"Done with oposite. New points added: {pareto.Count - beforepoints}"); } }
public void TestObjective() { var data = Data.ReadXml(dataPath + ITC_Comp01, "120", "4"); var formulation = ProblemFormulation.UD2; //Formulation.AvailabilityHardConstraint = false; //Formulation.OverbookingAllowed = 0.35; var model = new CCTModel(data, formulation); model.Optimize(900); model.SetObjective(0.95, 0.5); model.Optimize(60); model.SetObjective(0.5, 0.5); model.Optimize(60); model.SetObjective(0.2, 0.8); }
public void TestProximityConstraint() { // var data = Data.ReadXml(dataPath + Erlangen2012_1, "120", "4"); 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; model.SetObjective(0, 0, 1); while (watch.Elapsed.TotalSeconds < TimelimitStageI) { model.SetProximityOrigin(true); model.SetQualConstraint(obj - 10); model.Optimize(15); obj = model.ObjSoftCons; Console.WriteLine($"Objective: {obj}"); } }
public void ThresholdBehvaiour(string filename) { var data = Data.ReadXml(dataPath + filename, "120", "4"); var formulation = ProblemFormulation.UD2NoOverbook; var newrooms = CreateRoomsFixedSize(data, 25, 1); data.SetRoomList(newrooms); var model = new CCTModel(data, formulation, new CCTModel.MIPModelParameters() { UseRoomsAsTypes = true, UseStageIandII = false, // TuneGurobi = true, //TuneGurobi = false, SaveBoundInformation = true, //FocusOnlyOnBounds = true, }); var seatscal = new RoomCombinations(data, 25); var CriticalSeats = seatscal._minCost; // model.SetObjective(0, 1, 0); //model.Optimize(); // model.SetObjective(8, 1, 0); // Weighted sum model.SetObjective(1, 0, 0); model.SetBudgetConstraint(CriticalSeats); model.Optimize(300); Console.WriteLine(); Console.WriteLine("time;MWD;CC;softobj;obj;cost;bnd;"); Console.WriteLine(String.Join("\n", model.bounds.Select(t => $"{t.Item6};{t.Item1};{t.Item2};{t.Item1+t.Item2};{t.Item3};{t.Item5};{t.Item4}"))); Console.WriteLine($"Last bound: {model.ObjBound}"); }
public void TestBudgetRelaxations(string filename, double stepsize) { var data = Data.ReadXml(dataPath + filename, "120", "4"); var formulation = ProblemFormulation.UD2NoOverbook; var newrooms = CreateRoomsFixedSize(data, 25, 1); data.SetRoomList(newrooms); var model = new CCTModel(data, formulation, new CCTModel.MIPModelParameters() { UseRoomsAsTypes = true, UseStageIandII = false, TuneGurobi = true, SaveBoundInformation = true, }); model.RelaxModel(); model.SetObjective(0, 1, 0); model.Optimize(); var min = model.Objective; // Math.Floor(model.Objective*100)/100; Console.WriteLine($"Minimum budget for relaxed: {min}"); model = new CCTModel(data, formulation, new CCTModel.MIPModelParameters() { UseRoomsAsTypes = true, UseStageIandII = false, TuneGurobi = true, SaveBoundInformation = true, }); //model.WriteModel(@"c:\temp\model.lp"); var bounds = new List <Tuple <double, double, double, double> >(); double prevobj = double.PositiveInfinity; int lasts = 5; for (double budget = min; budget < min * 2; budget += stepsize) { model.RelaxModel(); Console.WriteLine($"Budget:{budget : 0.00} "); model.SetBudgetConstraint(budget); if (model.Optimize(300)) { bounds.Add(Tuple.Create(budget, model.Objective, formulation.MinimumWorkingDaysWeight * model.ObjMWD, formulation.CurriculumCompactnessWeight * model.ObjCC)); //Save each objective? MWD CC if (prevobj - model.Objective < 1e-6) { lasts--; } if (lasts == 0) { break; } prevobj = model.Objective; } } Console.WriteLine("Budget;Obj;MWD;CC"); Console.WriteLine(string.Join("\n", bounds.Select(b => $"{b.Item1 : #.###};{b.Item2: #.###};{b.Item3: #.###};{b.Item4: #.###}"))); }
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); }
// [TestCase(ITC_Comp05,1)] /* * [TestCase(ITC_Comp05, 2)] * [TestCase(ITC_Comp05, 3)] * [TestCase(ITC_Comp05, 4)] * [TestCase(ITC_Comp05, 5)] * [TestCase(ITC_Comp05, 6)] * [TestCase(ITC_Comp05, 7)] * [TestCase(ITC_Comp05, 8)] * [TestCase(ITC_Comp05, 11)] * [TestCase(ITC_Comp05, 12)] * [TestCase(ITC_Comp05, 13)] * [TestCase(ITC_Comp05, 14)] * [TestCase(ITC_Comp05, 15)] * [TestCase(ITC_Comp05, 16)] * [TestCase(ITC_Comp05, 17)] */ public void CCfirstHeuristic30s(string filename, int seed) // { // var seed = 0; for (int ia = 1; ia < 5; ia++) { seed = ia; var data = Data.ReadXml(dataPath + filename, "120", "4"); // var newrooms = CreateRooms(data); // data.SetRoomList(newrooms); var problemFormulation = ProblemFormulation.UD2NoOverbook; problemFormulation.MinimumWorkingDaysWeight = 0; // problemFormulation.CurriculumCompactnessWeight = 0; var par = new CCTModel.MIPModelParameters() { TuneGurobi = true, UseStageIandII = false, UseHallsConditions = true, UseRoomHallConditions = true, UseRoomsAsTypes = false, Seed = seed, }; var model = new CCTModel(data, problemFormulation, par); model.SetObjective(1, 0, 0); model.Optimize(TimelimitStageI); model.DisplayObjectives(); var result = new Dictionary <double, double>(); //maybe find better proximity that reflects currciulumcompactness better. //Check which curriculum that can be moved without introducting penalties. model.SetProximityOrigin(true); problemFormulation.MinimumWorkingDaysWeight = 5; for (var i = 15; i <= 15; i++) { // model.SetObjective(0, 0, i); model.SetProxConstraint(i); model.AddMinimumWorkingDaysCost(); // model.FixCurricula(true); model.Optimize(); model.DisplayObjectives(); model.SetObjective(1, 0, 0); model.Fixsol(true); model.Optimize(); model.Fixsol(false); model.DisplayObjectives(); result[i] = model.Objective; } Console.WriteLine("Results:"); Console.WriteLine("i;obj"); foreach (var r in result) { Console.WriteLine($"{r.Key};{r.Value}"); } var best = result.Min(r => r.Value); File.AppendAllText(@"c:\temp\heuristic.txt", $"{nameof(CCfirstHeuristic30s)};{filename};{best}\n"); // model.FixCurricula(false); // maybe also save multiple minimum curriculum solutions } }
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"); }