로드 중...
검색 중...
일치하는 항목 없음
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 = masteri.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변수("z마스터").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 (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래퍼<Double> _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 "$if 데이터가 $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;
444맵<문자열, 더블> _item3;
445 공개Tuple(String item1, Double item2, Map<String, Double> item3)
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 분해 방법의 병렬 구현을 보여줍니다...