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: #.###}")));
        }
Пример #3
0
        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");
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }