Beispiel #1
0
            public double DoWork()
            {
                model.ClearModel();
                InitModel();
                double a = 0;

                for (int t = 0; t < aff.TimeHorizon; t++)
                {
                    SetTime(t);
                    if (model.Solve())
                    {
                        for (int i = 0; i < aff.DS.Count; i++)
                        {
                            if (model.GetValue(vars[i]) == 1)
                            {
                                a += aff.RS.Sum(r => aff.Qti(t, r, aff.DS[i]));
                            }
                        }
                    }
                }
                double b = 0;

                foreach (IALPResource r in aff.RS)
                {
                    b += 1;//b += r.Capacity;
                }
                return(a / b);
            }
Beispiel #2
0
        private void InitRCGModel()
        {
            SubModel.ClearModel();
            h = SubModel.NumVarArray(Data.DS.Count, 0, double.MaxValue);
            r = SubModel.NumVarArray(Data.RS.Count, 0, double.MaxValue);
            constraint_sub2 = new IRange[Data.RS.Count];
            subObject[0]    = new INumExpr[Data.TimeHorizon];
            subObject[1]    = new INumExpr[Data.TimeHorizon];

            #region 生成约束
            //第一、四种约束
            INumExpr expr1 = SubModel.NumExpr();
            foreach (IMDPDecision d in Data.DS)
            {
                expr1 = SubModel.Sum(expr1, h[Data.DS.IndexOf(d)]);//SubModel.AddGe(h[aff.DS.IndexOf(d)], 0);
            }
            SubModel.AddEq(expr1, 1);

            //第二、三种约束
            foreach (IALPResource re in Data.RS)
            {
                constraint_sub2[Data.RS.IndexOf(re)] = SubModel.AddLe(r[Data.RS.IndexOf(re)], (Data.InitialState as IALPState)[re]);
                INumExpr expr2 = SubModel.NumExpr();
                foreach (IALPDecision a in Data.DS)
                {
                    if (a.UseResource(re))
                    {
                        expr2 = SubModel.Sum(expr2, h[Data.DS.IndexOf(a)]);
                    }
                }
                expr2 = SubModel.Sum(expr2, SubModel.Prod(-1, r[Data.RS.IndexOf(re)]));
                SubModel.AddLe(expr2, 0);
            }
            #endregion

            #region 初始化目标函数第一部分
            //Parallel.For(0, Data.TimeHorizon, t =>
            for (int t = 0; t < Data.TimeHorizon; t++)
            {
                int  iteration = t;
                Task ta        = factory.StartNew(() =>
                {
                    subObject[0][iteration] = SubModel.NumExpr();
                    foreach (IMDPDecision a in Data.DS)
                    {
                        subObject[0][iteration] = SubModel.Sum(subObject[0][iteration],
                                                               SubModel.Prod(Data.Rt(iteration, a), h[Data.DS.IndexOf(a)]));
                    }
                }, cts.Token);
                tasks.Add(ta);
            }
            #endregion
            Task.WaitAll(tasks.ToArray());
            tasks.Clear();

            SubModel.SetOut(null);
        }
        private void InitRCGModel()
        {
            SubModel.ClearModel();
            h = SubModel.NumVarArray(Data.DS.Count, 0, double.MaxValue);
            r = SubModel.NumVarArray(Data.RS.Count, 0, double.MaxValue);
            constraint_sub2 = new IRange[Data.RS.Count];
            subObject[0]    = new INumExpr[Data.TimeHorizon];
            subObject[1]    = new INumExpr[Data.TimeHorizon];

            #region 生成约束
            //第一、四种约束
            INumExpr expr1 = SubModel.NumExpr();
            foreach (IMDPDecision d in Data.DS)
            {
                expr1 = SubModel.Sum(expr1, h[Data.DS.IndexOf(d)]);//SubModel.AddGe(h[aff.DS.IndexOf(d)], 0);
            }
            SubModel.AddEq(expr1, 1);

            //第二、三种约束
            foreach (IALPResource re in Data.RS)
            {
                constraint_sub2[Data.RS.IndexOf(re)] = SubModel.AddLe(r[Data.RS.IndexOf(re)], (Data.InitialState as IALPState)[re]);
                INumExpr expr2 = SubModel.NumExpr();
                foreach (IALPDecision a in Data.DS)
                {
                    if (a.UseResource(re))
                    {
                        expr2 = SubModel.Sum(expr2, h[Data.DS.IndexOf(a)]);
                    }
                }
                expr2 = SubModel.Sum(expr2, SubModel.Prod(-1, r[Data.RS.IndexOf(re)]));
                SubModel.AddLe(expr2, 0);
            }
            #endregion

            #region 初始化目标函数第一部分
            Parallel.For(0, Data.TimeHorizon, t =>
                         //for (int t = 0; t < Data.TimeHorizon; t++)
            {
                subObject[0][t] = SubModel.NumExpr();
                foreach (IMDPDecision a in Data.DS)
                {
                    subObject[0][t] = SubModel.Sum(subObject[0][t],
                                                   SubModel.Prod(Data.Rt(t, a), h[Data.DS.IndexOf(a)]));
                }
            });
            #endregion

            SubModel.SetOut(null);
        }
Beispiel #4
0
        private void InitRMPModel()
        {
            RMPModel.ClearModel();
            cost        = RMPModel.AddMaximize();
            constraint1 = new IRange[Data.TimeHorizon][];
            constraint2 = new IRange[Data.TimeHorizon];
            DualValue1  = new double[Data.TimeHorizon][];
            DualValue2  = new double[Data.TimeHorizon];

            #region //////////////生成约束//////////////
            //Parallel.For(0, Data.TimeHorizon, i =>
            for (int i = 0; i < Data.TimeHorizon; i++)
            {
                lock (RMPModel)
                {
                    constraint1[i] = new IRange[Data.RS.Count];
                    DualValue1[i]  = new double[Data.RS.Count];
                    foreach (IALPResource re in Data.RS)
                    {
                        if (i == 0)
                        {
                            constraint1[i][Data.RS.IndexOf(re)] = RMPModel.AddRange((Data.InitialState as IALPState)[re], (Data.InitialState as IALPState)[re]);
                        }
                        else
                        {
                            constraint1[i][Data.RS.IndexOf(re)] = RMPModel.AddRange(0, 0);
                        }
                    }
                    constraint2[i] = RMPModel.AddRange(1, 1);
                }
            }
            #endregion

            //RMPModel.SetParam(Cplex.LongParam.RootAlgorithm, 1);
            RMPModel.SetOut(SolverTextWriter);
        }
Beispiel #5
0
        static int Main(string[] args)
        {
            int          status  = 127;
            const string DATADIR = "../..";
            const double RC_EPS  = 0.000001;

            try
            {
                OplFactory.DebugMode = true;
                OplFactory      oplF       = new OplFactory();
                OplErrorHandler errHandler = oplF.CreateOplErrorHandler();
                OplSettings     settings   = oplF.CreateOplSettings(errHandler);
                // Make master model
                Cplex masterCplex = oplF.CreateCplex();
                masterCplex.SetOut(null);

                OplRunConfiguration masterRC0 = oplF.CreateOplRunConfiguration(DATADIR + "/cutstock.mod", DATADIR + "/cutstock.dat");
                masterRC0.Cplex = masterCplex;
                OplDataElements masterDataElements = masterRC0.OplModel.MakeDataElements();

                // prepare sub model source, definition and engine
                OplModelSource     subSource = oplF.CreateOplModelSource(DATADIR + "/cutstock-sub.mod");
                OplModelDefinition subDef    = oplF.CreateOplModelDefinition(subSource, settings);
                Cplex subCplex = oplF.CreateCplex();
                subCplex.SetOut(null);

                const int nbItems = 5;
                IIntRange items   = masterCplex.IntRange(1, 5);
                double    best;
                double    curr = double.MaxValue;
                do
                {
                    best = curr;

                    masterCplex.ClearModel();

                    OplRunConfiguration masterRC = oplF.CreateOplRunConfiguration(masterRC0.OplModel.ModelDefinition, masterDataElements);
                    masterRC.Cplex = masterCplex;
                    masterRC.OplModel.Generate();

                    Console.Out.WriteLine("Solve master.");
                    if (masterCplex.Solve())
                    {
                        curr = masterCplex.ObjValue;
                        Console.Out.WriteLine("OBJECTIVE: " + curr);
                        status = 0;
                    }
                    else
                    {
                        Console.Out.WriteLine("No solution!");
                        status = 1;
                    }

                    // prepare sub model data
                    OplDataElements subDataElements = oplF.CreateOplDataElements();
                    subDataElements.AddElement(masterDataElements.GetElement("RollWidth"));
                    subDataElements.AddElement(masterDataElements.GetElement("Size"));
                    subDataElements.AddElement(masterDataElements.GetElement("Duals"));
                    // get reduced costs and set them in sub problem
                    INumMap duals = subDataElements.GetElement("Duals").AsNumMap();
                    for (int i = 1; i <= nbItems; i++)
                    {
                        IForAllRange forAll = (IForAllRange)masterRC.OplModel.GetElement("ctFill").AsConstraintMap().Get(i);
                        duals.Set(i, masterCplex.GetDual(forAll));
                    }
                    //make sub model
                    OplModel subOpl = oplF.CreateOplModel(subDef, subCplex);
                    subOpl.AddDataSource(subDataElements);
                    subOpl.Generate();

                    Console.Out.WriteLine("Solve sub.");
                    if (subCplex.Solve())
                    {
                        Console.Out.WriteLine("OBJECTIVE: " + subCplex.ObjValue);
                        status = 0;
                    }
                    else
                    {
                        Console.Out.WriteLine("No solution!");
                        status = 1;
                    }

                    if (subCplex.ObjValue > -RC_EPS)
                    {
                        break;
                    }

                    // Add variable in master model
                    IIntMap newFill = masterCplex.IntMap(items);
                    for (int i = 1; i <= nbItems; i++)
                    {
                        int coef = (int)subCplex.GetValue(subOpl.GetElement("Use").AsIntVarMap().Get(i));
                        newFill.Set(i, coef);
                    }
                    ITupleBuffer buf = masterDataElements.GetElement("Patterns").AsTupleSet().MakeTupleBuffer(-1);
                    buf.SetIntValue("id", masterDataElements.GetElement("Patterns").AsTupleSet().Size);
                    buf.SetIntValue("cost", 1);
                    buf.SetIntMapValue("fill", newFill);
                    buf.Commit();

                    subOpl.End();
                    masterRC.End();
                } while (best != curr && status == 0);
                oplF.End();
            }
            catch (ILOG.OPL.OplException ex)
            {
                Console.WriteLine(ex.Message);
                status = 2;
            }
            catch (ILOG.Concert.Exception ex)
            {
                Console.WriteLine(ex.Message);
                status = 3;
            }
            catch (System.Exception ex)
            {
                Console.WriteLine(ex.Message);
                status = 4;
            }

            Console.WriteLine("--Press <Enter> to exit--");
            Console.ReadLine();
            return(status);
        }
Beispiel #6
0
 public void CleanUp()
 {
     model.ClearModel();
     model.Dispose();
 }
Beispiel #7
0
 /// <summary>
 /// Clear Cplex
 /// </summary>
 public void ClearModel()
 {
     _solver.ClearModel();
     _solver.Dispose();
 }