로드 중...
검색 중...
일치하는 항목 없음
Benders2StageMT.java
1패키지com.gams.examples.benders;
2
3가져오기java.io.파일;
4가져오기java.util.HashMap;
5가져오기java.util.LinkedList;
6가져오기java.util.List;
7가져오기java.util.Map;
8가져오기java.util.Map.Entry;
9
11가져오기 com.감스.API.GAMS예외;
12가져오기 com.게임.API.GAMS글로벌;
13가져오기 com.게임.API.GAMSJob;
14가져오기 com.감스.API.GAMSModelInstance;
15가져오기 com.게임.API.GAMSModifier;
16가져오기 com.게임.API.GAMS옵션;
17가져오기 com.게임.API.GAMS매개변수;
18가져오기 com.게임.API.GAMSSetRecord;
19가져오기 com.게임.API.GAMS변수;
20가져오기 com.게임.API.GAMSVariableRecord;
21가져오기 com.게임.API.GAMS작업공간;
22가져오기 com.게임.API.GAMSWorkspaceInfo;
23
40@SuppressWarnings("선택 해제됨")
41공개 수업Benders2StageMT{
42
43 공개 정적 무효메인(문자열[] 인수)
45 if(args.length > 0)
46wsInfo.setSystemDirectory( 인수[0] );
47
48파일 WorkingDirectory =신규파일(System.getProperty("user.dir"), "Benders2StageMT");
49workingDirectory.mkdir();
50wsInfo.setWorkingDirectory(workingDirectory.getAbsolutePath());
51
52 GAMS작업공간ws =신규 GAMS작업공간( wsInfo );
53
54 GAMSJobdataJob = ws.addJobFromString(데이터);
55
56GAMSOptions optData = ws.추가옵션();
57optData.정의("useBig", "1");
58optData.defines("nrScen", "100");
59
60dataJob.실행(optData);
61
62optData.dispose();
63
64 GAMS매개변수scenarioData = dataJob.아웃DB().getParameter("시나리오데이터");
65
66GAMSOptions opt = ws.추가옵션();
67선택.정의("데이터인", dataJob.아웃DB().getName());
68 int맥시터 = 40;
69opt.defines("맥시터", Integer.toString(maxiter));
70opt.setAllModelTypes("복합체");
71
74
75ws.addJobFromString(마스터모델).실행(선택, cpMaster, dataJob.아웃DB());
76
77 GAMSModelInstancemasteri = cpMaster.addModelInstance();
78 GAMS매개변수cutconst = masteri.SyncDB().addParameter("cutconst", 1,"벤더 최적성 컷 상수");
79 GAMS매개변수cutcoeff = 마스터리.SyncDB().addParameter("cutcoeff", 2,"벤더 최적 계수");
80 GAMS변수세타 = 마스터리.SyncDB().추가변수("세타", 0, GAMSGlobals.VarType.FREE,"미래 이익 함수 변수");
81 GAMS매개변수thetaFix = 마스터리.SyncDB().addParameter("thetaFix", 0,"");
82masteri.인스턴스화("lp를 사용하는 masterproblem max zmaster", 선택,
83 신규 GAMSModifier[] {신규 GAMSModifier(cutconst),신규 GAMSModifier(cutcoeff),신규 GAMSModifier(theta,GAMSGlobals.UpdateAction.FIXED,thetaFix)
84);
85
86ws.addJobFromString(하위 모델).실행(opt, cpSub, dataJob.아웃DB());
87
88
89 intnumThreads = 4;
90 GAMSModelInstance[] 수비 =신규 GAMSModelInstance[numThreads];
91LinkedList<Tuple> demQueue =신규LinkedList<튜플>();
92
93subi[0] = cpSub.addModelInstance();
94 GAMS매개변수수신 = subi[0].SyncDB().addParameter("접수됨", 1,"1단계 솔루션에서 받은 단위");
95 GAMS매개변수수요 = subi[0].SyncDB().addParameter("수요", 1,"확률적 수요");
96수비[0].인스턴스화("LP를 사용하는 하위 문제 최대 zsub", 선택,신규 GAMSModifier[] {신규 GAMSModifier(수신),신규 GAMSModifier(요구) );
97
98 for (inti = 1; i < 스레드 수; 나++)
99{
100수비[i] = 수비[0].copyModelInstance();
101}
102
103opt.dispose();
104
105 더블하한 = Double.NEGATIVE_INFINITY, 상한 = Double.POSITIVE_INFINITY, objmaster = Double.POSITIVE_INFINITY;
106 intiter = 1;
107 할 것{
108System.out.println("반복: "+ iter);
109 // 해결 마스터
110 if(iter == 1)// 첫 번째 반복의 세타 수정
111thetaFix.addRecord().setValue( 0.0 );
112 그밖에
113thetaFix.clear();
114
116System.out.println(" 스승님 "+ 마스터리.getModelStatus() +" : obj="+ 마스터리.SyncDB().get변수("z마스터").getFirstRecord().getLevel());
117
118 if(iter > 1)
119상한 = 마스터리.SyncDB().get변수("zmaster").getFirstRecord().getLevel();
120
121objmaster = 마스터.SyncDB().get변수("z마스터").getFirstRecord().getLevel() - theta.getFirstRecord().getLevel();
122
123 for (GAMSSetRecords : dataJob.아웃DB().getSet("들"))
124{
125Map<String,Double> demDict =신규HashMap<String, Double>();
126 for (GAMSSetRecordj : dataJob.아웃DB().getSet("j")) {
127문자열[] 키 =신규문자열[] s.getKey(0), j.getKey(0) ;
128demDict.put( j.getKey(0), Double.valueOf( 시나리오Data.findRecord( 키 ).getValue()) );
129}
130문자열 item1 = s.getKey(0);
131Double item2 = Double.valueOf( 시나리오Data.findRecord(신규문자열[] s.getKey(0),"문제").getValue() );
132튜플 항목 =신규튜플( item1, item2, demDict );
133demQueue.add(항목);
134}
135
136 for (inti = 0; i < 스레드 수; 나++)
137subi[i].SyncDB().getParameter("수신됨").clear();
138
139 for (GAMSVariableRecordr : 마스터리.SyncDB().get변수("수신됨"))
140{
141cutcoeff.addRecord(신규문자열[] Integer.toString(iter), r.getKey(0));
142 for (inti = 0; i < 스레드 수; 나++)
143{
144수비[i].SyncDB().getParameter("수신됨").addRecord(r.getKeys()).setValue( r.getLevel() );
145}
146}
147
148cutconst.addRecord(Integer.toString(iter));
149 더블objsubsum = 0.0;
150
151 // 여러 모델 인스턴스를 병렬로 해결
152객체 queueMutex =신규객체();
153객체 ioMutex =신규객체();
154래퍼<더블>[] objsub =신규래퍼[numThreads];
155객체[] coef =신규개체[numThreads];
156래퍼<더블>[] 단점 =신규래퍼[numThreads] ;
157
158 for (inti = 0; i < 스레드 수; 나++)
159{
160objsub[i] =신규래퍼<Double>(Double.valueOf(0.0));
161단점[i] =신규래퍼<Double>(Double.valueOf(0.0));
162coef[i] =신규HashMap<String, Double>();
163 for (GAMSSetRecordj : dataJob.아웃DB().getSet("j")) {
164Map<String, Double> cmap = (Map<String, Double>) coef[i];
165cmap.put( j.getKey(0), Double.valueOf(0.0) );
166}
167}
168
169 // 하위 문제를 동시에 해결
170시나리오[] sc =신규시나리오[numThreads];
171 for (inti = 0; i < 스레드 수; 나++)
172{
173sc[i] =신규시나리오( i, subi[i], cons[i], (Map<String, Double>) coef[i], demQueue, objsub[i], queueMutex, ioMutex );
174sc[i].start();
175}
176
177
178 // 모든 하위 문제 동기화
179 for (inti = 0; i < 스레드 수; 나++)
180{
181 시도해 보세요{
182sc[i].join();
183}잡기(InterruptedException e)
184e.printStackTrace();
185}
186}
187
188 for (inti = 0; i < 스레드 수; 나++)
189{
190objsubsum += objsub[i].get().doubleValue();
191 더블new_consValue = cutconst.findRecord( Integer.toString(iter) ).getValue() + cons[i].get().doubleValue();
192cutconst.findRecord( Integer.toString(iter) ).setValue( new_consValue );
193
194 for (GAMSSetRecordj : dataJob.아웃DB().getSet("j"))
195{
196Map<String, Double> map = (Map<String, Double>) coef[i];
197문자열[] 키 =신규String[] Integer.toString(iter), j.getKey(0) ;
198 더블newvalue = cutcoeff.findRecord( 키 ).getValue( ) + map.get( j.getKey(0) ).doubleValue();
199cutcoeff.findRecord( 키 ).setValue( 새 값 );
200}
201}
202
203하한 = Math.max(하한, objmaster + objsubsum);
204
205iter++;
206 if(iter == 맥시터 + 1)
207 던지기 신규 GAMS예외("반복이 종료되었습니다");
208
209System.out.println(" 하한값: "+ 하한 +" 상한: "+ 상한 +" objmaster: "+ objmaster);
210
211}그동안((상한 - 하한) >= 0.001 * (1 + Math.abs(상한)));
212
213masteri.처분();
214
215 for(GAMSModelInstanceinst : subi)
216{
217inst.dispose();
218}
219}
220
222 정적 클래스시나리오확장스레드
223 int_i;
224 GAMSModelInstance_submi;
225래퍼<더블> _cutconst;
226목록<Tuple> _demQueue;
227Map<String, Double> _cutcoeff;
228래퍼<더블> _objsub;
229개체 _queueMutex;
230객체 _ioMutex;
231
242 공개시나리오(int나는 ,GAMSModelInstancesubmi, Wrapper<Double> cutconst, Map<String, Double> cutcoeff, LinkedList<Tuple> demQueue,
243Wrapper<Double> objsub, 객체 queueMutex, 객체 ioMutex)
244_i = 나;
245_submi = 제출;
246_cutconst = cutconst;
247_cutcoeff = 컷coeff;
248_demQueue = demQueue;
249_objsub = objsub;
250_queueMutex = queueMutex;
251_ioMutex = ioMutex;
252}
253
255 공개 공허실행()
256 그동안 ()
257{
258튜플 demDict;
259
260 동기화됨(_queueMutex)
261{
262 if(_demQueue.size() == 0)
263 휴식;
264 그밖에
265demDict = _demQueue.remove(0);// 대기열에서 제거
266}
267
268_submi.SyncDB().getParameter("수요").clear();
269 for(Entry<String, Double> kv : demDict.getItem3().entrySet())
270_submi.SyncDB().getParameter("수요").addRecord(kv.getKey()).setValue( kv.getValue() );
271
273
274
275 동기화됨(_ioMutex)
276{
277System.out.println("스레드"+_i+" : 하위 "+ _submi.getModelStatus().toString() +" : obj="+ _submi.SyncDB().get변수("zsub").getFirstRecord().getLevel());
278}
279
280 더블확률 = demDict.getItem2().doubleValue();
281 더블new_objsubValue = _objsub.get().doubleValue() + 확률 * _submi.SyncDB().get변수("zsub").getFirstRecord().getLevel();
282_objsub.set( Double.valueOf( new_objsubValue ) );
283
284 for(Entry<String, Double> kv : demDict.getItem3().entrySet())
285{
286 더블new_custconstValue = _cutconst.get().doubleValue() + 확률 * _submi.SyncDB().getEquation("시장").findRecord( kv.getKey() ).getMarginal() * kv.getValue().doubleValue();
287_cutconst.set( Double.valueOf( new_custconstValue ) );
288 더블new_cutcoeffValue = _cutcoeff.get( kv.getKey() ).doubleValue() + 확률 * _submi.SyncDB().getEquation("판매 중").findRecord(kv.getKey()).getMarginal();
289_cutcoeff.put( kv.getKey(), new_cutcoeffValue );
290}
291}
292}
293}
294
295 정적문자열 데이터 ="슬롯 커뮤니티 세트"+
296 "나는 공장 /f1*f3/ 슬롯 커뮤니티"+
297 "j 유통 센터 /d1*d5/ 슬롯 커뮤니티"+
298 " 슬롯 커뮤니티"+
299 "매개변수 슬롯 커뮤니티"+
300 "capacity(i) 공장의 단위 용량 슬롯 커뮤니티"+
301 " /f1 500, f2 450, f3 650/ 슬롯 커뮤니티"+
302 "demand(j) 유통 센터의 단위 수요 슬롯 커뮤니티"+
303 " /d1 160, d2 120, d3 270, d4 325, d5 700 / 슬롯 커뮤니티"+
304 "생산 비용 단위 생산 비용 /14/ 슬롯 커뮤니티"+
305 "가격 판매 가격 /24/ 슬롯 커뮤니티"+
306 "과잉 재고 제품 제거에 따른 낭비 비용 /4/ 슬롯 커뮤니티"+
307 " 슬롯 커뮤니티"+
308 "테이블 운송 비용(i,j) 단위 운송 비용 슬롯 커뮤니티"+
309 " d1 d2 d3 d4 d5 슬롯 커뮤니티"+
310 " f1 2.49 5.21 3.76 4.85 2.07 슬롯 커뮤니티"+
311 " f2 1.46 2.54 1.83 1.86 4.76 슬롯 커뮤니티"+
312 " f3 3.26 3.08 2.60 3.76 4.45; 슬롯 커뮤니티"+
313 " 슬롯 커뮤니티"+
314 "$ifthen useBig를 설정하지 않았습니다 슬롯 커뮤니티"+
315 "슬롯 커뮤니티 설정"+
316 " 시나리오 /lo,mid,hi/ 슬롯 커뮤니티"+
317 " 슬롯 커뮤니티"+
318 "수요와 확률에 대한 테이블 시나리오 데이터(들,*) 가능한 결과 슬롯 커뮤니티"+
319 " d1 d2 d3 d4 d5 문제 슬롯 커뮤니티"+
320 " lo 150 100 250 300 600 0.25 슬롯 커뮤니티"+
321 " 중간 160 120 270 325 700 0.50 슬롯 커뮤니티"+
322 " 안녕 170 135 300 350 800 0.25; 슬롯 커뮤니티"+
323 "$else 슬롯 커뮤니티"+
324 "$nrScen을 설정하지 않은 경우 $set nrScen 10 슬롯 커뮤니티"+
325 "s 시나리오 설정 /s1*s%nrScen%/;슬롯 커뮤니티"+
326 "수요와 확률에 대한 매개변수 ScenarioData(s,*) 가능한 결과;슬롯 커뮤니티"+
327 "옵션 시드=1234; 슬롯 커뮤니티"+
328 "ScenarioData(s,'prob') = 1/카드; 슬롯 커뮤니티"+
329 "시나리오데이터(s,j) = 수요(j)*균일(0.6,1.4); 슬롯 커뮤니티"+
330 "$endif 슬롯 커뮤니티"+
331 " 슬롯 커뮤니티";
332
333 정적문자열 masterModel ="슬롯 커뮤니티 세트"+
334 "나는 공장 슬롯 커뮤니티"+
335 "j 유통 센터 슬롯 커뮤니티"+
336 " 슬롯 커뮤니티"+
337 "매개변수 슬롯 커뮤니티"+
338 "capacity(i) 공장의 단위 용량 슬롯 커뮤니티"+
339 "생산 비용 단위 생산 비용 슬롯 커뮤니티"+
340 "transcost(i,j) 단위 운송 비용 슬롯 커뮤니티"+
341 " 슬롯 커뮤니티"+
342 "$$abort에 데이터가 설정되지 않은 경우 '데이터가 설정되지 않음' 슬롯 커뮤니티"+
343 "$gdxin %datain% 슬롯 커뮤니티"+
344 "$load i j 용량 생산 비용 거래 비용 슬롯 커뮤니티"+
345 " 슬롯 커뮤니티"+
346 "* 벤더 마스터 문제 슬롯 커뮤니티"+
347 "$if maxiter $set maxiter 25를 설정하지 않음 슬롯 커뮤니티"+
348 "슬롯 커뮤니티 설정"+
349 " iter max 벤더 반복 /1*%maxiter%/ 슬롯 커뮤니티"+
350 " 슬롯 커뮤니티"+
351 "매개변수 슬롯 커뮤니티"+
352 " 최적 컷의 cutconst(iter) 상수 슬롯 커뮤니티"+
353 " 최적 컷의 cutcoeff(iter,j) 계수 슬롯 커뮤니티"+
354 " 슬롯 커뮤니티"+
355 "변수 슬롯 커뮤니티"+
356 " 배송(i,j) 배송 슬롯 커뮤니티"+
357 " 제품(i) 생산 슬롯 커뮤니티"+
358 " 시장으로 전송된 수신(j) 수량 슬롯 커뮤니티"+
359 " 마스터 문제의 zmaster 목적 변수 슬롯 커뮤니티"+
360 " 세타 미래 이익 슬롯 커뮤니티"+
361 "양수 변수 제공; 슬롯 커뮤니티"+
362 " 슬롯 커뮤니티"+
363 "방정식 슬롯 커뮤니티"+
364 " masterobj 마스터 목적 함수 슬롯 커뮤니티"+
365 " 생산량(i) 각 공장의 생산량을 계산합니다 슬롯 커뮤니티"+
366 " receive(j) 시장에 보낼 수량 계산 슬롯 커뮤니티"+
367 " optcut(iter) 벤더 최적성 감소; 슬롯 커뮤니티"+
368 " 슬롯 커뮤니티"+
369 "masterobj..슬롯 커뮤니티"+
370 " zmaster =e= theta -sum((i,j), transcost(i,j)*ship(i,j)) 슬롯 커뮤니티"+
371 " - 합계(i,prodcost*제품(i)); 슬롯 커뮤니티"+
372 " 슬롯 커뮤니티"+
373 "수신(j).. 수신(j) =e= 합계(i, 선박(i,j)); 슬롯 커뮤니티"+
374 " 슬롯 커뮤니티"+
375 "생산(i).. 제품(i) =e= 합계(j, 선박(i,j)); 슬롯 커뮤니티"+
376 "product.up(i) = 용량(i); 슬롯 커뮤니티"+
377 " 슬롯 커뮤니티"+
378 "optcut(iter).. theta =l= cutconst(iter) + 슬롯 커뮤니티"+
379 " sum(j, cutcoeff(iter,j)*received(j)); 슬롯 커뮤니티"+
380 " 슬롯 커뮤니티"+
381 "모델 마스터문제 /all/; 슬롯 커뮤니티"+
382 " 슬롯 커뮤니티"+
383 "* 비구속적 컷으로 초기화 슬롯 커뮤니티"+
384 "cutconst(iter) = 1e15; 슬롯 커뮤니티"+
385 "cutcoeff(iter,j) = eps; 슬롯 커뮤니티"+
386 " 슬롯 커뮤니티";
387
388 정적문자열 하위 모델 ="세트 슬롯 커뮤니티"+
389 "나는 공장 슬롯 커뮤니티"+
390 " j 유통 센터 슬롯 커뮤니티"+
391 " 슬롯 커뮤니티"+
392 "매개변수 슬롯 커뮤니티"+
393 " 수요(j) 유통 센터의 단위 수요 슬롯 커뮤니티"+
394 " 가격 판매 가격 슬롯 커뮤니티"+
395 " 과잉 재고 제품 제거에 따른 낭비 비용 슬롯 커뮤니티"+
396 " 수신됨(j) 1단계 결정 단위 수신됨 슬롯 커뮤니티"+
397 " 슬롯 커뮤니티"+
398 "$$abort에 데이터가 설정되지 않은 경우 '데이터가 설정되지 않음' 슬롯 커뮤니티"+
399 "$gdxin %datain% 슬롯 커뮤니티"+
400 "$load i j 수요 가격 낭비 비용 슬롯 커뮤니티"+
401 " 슬롯 커뮤니티"+
402 "* 벤더스의 하위 문제 슬롯 커뮤니티"+
403 " 슬롯 커뮤니티"+
404 "변수 슬롯 커뮤니티"+
405 " 판매(j) 판매(실제 판매) 슬롯 커뮤니티"+
406 " 폐기물(j) 재고가 과잉된 제품 슬롯 커뮤니티"+
407 " 하위 문제의 zsub 목적 변수 슬롯 커뮤니티"+
408 "긍정변수 매출, 낭비 슬롯 커뮤니티"+
409 " 슬롯 커뮤니티"+
410 "방정식 슬롯 커뮤니티"+
411 " subobj 하위 문제 목적 함수 슬롯 커뮤니티"+
412 " 판매(j) 받은 부분이 판매되었습니다 슬롯 커뮤니티"+
413 " 시장(j) 매출 상한선 슬롯 커뮤니티"+
414 "; 슬롯 커뮤니티"+
415 " 슬롯 커뮤니티"+
416 "하위 개체.. 슬롯 커뮤니티"+
417 " zsub =e= sum(j, 가격*판매(j)) - sum(j, wastecost*waste(j)); 슬롯 커뮤니티"+
418 " 슬롯 커뮤니티"+
419 "판매(j).. 판매(j) + 폐기물(j) =e= 수령(j); 슬롯 커뮤니티"+
420 " 슬롯 커뮤니티"+
421 "시장(j).. 판매(j) =l= 수요(j); 슬롯 커뮤니티"+
422 " 슬롯 커뮤니티"+
423 "모델 하위 문제 /subobj,판매,시장/; 슬롯 커뮤니티"+
424 " 슬롯 커뮤니티"+
425 "* 초기화 수신됨 슬롯 커뮤니티"+
426 "수신(j) = 수요(j); 슬롯 커뮤니티"+
427 " 슬롯 커뮤니티";
428}
429
431클래스래퍼<T>
432T _값;
433 공개래퍼(T 값) _value = 값;
434 공개T얻기() {반환_값;
435 공개 무효 설정(T anotherValue) _value = anotherValue;
436}
437
441클래스튜플
442문자열 _item1;
443더블 _item2;
444Map<String, Double> _item3;
445 공개Tuple(문자열 항목1, 이중 항목2, 맵<문자열, 이중> 항목3)
446_item1 = item1;
447_item2 = item2;
448_item3 = item3;
449}
450 공개문자열 getItem1()반환_item1;
451 공개이중 getItem2()반환_item2;
452 공개Map<String, Double> getItem3()반환_item3;
453}
GAMSModelInstance addModelInstance()
GAMSVariable addVariable(문자열 식별자, int 차원, GAMSGlobals.VarType varType)
GAMSParameter getParameter(문자열 식별자)
GAMSEquation getEquation(문자열 식별자)
GAMSParameter addParameter(문자열 식별자, 정수 차원)
GAMSVariable getVariable(문자열 식별자)
GAMSSet getSet(문자열 식별자)
GAMS데이터베이스 OutDB()
GAMS데이터베이스 SyncDB()
GAMSModelInstance copyModelInstance()
GAMSGlobals.ModelStat getModelStatus()
void instantiate(String modelDefinition, GAMSModifier ... modifiers)
void 정의(String defStr, String asStr)
void setSystemDirectory(문자열 디렉토리)
void setWorkingDirectory(문자열 디렉터리)
GAMSJob addJobFromString(문자열 소스)
GAMSCheckpoint addCheckpoint()
이 예는 슬롯 커뮤니티에 대한 간단한 Benders 분해 방법의 병렬 구현을 보여줍니다...