로드 중...
검색 중...
일치하는 항목 없음
transport12.py
이 파일의 문서로 이동하세요.
1
6
7가져오기sys
8from게임가져오기 (
9GamsWorkspace,
10GamsModifier,
11GamsEquation,
12슬롯 사이트변수,
13GamsException,
14업데이트액션,
15VarType,
16SymbolUpdateType,
17)
18
19GAMS_MODEL ="""
20설정
21i '통조림 공장' / 시애틀, 샌디에고 /
22j 'markets' / 뉴욕, 시카고, 토피카 /;
23
24매개변수
25a(i) '경우에 따른 식물 i의 용량'
26/시애틀 350
27샌디에고 600 /
28
29b(j) '경우에 따라 시장 j의 수요'
30/ 뉴욕 325
31시카고 300
32토페카 275 /;
33
34테이블 d(i,j) '거리(천 마일)'
35뉴욕 시카고 토피카
36시애틀 2.5 1.7 1.8
37산디에고 2.5 1.8 1.4;
38
39스칼라
40f '1,000마일당 케이스당 달러 단위의 화물' / 90 /
41bmult '수요 승수' / 1 /;
42
43매개변수 c(i,j) '케이스당 수천 달러의 운송 비용';
44c(i,j) = f*d(i,j)/1000;
45
46변수
47x(i,j) '케이스의 배송 수량'
48z '총 운송 비용(수천 달러)';
49
50양수 변수 x;
51
52수식
53비용 '목적 함수 정의'
54supply(i) '공장 i의 공급 제한을 준수하세요'
55demand(j) '시장 j의 수요를 충족';
56
57비용.. z =e= sum((i,j), c(i,j)*x(i,j));
58
59공급(i).. 합계(j, x(i,j)) =l= a(i);
60
61수요(j).. sum(i, x(i,j)) =g= bmult*b(j);
62
63모델 전송 /all/;
64"""
65
66
67#은 인스턴스화되지 않은 GamsModelInstance로 호출되어야 합니다.
68defguss_call(scenario_dict, mi,solv_statement, opt=없음, mi_opt=없음, 출력=없음):
69 ifscenario_dict.dimension != 3:
70 올림GamsException("시나리오 사전은 3차원이어야 합니다")
71
72scen_name = 시나리오_dict.first_record((" ", "시나리오", " ")).key(0)
73scen_symbol = 시나리오_dict.database[scen_name]
74modifier_list = []
75 forrecscenario_dict:
76 ifrec.key(1).lower() =="시나리오":
77 계속
78 ifrec.key(1).lower() =="매개변수":
79modifier_dim = (
80scenario_dict.database[rec.key(2)].dimension - scen_symbol.dimension
81 )
82 ifmodifier_dim < 0:
83 올림GamsException("크기"+ Rec.key(2) +"너무 작습니다")
84modifier_list.append(
85 (
86GamsModifier(
87mi.sync_db.add_parameter(rec.key(0), modifier_dim,"")
88 ),
89scenario_dict.database[rec.key(2)],
90 )
91 )
92 엘리프rec.key(1).lower()in["낮은", "상단", "고정됨"]:
93modifier_dim = (
94scenario_dict.database[rec.key(2)].dimension - scen_symbol.dimension
95 )
96 ifmodifier_dim < 0:
97 올림GamsException("크기"+ Rec.key(2) +"너무 작습니다")
98modifier_var =없음
99 시도해 보세요:
100modifier_var = 시나리오_dict.database[rec.key(0)]
101 제외:
102modifier_var = mi.sync_db.add_variable(
103rec.key(0), modifier_dim, VarType.Free,""
104 )
105 ifrec.key(1).lower() =="낮은":
106update_action = UpdateAction.Lower
107 엘리프rec.key(1).lower() =="상단":
108update_action = UpdateAction.Upper
109 그밖에:# 수정됨
110update_action = UpdateAction.Fixed
111modifier_list.append(
112 (
113GamsModifier(
114modifier_var,
115update_action,
116mi.sync_db.add_parameter(rec.key(2), modifier_dim,""),
117 ),
118scenario_dict.database[rec.key(2)],
119 )
120 )
121 엘리프rec.key(1).lower()in["레벨", "한계"]:
122 # GamsDatabase에 매개변수가 있는지 확인하고 없으면 예외가 발생합니다.
123scenario_dict.database[rec.key(2)]
124 그밖에:
125 올림GamsException("UpdateAction을 처리할 수 없습니다"+ Rec.key(1))
126
127ml = [m[0]formin수정자_목록]
128mi.instantiate(solve_statement, ml, opt)
129out_list = []
130 forsscen_symbol:
131 form, p_scen수정자_목록:
132p = m.gams_symbolifm.data_symbolis 없음 그밖에m.data_symbol
133p.clear()# SymbolUpdateType=BaseCase를 구현함
134
135rec =없음
136필터 = [""] * p_scen.dimension
137 foriin범위(scen_symbol.dimension):
138필터[i] = s.key(i)
139 foriin범위(scen_symbol.dimension, p_scen.dimension):
140필터[i] =" "
141 시도해 보세요:
142rec = p_scen.first_record(필터)
143 제외:
144 계속
145
146 그동안 :
147my_keys = [
148rec.key(scen_symbol.dimension + i)foriin범위(p.dimension)
149]
150p.add_record(my_keys).value = Rec.value
151 if 아님rec.move_next():
152 휴식
153
154mi.solve(SymbolUpdateType.BaseCase, 출력, mi_opt)
155 if 아님out_list:
156 forrecscenario_dict:
157 ifrec.key(1).lower()in["레벨", "한계"]:
158out_list.append(
159 (
160mi.sync_db[rec.key(0)],
161scenario_dict.database[rec.key(2)],
162rec.key(1).lower(),
163 )
164 )
165
166 fortupinout_list:
167my_keys = [""] * (scen_symbol.dimension + len(tup[0].first_record().keys))
168 fori범위(scen_symbol.dimension):
169my_keys[i] = s.key(i)
170
171 ifisinstance(tup[0], (GamsVariable, GamsEquation)):
172 if트업[2]in["레벨", "한계"]:
173 forrecintup[0]:
174 fori범위(len(rec.keys)):
175my_keys[scen_symbol.dimension + i] = s.key(i)
176tup[1].add_record(my_keys).value = (
177rec.leveliftup[2] =="레벨" 그밖에rec.marginal
178 )
179
180
181if__name__ =="__main__":
182sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
183work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
184ws = GamsWorkspace(system_directory=sys_dir, Working_directory=work_dir)
185
186cp = ws.add_checkpoint()
187
188 # GamsJob을 실행하여 GamsCheckpoint를 초기화합니다.
189작업 = ws.add_job_from_string(GAMS_MODEL)
190job.run(체크포인트=cp)
191
192 # GamsModelInstance를 생성하고 다른 스칼라 bmult를 사용하여 여러 번 해결합니다.
193mi = cp.add_modelinstance()
194bmult_list = [0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2, 1.3]
195db = ws.add_database()
196슬롯 사이트 = db.add_set("장면", 1,"")
197bmult = db.add_parameter_dc("b다중 목록", [장면])
198zscen = db.add_parameter_dc("zscen", [장면])
199
200 fori, bin열거(bmult_list):
201bmult.add_record(f"si").값 = b
202슬롯 사이트add_record(f"si")
203
204scenario_dict = db.add_set("scenario_dict", 3,"")
205scenario_dict.add_record((슬롯 사이트name,"시나리오", ""))
206scenario_dict.add_record(("bmult", "매개변수", bmult.name))
207scenario_dict.add_record(("z", "레벨", zscen.name))
208
209guss_call(scenario_dict, mi,"운송은 lp min z를 사용합니다")
210
211 forrecdb[zscen.name]:
212인쇄(f"rec.key(0) obj: rec.value")
213
214mi2 = cp.add_modelinstance()
215db2 = ws.add_database()
216
217scen2 = db2.add_set("장면", 1,"")
218zscen2 = db2.add_parameter_dc("zscen", [scen2])
219xup = db2.add_parameter("xup", 3,"")
220
221 forjin범위(4):
222 forrec_iinjob.out_db["나"]:
223 forrec_jjob.out_db["j"]:
224xup.add_record((f"sj", rec_i.key(0), rec_j.key(0))).value = j + 1
225scen2.add_record(f"sj")
226
227scenario_dict2 = db2.add_set("scenario_dict", 3,"")
228scenario_dict2.add_record((scen2.name,"시나리오", ""))
229scenario_dict2.add_record(("x", "낮은", xup.name))
230scenario_dict2.add_record(("z", "레벨", zscen2.name))
231
232guss_call(scenario_dict2, mi2,"운송은 lp min z를 사용합니다", 출력=sys.stdout)
233
234 forrecindb2[zscen2.name]:
235인쇄(f"rec.key(0) obj: rec.value")