Loading...
Searching...
No Matches
transport14.py
Go to the documentation of this file.
1
6
7import sys
8from threading import Lock, Thread
9from gams import GamsWorkspace
10
11
12class Optimizer():
13 def __init__(self, system_directory=None, working_directory=None):
14 self._ws = GamsWorkspace(
15 system_directory=system_directory, working_directory=working_directory
16 )
17
18 def solve(self, bmult, lock):
19 lock.acquire()
20 db = self._ws.add_database()
21 lock.release()
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
29
30 GAMS_MODEL = """
31Set
32 i 'canning plants' / seattle, san-diego /
33 j 'markets' / new-york, chicago, topeka /;
34
35Parameter
36 a(i) 'capacity of plant i in cases'
37 / seattle 350
38 san-diego 600 /
39
40 b(j) 'demand at market j in cases'
41 / new-york 325
42 chicago 300
43 topeka 275 /;
44
45Table d(i,j) 'distance in thousands of miles'
46 new-york chicago topeka
47 seattle 2.5 1.7 1.8
48 san-diego 2.5 1.8 1.4;
49
50Scalar f 'freight in dollars per case per thousand miles';
51
52$if not set gdxincname $abort 'no include file name for data file provided'
53$gdxIn %gdxincname%
54$load f
55$gdxIn
56
57Parameter c(i,j) 'transport cost in thousands of dollars per case';
58c(i,j) = f*d(i,j)/1000;
59
60Variable
61 x(i,j) 'shipment quantities in cases'
62 z 'total transportation costs in thousands of dollars';
63
64Positive Variable x;
65
66Equations
67 cost 'define objective function'
68 supply(i) 'observe supply limit at plant i'
69 demand(j) 'satisfy demand at market j';
70
71cost.. z =e= sum((i,j), c(i,j)*x(i,j));
72
73supply(i).. sum(j, x(i,j)) =l= a(i);
74
75demand(j).. sum(i, x(i,j)) =g= b(j);
76
77Model transport /all/;
78
79solve transport using lp minimizing z;
80
81display x.l, x.m;
82"""
83
84
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]
90 lock = Lock()
91
92 def run_scenario(optimizer, bmult, lock):
93 obj = optimizer.solve(bmult, lock)
94 lock.acquire()
95 print(f"Scenario bmult={bmult}, Obj:{obj}")
96 lock.release()
97
98 for bmult in bmult_list:
99 t = Thread(target=run_scenario, args=(optimizer, bmult, lock))
100 t.start()