コード例 #1
0
        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}");
            }
        }
コード例 #2
0
ファイル: BasicTests.cs プロジェクト: lulzzz/UniTimetabling
        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();
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #6
0
        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);
        }
コード例 #7
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);
        }
コード例 #8
0
        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");
        }