로드 중...
검색 중...
일치하는 항목 없음
run_engine.py
이 파일의 문서로 이동하세요.
1
11
12fromio가져오기문자열IO
13가져오기json
14가져오기os
15가져오기sys
16from스레딩가져오기스레드
17가져오기시간
18from감스가져오기GamsWorkspace, GamsEngineConfiguration, SolveLink
19
20
21GAMS_DATA ="""
22설정
23i '통조림 공장' / 시애틀, 샌디에고 /
24j 'markets' / 뉴욕, 시카고, 토피카 /;
25
26매개변수
27a(i) '경우에 따른 식물 i의 용량'
28/시애틀 350
29샌디에고 600 /
30
31b(j) '경우에 따라 시장 j의 수요'
32/뉴욕 325
33시카고 300
34토피카 275 /;
35
36테이블 d(i,j) '거리(천 마일)'
37뉴욕 시카고 토피카
38시애틀 2.5 1.7 1.8
39샌디에고 2.5 1.8 1.4;
40
41스칼라
42f '1,000마일당 케이스당 운임(달러)' / 90 /
43bmult '수요 승수' / 1 /;
44"""
45
46GAMS_MODEL ="""
47설정
48i '통조림 식물'
49j '시장';
50
51매개변수
52a(i) '경우에 따른 식물 i의 용량'
53b(j) '경우에 따라 시장 j의 수요'
54d(i,j) '거리(천 마일)';
55
56스칼라
57f '1,000마일당 케이스당 달러 단위의 화물'
58bmult '수요 승수';
59
60$if 설정되지 않음 gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름 없음'
61$gdxIn %gdxincname%
62$load i j a b d f bmult
63$gdxIn
64
65$echo "테스트" > test.txt
66
67매개변수 c(i,j) '케이스당 수천 달러의 운송 비용';
68c(i,j) = f*d(i,j)/1000;
69
70변수
71x(i,j) '케이스의 배송 수량'
72z '총 운송 비용(수천 달러)';
73
74양수 변수 x;
75
76수식
77비용 '목적 함수 정의'
78supply(i) '공장 i의 공급 제한을 준수하세요'
79demand(j) '시장 j의 수요를 충족';
80
81비용.. z =e= 합계((i,j), c(i,j)*x(i,j));
82
83공급(i).. 합계(j, x(i,j)) =l= a(i);
84
85수요(j).. sum(i, x(i,j)) =g= bmult*b(j);
86
87모델 전송 /all/;
88
89z를 최소화하는 lp를 사용하여 전송을 해결합니다.
90
91스칼라
92ms '모델 상태'
93ss '상태 해결';
94
95x.l, x.m 표시;
96"""
97
98if__name__ =="__main__":
99sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
100work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
101ws = GamsWorkspace(system_directory=sys_dir, Working_directory=work_dir)
102
103 # 슬롯 사이트 엔진의 모든 작업에 필요한 구성 설정
104
105engine_configuration = GamsEngineConfiguration(
106호스트=os.environ["엔진_URL"],
107사용자 이름=os.environ["엔진_사용자"],
108password=os.environ["엔진_비밀번호"],
109네임스페이스=os.environ["ENGINE_NAMESPACE"],
110 )
111
112작업 = ws.add_job_from_string(GAMS_DATA)
113job.run_engine(engine_configuration)
114gdx_file_path = os.path.join(ws.working_directory,"tdata.gdx")
115job.out_db.export(gdx_file_path)
116작업 = ws.add_job_from_string(GAMS_MODEL)
117
118opt = ws.add_options()
119opt.defines["gdxincname"] ="tdata"
120opt.all_model_types ="익스프레스"
121job.run_engine(
122엔진_구성,
123extra_model_files=gdx_file_path,
124엔진_옵션=
125 "inex_string": json.dumps("유형":"포함", "파일": ["*.gdx"]})
126},
127gams_options=선택,
128 )
129예상_레벨 =
130 ("시애틀", "뉴욕"): 0.0,
131 ("시애틀", "시카고"): 300.0,
132 ("시애틀", "토피카"): 0.0,
133 ("샌디에고", "뉴욕"): 325.0,
134 ("샌디에고", "시카고"): 0.0,
135 ("샌디에고", "토페카"): 275.0,
136}
137
138 forrecinjob.out_db["x"]:
139인쇄(
140f"x(rec.key(0),rec.key(1)): 레벨=rec.level 한계=rec.marginal"
141 )
142 ifexpected_levels[tuple(rec.keys)] != Rec.level:
143 올림예외("예기치 못한 결과입니다.")
144
145 ifos.path.exists(os.path.join(ws.working_directory,"test.txt")):
146 올림예외(
147 "원격으로 실행되는 슬롯 사이트 모델로 작성된 'test.txt'를 찾을 것으로 예상하지 못했습니다."
148 )
149
150cp = ws.add_checkpoint()
151
152job_a = ws.add_job_from_string(GAMS_DATA)
153job_a.run_engine(engine_configuration)
154opt.defines["gdxincname"] = job_a.out_db.name
155
156job_b = ws.add_job_from_string(GAMS_MODEL)
157job_b.run_engine(
158엔진_구성, gams_options=opt, 데이터베이스=job_a.out_db, 체크포인트=cp
159 )
160
161 forrecinjob.out_db["x"]:
162 ifexpected_levels[tuple(rec.keys)] != Rec.level:
163 올림예외("예기치 못한 결과입니다.")
164
165expected_bmult = [
166{"bmult": 0.9,"ms": 1,"ss": 1,"obj": 138.31},
167{"bmult": 1.2,"ms": 4,"ss": 1,"obj": 184.41},
168]
169
170 # GamsCheckpoint에서 초기화되는 새로운 GamsJob 생성
171 for장면expected_bmult:
172작업 = ws.add_job_from_string(
173f"bmult=scen['bmult']; lp를 사용하여 전송 최소 z 해결; ms=transport.modelstat; ss=transport.solvestat;",
174cp,
175 )
176job.run_engine(engine_configuration)
177인쇄(f"시나리오 bmult=scen['bmult']:")
178인쇄(f" 모델 상태: job.out_db['ms'].find_record().value")
179인쇄(f" 해결 상태: job.out_db['ss'].find_record().value")
180인쇄(f" Obj: job.out_db['z'].find_record().level")
181
182 ifjob.out_db["bmult"].find_record().value != 장면["bmult"]:
183 올림예외("예기치 못한 bmult.")
184 ifjob.out_db["ms"].find_record().value != 장면["ms"]:
185 인상예외("예기치 못한 모델 상태입니다.")
186 ifjob.out_db["ss"].find_record().value != 장면["ss"]:
187 올림예외("예기치 않은 해결 상태입니다.")
188 if라운드(job.out_db["z"].find_record().level, 2) != 장면["obj"]:
189 올림예외("예기치 않은 개체.")
190
191 # 엔진 작업을 중단하는 방법의 예
192
193ws.gamslib("입은")
194작업 = ws.add_job_from_file("입은")
195
196 # 사용할 솔버에 대한 옵션 파일을 정의
197option_file1_path = os.path.join(ws.working_directory,"cplex.opt")
198 열기(option_file1_path,"w") asf:
199 # 처음에는 상대 중지 허용 오차를 0으로 설정
200f.write("epgap 0\n")
201 # 인터럽트 시 대화형 옵션 설정 활성화
202f.write("대화형 1\n")
203 # 인터럽트 시 읽을 새 옵션 파일을 정의
204f.write("iafile cplex.op2\n")
205
206 # 새 Cplex 옵션 파일 작성
207option_file2_path = os.path.join(ws.working_directory,"cplex.op2")
208 열기(option_file2_path,"w") asf:
209f.write("epgap 0.1")
210
211opt = ws.add_options()
212opt.mip ="복합체"
213opt.optfile = 1
214opt.solvelink = SolveLink.LoadLibrary
215
216sw = StringIO()
217
218 # 별도의 스레드에서 GamsJob 작업 실행
219opt_thread = 스레드(
220target=job.run_engine,
221args=(engine_configuration,),
222kwargs=
223 "출력": 남,
224 "extra_model_files": [option_file1_path, option_file2_path,"claddat.gdx"],
225 "gams_options": 선택,
226},
227 )
228opt_thread.start()
229
230 그동안 사실입니다:
231 ifsw.tell() == 0:
232time.sleep(0.5)
233 계속
234job.interrupt()
235인쇄("새 옵션을 계속하기 위해 Cplex가 중단되었습니다.")
236 휴식
237
238 # 작업이 아직 실행 중이면 완료될 때까지 기다리세요
239 ifopt_thread.is_alive():
240opt_thread.join()
241 # 모든 것이 예상대로 작동했는지 확인
242로그 = sw.getvalue()
243 if 아님 "중단되었습니다..." in로그:
244 올림예외("솔버가 적어도 한 번은 중단될 것으로 예상됩니다.")