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); }
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); }
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); }
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); }
public void CleanUp() { model.ClearModel(); model.Dispose(); }
/// <summary> /// Clear Cplex /// </summary> public void ClearModel() { _solver.ClearModel(); _solver.Dispose(); }