로드 중...
검색 중...
일치하는 항목 없음
피망 슬롯py
이 파일의 문서로 이동하세요.
1
10
11가져오기os
12가져오기sys
13from스레딩가져오기잠금, 스레드
14에서게임가져오기GamsWorkspace, GamsException, GamsExceptionExecution, GamsExitCode
15
16GAMS_MODEL ="""
17$eolcom //
18$SetDDList 창고 저장소 고정 분리 // 허용되는 정의
19$창고를 설정하지 않은 경우 $창고를 설정함 10
20$스토어가 설정되지 않은 경우 $set 스토어 50
21$설정되지 않은 경우 고정됨 $설정됨 고정됨 20
22$if set not set disaggregate $set disaggregate 1 // 더 엄격한 bigM 제약에 대한 표시
23
24$ife %store%<=%피망 슬롯% $abort 매장 수 증가 (>%피망 슬롯)
25
26설정
27res '응답 코드'
28/ 0 보통
291 라이센스 오류
302 해결책 없음
313 기타 오류 /
32ares(res) / 3 /
33창고 / w1*w%창고% /
34저장 / s1*s%store% /;
35
36별칭
37(창고,w)
38(상점,들);
39
40스칼라 고정 '창고 개설 고정 비용' / %fixed% /;
41
42매개변수
43용량(창고)
44공급비용(상점,창고);
45
46$eval storeDIVwarehouse trunc(카드(스토어)/카드(창고))
47
48용량(w) = %storeDIVwarehouse% + mod(ord(w), %storeDIVwarehouse%);
49supplyCost(s,w) = 1 + mod(ord(s) + 10*ord(w), 100);
50
51변수
52열기(창고)
53공급(상점,창고)
54obj;
55
56바이너리 변수 열기, 공급;
57
58수식
59defobj
60하나의 창고
61defopen(w);
62
63defobj.. obj =e= sum(w,fixed*open(w)) + sum((w,s), SupplyCost(s,w)*supply(s,w));
64
65한 창고.. 합계(w, 공급(들,w)) =e= 1;
66
67defopen(w).. sum(s, 공급(s,w)) =l= open(w)*capacity(w);
68
69$ifthen %disaggregate%==1
70방정식 defopen2(s,w);
71defopen2(s,w).. 공급(s,w) =l= 개방(w);
72$endif
73
74모델 분포 / 모두 /;
75mip를 사용하여 distrib min obj를 해결합니다.
76
77$macro setResult(n) 옵션clear=ares; 아레스(n) = 예;
78
79if (distrib.modelstat=%ModelStat.LicensingProblem% 또는
80distrib.solvestat=%Solvestat.LicensingProblems%,
81setResult('1');
82'라이센스 오류' 중단;
83);
84
85if (distrib.solvestat<>%SolveStat.NormalCompletion% 또는
86distrib.modelstat<>%ModelStat.Optimal% 및
87distrib.modelstat<>%ModelStat.IntegerSolution%,
88setResult('2');
89'해결책 없음' 중단;
90);
91
92setResult('0');
93"""
94
95
96defsolve_warehouse(작업 공간, nr_warehouses, 결과, 잠금):
97 글로벌상태
98 글로벌status_string
99 시도해 보세요:
100 # GamsOptions를 인스턴스화하고 일부 스칼라를 정의
101opt = 작업 공간.add_options()
102opt.all_model_types ="복합체"
103opt.defines["창고"] = str(nr_warehouses)
104opt.defines["상점"] ="65"
105opt.defines["고정됨"] ="22"
106opt.defines["분리"] ="0"
107opt.optcr = 0.0# 최적성을 해결
108
109 # 문자열에서 GamsJob을 생성하고 결과 데이터베이스에 결과 쓰기
110작업 = 작업 공간.add_job_from_string(GAMS_MODEL)
111job.run(옵션)
112
113 # 데이터베이스 쓰기 작업을 잠가야 함
114lock.acquire()
115결과["objrep"].add_record(str(nr_warehouses)).value = (
116job.out_db["obj"].first_record().level
117 )
118lock.release()
119 for공급_recjob.out_db["공급"]:
120 ifsupply_rec.level > 0.5:
121lock.acquire()
122결과["공급 지도"].add_record(
123(str(nr_warehouses), 공급_rec.key(0), 공급_rec.key(1))
124 )
125lock.release()
126 제외예외ase:
127lock.acquire()
128 ifisinstance(e, GamsExceptionExecution):
129 # 사용자가 트리거한 중단이 있는지 확인하고 사용자 정의 결과를 찾습니다.
130 ife.rc == GamsExitCode.ExecutionError:
131status_string = (
132job.out_db["res"]
133.find_record(job.out_db["아레스"].first_record().key(0))
134.text
135 )
136상태 = e.rc
137 그밖에:
138인쇄(e)
139상태 = -1ifisinstance(e, GamsException)그밖에 -2
140lock.release()
141
142
143if__name__ =="__main__":
144sys_dir = sys.argv[1]iflen(sys.argv) > 1그밖에 없음
145work_dir = sys.argv[2]iflen(sys.argv) > 2그밖에 없음
146ws = GamsWorkspace(system_directory=sys_dir, Working_directory=work_dir)
147
148 # 결과에 대한 GamsDatabase 생성
149result_db = ws.add_database()
150result_db.add_parameter("objrep", 1,"목표 값")
151result_db.add_set("공급지도", 3,"레벨에 따른 공급 연결")
152
153status_string =""
154상태 = 0
155
156 # 여러 병렬 작업 실행
157잠금 = 잠금()
158스레드 = []
159 foriin범위(10, 22):
160t = 스레드(대상=solve_warehouse, args=(ws, i, result_db, lock))
161t.start()
162threads.append(t)
163 fort스레드:
164t.join()
165 if상태 > 0:
166 올림GamsExceptionExecution(
167f"GamsException이 발생했습니다: 피망 슬롯 실행 중 오류: status status_string",
168상태,
169ws,
170 )
171 엘리프상태 == -1:
172 올림GamsException("GamsException 발생: 피망 슬롯 API 오류", ws)
173 엘리프상태 == -2:
174 올림예외("오류가 발생했습니다")
175
176 # 결과 데이터베이스를 GDX 파일로 내보내기
177result_db.export(os.path.join(os.getcwd(),"result.gdx"))