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 void TestBudgetConstraint(string filename, int budget, int seed) { 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, Seed = seed, }); //model.WriteModel(@"c:\temp\model.lp"); model.SetBudgetConstraint(budget); model.Optimize(900); Console.WriteLine($"Room Cost: {model.GetUsedRooms().Sum(kv => kv.Key.Cost * kv.Value)}"); File.AppendAllText(@"c:\temp\enumtest.txt", $"{nameof(TestBudgetConstraint)};{filename};{seed};{model.Objective}\n"); }
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 List <MultiResult> RunExhaustiveMethod() { if (EpsilonOnQuality) { throw new ArgumentException("This only works on cost objective"); } StartLogging(); if (FixedTimeSlotAssignments != null) { Console.WriteLine("Fixing timeslots"); _model.SetAndFixSolution(FixedTimeSlotAssignments); } // calc far out corner pint double maxcost; int minobj; int minobjbounds; CalcLexMaxCostMinSoftcons(out maxcost, out minobj, out minobjbounds); _model.SetObjective(1, 0); var seatConstraint = 25; while (seatConstraint < maxcost) { Console.WriteLine($"SeatConstraint: {seatConstraint}"); _model.SetBudgetConstraint(seatConstraint); var sol = _model.Optimize(Timelimit); if (sol) { _multiResults.Add(new MultiResult(_model.ObjCost, _model.ObjSoftCons, null, (int)Math.Ceiling(_model.ObjBound), _model.GetUsedRooms(), _model.GetAssignments(), seatConstraint, null, (int)_stopwatch.Elapsed.TotalSeconds)); if ((int)Math.Round(_model.Objective) <= minobj) { break; } } // else solutions.Add(Tuple.Create(nincluded,-1)); seatConstraint += 25; } _stopwatch.Stop(); Console.WriteLine($"Elapsed time: {_stopwatch.Elapsed} -- {_stopwatch.ElapsedMilliseconds}ms"); var pareto = GetParetoPoints(_multiResults); // Console.WriteLine($"\nBounds:\nCost: {costBound}\nSoftObj: {softObjBound}\n"); DisplaySolutions(pareto); DisplayRoomProfiles(pareto); DisplayTimeSlots(pareto); DisplayChanges(pareto); return(pareto); }