10from gams
import GamsWorkspace, GamsModifier, UpdateAction, VarType
11import gams.transfer
as gt
20 a(i) 'capacity of plant i in cases'
21 b(j) 'demand at market j in cases'
22 d(i,j) 'distance in thousands of miles';
24Scalar f 'freight in dollars per case per thousand miles';
26$if not set gdxincname $abort 'no include file name for data file provided'
31Parameter c(i,j) 'transport cost in thousands of dollars per case';
32c(i,j) = f*d(i,j)/1000;
35 x(i,j) 'shipment quantities in cases'
36 z 'total transportation costs in thousands of dollars';
41 cost 'define objective function'
42 supply(i) 'observe supply limit at plant i'
43 demand(j) 'satisfy demand at market j';
45Scalar bmult 'demand multiplier' / 1 /;
47cost .. z =e= sum((i,j), c(i,j)*x(i,j));
49supply(i) .. sum(j, x(i,j)) =l= a(i);
51demand(j) .. sum(i, x(i,j)) =g= bmult*b(j);
55Solve transport using lp minimizing z;
58if __name__ ==
"__main__":
59 sys_dir = sys.argv[1]
if len(sys.argv) > 1
else None
60 work_dir = sys.argv[2]
if len(sys.argv) > 2
else None
61 ws = GamsWorkspace(system_directory=sys_dir, working_directory=work_dir)
63 m = gt.Container(system_directory=sys_dir)
64 i = m.addSet(
"i", records=[
"Seattle",
"San-Diego"])
65 j = m.addSet(
"j", records=[
"New-York",
"Chicago",
"Topeka"])
66 m.addParameter(
"a", [i], records=np.array([350, 600]))
67 m.addParameter(
"b", [j], records=np.array([325, 300, 275]))
68 m.addParameter(
"d", [i, j], records=np.array([[2.5, 1.7, 1.8], [2.5, 1.8, 1.4]]))
69 m.addParameter(
"f", records=90)
71 job = ws.add_job_from_string(GAMS_MODEL)
72 opt = ws.add_options()
73 opt.defines[
"gdxincname"] =
"gtin.gdx"
74 opt.all_model_types =
"xpress"
77 m.write(os.path.join(ws.working_directory, opt.defines[
"gdxincname"]))
78 cp = ws.add_checkpoint()
79 job.run(gams_options=opt, checkpoint=cp, create_out_db=
False)
80 job_out = gt.Container(os.path.join(ws.working_directory, opt.gdx), sys_dir)
83 mi = cp.add_modelinstance()
84 bmult = mi.sync_db.add_parameter(
"bmult", 0,
"demand multiplier")
85 opt = ws.add_options()
86 opt.all_model_types =
"cplex"
89 mi.instantiate(
"transport use lp min z", GamsModifier(bmult), opt)
91 bmult.add_record().value = 1.0
92 bmultlist = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
94 m = gt.Container(system_directory=sys_dir)
95 gt_bmult = m.addParameter(
"bmult", records=1.0)
97 gt_bmult.setRecords(b)
100 m_out = gt.Container(mi.sync_db, sys_dir)
101 print(f
"Scenario bmult={b}:")
102 print(f
" Modelstatus: {mi.model_status}")
103 print(f
" Solvestatus: {mi.solver_status}")
104 print(f
" Obj: {m_out.data['z'].records['level'].iloc[0]}")
107 mi = cp.add_modelinstance()
108 x = mi.sync_db.add_variable(
"x", 2, VarType.Positive)
109 xup = mi.sync_db.add_parameter(
"xup", 2,
"upper bound on x")
112 mi.instantiate(
"transport use lp min z", GamsModifier(x, UpdateAction.Upper, xup))
115 m = gt.Container(system_directory=sys_dir)
116 gt_xup = m.addParameter(
"xup", [
"i",
"j"])
117 for i
in job_out.data[
"i"].records[
"uni"]:
118 for j
in job_out.data[
"j"].records[
"uni"]:
119 gt_xup.setRecords([(i, j, -0.0)])
122 m_out = gt.Container(mi.sync_db, sys_dir)
123 print(f
"Scenario link blocked: {i} - {j}")
124 print(f
" Modelstatus: {mi.model_status}")
125 print(f
" Solvestatus: {mi.solver_status}")
126 print(f
" Obj: {m_out.data['z'].records['level'].iloc[0]}")