18from감스
가져오기GamsWorkspace, GamsEngineConfiguration, SolveLink
23i '통조림 공장' / 시애틀, 샌디에고 /
24j 'markets' / 뉴욕, 시카고, 토피카 /;
42f '1,000마일당 케이스당 운임(달러)' / 90 /
57f '1,000마일당 케이스당 달러 단위의 화물'
60$if 설정되지 않음 gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름 없음'
62$load i j a b d f bmult
67매개변수 c(i,j) '케이스당 수천 달러의 운송 비용';
68c(i,j) = f*d(i,j)/1000;
78supply(i) '공장 i의 공급 제한을 준수하세요'
79demand(j) '시장 j의 수요를 충족';
81비용.. z =e= 합계((i,j), c(i,j)*x(i,j));
83공급(i).. 합계(j, x(i,j)) =l= a(i);
85수요(j).. sum(i, x(i,j)) =g= bmult*b(j);
89z를 최소화하는 lp를 사용하여 전송을 해결합니다.
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)
105engine_configuration = GamsEngineConfiguration(
106호스트=os.environ[
"엔진_URL"],
107사용자 이름=os.environ[
"엔진_사용자"],
108password=os.environ[
"엔진_비밀번호"],
109네임스페이스=os.environ[
"ENGINE_NAMESPACE"],
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)
118opt = ws.add_options()
119opt.defines[
"gdxincname"] =
"tdata"
120opt.all_model_types =
"익스프레스"
123extra_model_files=gdx_file_path,
125 "inex_string": json.dumps(
"유형":
"포함",
"파일": [
"*.gdx"]})
131 (
"시애틀",
"시카고"): 300.0,
133 (
"샌디에고",
"뉴욕"): 325.0,
134 (
"샌디에고",
"시카고"): 0.0,
135 (
"샌디에고",
"토페카"): 275.0,
138 forrec
injob.out_db[
"x"]:
140f
"x(rec.key(0),rec.key(1)): 레벨=rec.level 한계=rec.marginal"
142 ifexpected_levels[tuple(rec.keys)] != Rec.level:
143 올림예외(
"예기치 못한 결과입니다.")
145 ifos.path.exists(os.path.join(ws.working_directory,
"test.txt")):
147 "원격으로 실행되는 슬롯 사이트 모델로 작성된 'test.txt'를 찾을 것으로 예상하지 못했습니다."
150cp = ws.add_checkpoint()
152job_a = ws.add_job_from_string(GAMS_DATA)
153job_a.run_engine(engine_configuration)
154opt.defines[
"gdxincname"] = job_a.out_db.name
156job_b = ws.add_job_from_string(GAMS_MODEL)
158엔진_구성, gams_options=opt, 데이터베이스=job_a.out_db, 체크포인트=cp
161 forrec
injob.out_db[
"x"]:
162 ifexpected_levels[tuple(rec.keys)] != Rec.level:
163 올림예외(
"예기치 못한 결과입니다.")
166{
"bmult": 0.9,
"ms": 1,
"ss": 1,
"obj": 138.31},
167{
"bmult": 1.2,
"ms": 4,
"ss": 1,
"obj": 184.41},
171 for장면
에expected_bmult:
172작업 = ws.add_job_from_string(
173f
"bmult=scen['bmult']; lp를 사용하여 전송 최소 z 해결; ms=transport.modelstat; ss=transport.solvestat;",
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")
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"]:
194작업 = ws.add_job_from_file(
"입은")
197option_file1_path = os.path.join(ws.working_directory,
"cplex.opt")
198 와열기(option_file1_path,
"w")
asf:
204f.write(
"iafile cplex.op2\n")
207option_file2_path = os.path.join(ws.working_directory,
"cplex.op2")
208 와열기(option_file2_path,
"w")
asf:
211opt = ws.add_options()
214opt.solvelink = SolveLink.LoadLibrary
220target=job.run_engine,
221args=(engine_configuration,),
224 "extra_model_files": [option_file1_path, option_file2_path,
"claddat.gdx"],
235인쇄(
"새 옵션을 계속하기 위해 Cplex가 중단되었습니다.")
239 ifopt_thread.is_alive():
243 if 아님 "중단되었습니다..." in로그:
244 올림예외(
"솔버가 적어도 한 번은 중단될 것으로 예상됩니다.")