8from threading
import Lock, Thread
9from gams
import GamsWorkspace
13 def __init__(self, system_directory=None, working_directory=None):
14 self._ws = GamsWorkspace(
15 system_directory=system_directory, working_directory=working_directory
18 def solve(self, bmult, lock):
20 db = self._ws.add_database()
22 f = db.add_parameter(
"f", 0,
"freight in dollars per case per thousand miles")
23 f.add_record().value = 90 * bmult
24 job = self._ws.add_job_from_string(Optimizer.GAMS_MODEL)
25 opt = self._ws.add_options()
26 opt.defines[
"gdxincname"] = db.name
27 job.run(opt, databases=db)
28 return job.out_db[
"z"].first_record().level
32 i 'canning plants' / seattle, san-diego /
33 j 'markets' / new-york, chicago, topeka /;
36 a(i) 'capacity of plant i in cases'
40 b(j) 'demand at market j in cases'
45Table d(i,j) 'distance in thousands of miles'
46 new-york chicago topeka
48 san-diego 2.5 1.8 1.4;
50Scalar f 'freight in dollars per case per thousand miles';
52$if not set gdxincname $abort 'no include file name for data file provided'
57Parameter c(i,j) 'transport cost in thousands of dollars per case';
58c(i,j) = f*d(i,j)/1000;
61 x(i,j) 'shipment quantities in cases'
62 z 'total transportation costs in thousands of dollars';
67 cost 'define objective function'
68 supply(i) 'observe supply limit at plant i'
69 demand(j) 'satisfy demand at market j';
71cost.. z =e= sum((i,j), c(i,j)*x(i,j));
73supply(i).. sum(j, x(i,j)) =l= a(i);
75demand(j).. sum(i, x(i,j)) =g= b(j);
79solve transport using lp minimizing z;
85if __name__ ==
"__main__":
86 sys_dir = sys.argv[1]
if len(sys.argv) > 1
else None
87 work_dir = sys.argv[2]
if len(sys.argv) > 2
else None
88 optimizer = Optimizer(sys_dir, work_dir)
89 bmult_list = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
92 def run_scenario(optimizer, bmult, lock):
93 obj = optimizer.solve(bmult, lock)
95 print(f
"Scenario bmult={bmult}, Obj:{obj}")
98 for bmult
in bmult_list:
99 t = Thread(target=run_scenario, args=(optimizer, bmult, lock))