7 using System.Collections.Generic;
21 static void Main(
string[] args)
24 if (Environment.GetCommandLineArgs().Length > 1)
25 ws =
new GAMSWorkspace(systemDirectory: Environment.GetCommandLineArgs()[1]);
34 opt.
Defines.Add(
"pmax", maxpattern.ToString());
35 opt.
Defines.Add(
"solveMasterAs",
"RMIP");
38 Dictionary<string, double> d =
new Dictionary<string, double>() { {
"i1", 97 }, {
"i2", 610 }, {
"i3", 395 }, {
"i4", 211 } };
39 Dictionary<string, double> w =
new Dictionary<string, double>() { {
"i1", 47 }, {
"i2", 36 }, {
"i3", 31 }, {
"i4", 14 } };
53 foreach (
string i
in d.Keys)
55 foreach (KeyValuePair<string, double> t
in d)
56 demand.AddRecord(t.Key).Value = t.Value;
57 foreach (KeyValuePair<string, double> t
in w)
58 width.AddRecord(t.Key).Value = t.Value;
62 GAMSJob masterInitJob = ws.AddJobFromString(GetMasterModel());
63 masterInitJob.
Run(opt, masterCP, cutstockData);
65 GAMSJob masterJob = ws.AddJobFromString(
"execute_load 'csdata', aip, pp; solve master min z using %solveMasterAs%;", masterCP);
67 GAMSSet pattern = cutstockData.AddSet(
"pp", 1,
"pattern index");
68 GAMSParameter patternData = cutstockData.AddParameter(
"aip", 2,
"pattern data");
72 foreach(KeyValuePair<string,double> t
in w)
74 patternData.
AddRecord(t.Key, pattern.AddRecord((++patternCount).ToString()).Key(0)).
Value = (int)(r / t.Value);
79 ws.AddJobFromString(GetSubModel()).Run(opt, subCP, cutstockData);
87 bool patternAdded =
true;
90 masterJob.Run(opt, masterCP, cutstockData);
99 if (patternCount == maxpattern)
101 Console.Out.WriteLine(
"Out of pattern. Increase maxpattern (currently {0}).", maxpattern);
102 patternAdded =
false;
107 GAMSSetRecord s = pattern.AddRecord((++patternCount).ToString());
112 patternData.AddRecord(y.
Key(0), s.Key(0)).Value = Math.Round(y.
Level);
117 else patternAdded =
false;
118 }
while (patternAdded);
121 opt.Defines[
"solveMasterAs"] =
"MIP";
122 masterJob.Run(opt, cutstockData);
123 Console.WriteLine(
"Optimal Solution: {0}", masterJob.OutDB.GetVariable(
"z").FindRecord().Level);
128 Console.Out.Write(
" pattern {0} {1} times: ", xp.
Key(0), xp.
Level);
132 Console.Out.Write(
" {0}: {1}", aip.
Key(0), aip.
Value);
134 Console.Out.WriteLine();
138 cutstockData.Dispose();
143 static String GetMasterModel()
146 $Title Cutting Stock - Master problem
157 $if not set pmax $set pmax 1000
158 Set p possible patterns /1*%pmax%/
159 pp(p) dynamic subset of p
161 aip(i,p) number of width i in pattern growing in p;
164 Variable xp(p) patterns used
166 Integer variable xp; xp.up(p) = sum(i, d(i));
168 Equation numpat number of patterns used
169 demand(i) meet demand;
171 numpat.. z =e= sum(pp, xp(pp));
172 demand(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);
174 model master /numpat, demand/;";
178 static String GetSubModel()
181 $Title Cutting Stock - Pricing problem is a knapsack model
193 demdual(i) duals of master demand constraint /#i eps/;
195 Variable z, y(i) new pattern;
196 Integer variable y; y.up(i) = ceil(r/w(i));
199 knapsack knapsack constraint;
201 defobj.. z =e= 1 - sum(i, demdual(i)*y(i));
202 knapsack.. sum(i, w(i)*y(i)) =l= r;
204 model pricing /defobj, knapsack/; pricing.optfile=1";
void Instantiate(string modelDefinition, params GAMSModifier[] modifiers)
Dictionary< string, string > Defines
new GAMSParameterRecord AddRecord(params string[] keys)
new GAMSVariableRecord FindRecord(params string[] keys)
GAMSOptions AddOptions(GAMSOptions optFrom=null)
GAMSModelInstance AddModelInstance(string modelInstanceName=null)
GAMSVariable GetVariable(string variableIdentifier)
void Solve(SymbolUpdateType updateType=SymbolUpdateType.BaseCase, TextWriter output=null, GAMSModelInstanceOpt miOpt=null)
GAMSParameter AddParameter(string identifier, int dimension, string explanatoryText="")
void Run(GAMSOptions gamsOptions=null, GAMSCheckpoint checkpoint=null, TextWriter output=null, Boolean createOutDB=true)
GAMSDatabase AddDatabase(string databaseName=null, string inModelName=null)
GAMSSet AddSet(string identifier, int dimension, string explanatoryText="", SetType setType=SetType.multi)