コード例 #1
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);
        }