48파일 WorkingDirectory =
신규파일(System.getProperty(
"user.dir"),
"Benders2StageMT");
49workingDirectory.mkdir();
56GAMSOptions optData = ws.
추가옵션();
57optData.
정의(
"useBig",
"1");
58optData.defines(
"nrScen",
"100");
66GAMSOptions opt = ws.
추가옵션();
69opt.defines(
"맥시터", Integer.toString(maxiter));
70opt.setAllModelTypes(
"복합체");
80 GAMS변수세타 = 마스터리.
SyncDB().
추가변수(
"세타", 0, GAMSGlobals.VarType.FREE,
"미래 이익 함수 변수");
82masteri.
인스턴스화(
"lp를 사용하는 masterproblem max zmaster", 선택,
91LinkedList<Tuple> demQueue =
신규LinkedList<튜플>();
98 for (
inti = 1; i < 스레드 수; 나++)
105 더블하한 = Double.NEGATIVE_INFINITY, 상한 = Double.POSITIVE_INFINITY, objmaster = Double.POSITIVE_INFINITY;
108System.out.println(
"반복: "+ iter);
111thetaFix.addRecord().setValue( 0.0 );
119상한 = 마스터리.
SyncDB().
get변수(
"zmaster").getFirstRecord().getLevel();
121objmaster = 마스터.
SyncDB().
get변수(
"z마스터").getFirstRecord().getLevel() - theta.getFirstRecord().getLevel();
125Map<String,Double> demDict =
신규HashMap<String, Double>();
127문자열[] 키 =
신규문자열[] s.getKey(0), j.getKey(0) ;
128demDict.put( j.getKey(0), Double.valueOf( 시나리오Data.findRecord( 키 ).getValue()) );
130문자열 item1 = s.getKey(0);
131Double item2 = Double.valueOf( 시나리오Data.findRecord(
신규문자열[] s.getKey(0),
"문제").getValue() );
132튜플 항목 =
신규튜플( item1, item2, demDict );
136 for (
inti = 0; i < 스레드 수; 나++)
137subi[i].SyncDB().getParameter(
"수신됨").clear();
141cutcoeff.addRecord(
신규문자열[] Integer.toString(iter), r.getKey(0));
142 for (
inti = 0; i < 스레드 수; 나++)
148cutconst.addRecord(Integer.toString(iter));
152객체 queueMutex =
신규객체();
154래퍼<더블>[] objsub =
신규래퍼[numThreads];
155객체[] coef =
신규개체[numThreads];
156래퍼<더블>[] 단점 =
신규래퍼[numThreads] ;
158 for (
inti = 0; i < 스레드 수; 나++)
160objsub[i] =
신규래퍼<Double>(Double.valueOf(0.0));
161단점[i] =
신규래퍼<Double>(Double.valueOf(0.0));
162coef[i] =
신규HashMap<String, Double>();
164Map<String, Double> cmap = (Map<String, Double>) coef[i];
165cmap.put( j.getKey(0), Double.valueOf(0.0) );
170시나리오[] sc =
신규시나리오[numThreads];
171 for (
inti = 0; i < 스레드 수; 나++)
173sc[i] =
신규시나리오( i, subi[i], cons[i], (Map<String, Double>) coef[i], demQueue, objsub[i], queueMutex, ioMutex );
179 for (
inti = 0; i < 스레드 수; 나++)
183}
잡기(InterruptedException e)
188 for (
inti = 0; i < 스레드 수; 나++)
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 );
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( 새 값 );
203하한 = Math.max(하한, objmaster + objsubsum);
207 던지기 신규 GAMS예외(
"반복이 종료되었습니다");
209System.out.println(
" 하한값: "+ 하한 +
" 상한: "+ 상한 +
" objmaster: "+ objmaster);
211}
그동안((상한 - 하한) >= 0.001 * (1 + Math.abs(상한)));
227Map<String, Double> _cutcoeff;
242 공개시나리오(
int나는 ,
GAMSModelInstancesubmi, Wrapper<Double> cutconst, Map<String, Double> cutcoeff, LinkedList<Tuple> demQueue,
243Wrapper<Double> objsub, 객체 queueMutex, 객체 ioMutex)
250_queueMutex = queueMutex;
262 if(_demQueue.size() == 0)
265demDict = _demQueue.remove(0);
269 for(Entry<String, Double> kv : demDict.getItem3().entrySet())
277System.out.println(
"스레드"+_i+
" : 하위 "+ _submi.
getModelStatus().toString() +
" : obj="+ _submi.
SyncDB().
get변수(
"zsub").getFirstRecord().getLevel());
280 더블확률 = demDict.getItem2().doubleValue();
281 더블new_objsubValue = _objsub.get().doubleValue() + 확률 * _submi.
SyncDB().
get변수(
"zsub").getFirstRecord().getLevel();
282_objsub.set( Double.valueOf( new_objsubValue ) );
284 for(Entry<String, Double> kv : demDict.getItem3().entrySet())
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 );
295 정적문자열 데이터 =
"슬롯 커뮤니티 세트"+
296 "나는 공장 /f1*f3/ 슬롯 커뮤니티"+
297 "j 유통 센터 /d1*d5/ 슬롯 커뮤니티"+
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/ 슬롯 커뮤니티"+
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; 슬롯 커뮤니티"+
314 "$ifthen useBig를 설정하지 않았습니다 슬롯 커뮤니티"+
316 " 시나리오 /lo,mid,hi/ 슬롯 커뮤니티"+
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; 슬롯 커뮤니티"+
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); 슬롯 커뮤니티"+
333 정적문자열 masterModel =
"슬롯 커뮤니티 세트"+
338 "capacity(i) 공장의 단위 용량 슬롯 커뮤니티"+
339 "생산 비용 단위 생산 비용 슬롯 커뮤니티"+
340 "transcost(i,j) 단위 운송 비용 슬롯 커뮤니티"+
342 "$$abort에 데이터가 설정되지 않은 경우 '데이터가 설정되지 않음' 슬롯 커뮤니티"+
343 "$gdxin %datain% 슬롯 커뮤니티"+
344 "$load i j 용량 생산 비용 거래 비용 슬롯 커뮤니티"+
346 "* 벤더 마스터 문제 슬롯 커뮤니티"+
347 "$if maxiter $set maxiter 25를 설정하지 않음 슬롯 커뮤니티"+
349 " iter max 벤더 반복 /1*%maxiter%/ 슬롯 커뮤니티"+
352 " 최적 컷의 cutconst(iter) 상수 슬롯 커뮤니티"+
353 " 최적 컷의 cutcoeff(iter,j) 계수 슬롯 커뮤니티"+
356 " 배송(i,j) 배송 슬롯 커뮤니티"+
358 " 시장으로 전송된 수신(j) 수량 슬롯 커뮤니티"+
359 " 마스터 문제의 zmaster 목적 변수 슬롯 커뮤니티"+
364 " masterobj 마스터 목적 함수 슬롯 커뮤니티"+
365 " 생산량(i) 각 공장의 생산량을 계산합니다 슬롯 커뮤니티"+
366 " receive(j) 시장에 보낼 수량 계산 슬롯 커뮤니티"+
367 " optcut(iter) 벤더 최적성 감소; 슬롯 커뮤니티"+
369 "masterobj..슬롯 커뮤니티"+
370 " zmaster =e= theta -sum((i,j), transcost(i,j)*ship(i,j)) 슬롯 커뮤니티"+
371 " - 합계(i,prodcost*제품(i)); 슬롯 커뮤니티"+
373 "수신(j).. 수신(j) =e= 합계(i, 선박(i,j)); 슬롯 커뮤니티"+
375 "생산(i).. 제품(i) =e= 합계(j, 선박(i,j)); 슬롯 커뮤니티"+
376 "product.up(i) = 용량(i); 슬롯 커뮤니티"+
378 "optcut(iter).. theta =l= cutconst(iter) + 슬롯 커뮤니티"+
379 " sum(j, cutcoeff(iter,j)*received(j)); 슬롯 커뮤니티"+
381 "모델 마스터문제 /all/; 슬롯 커뮤니티"+
383 "* 비구속적 컷으로 초기화 슬롯 커뮤니티"+
384 "cutconst(iter) = 1e15; 슬롯 커뮤니티"+
385 "cutcoeff(iter,j) = eps; 슬롯 커뮤니티"+
388 정적문자열 하위 모델 =
"세트 슬롯 커뮤니티"+
393 " 수요(j) 유통 센터의 단위 수요 슬롯 커뮤니티"+
395 " 과잉 재고 제품 제거에 따른 낭비 비용 슬롯 커뮤니티"+
396 " 수신됨(j) 1단계 결정 단위 수신됨 슬롯 커뮤니티"+
398 "$$abort에 데이터가 설정되지 않은 경우 '데이터가 설정되지 않음' 슬롯 커뮤니티"+
399 "$gdxin %datain% 슬롯 커뮤니티"+
400 "$load i j 수요 가격 낭비 비용 슬롯 커뮤니티"+
402 "* 벤더스의 하위 문제 슬롯 커뮤니티"+
405 " 판매(j) 판매(실제 판매) 슬롯 커뮤니티"+
406 " 폐기물(j) 재고가 과잉된 제품 슬롯 커뮤니티"+
407 " 하위 문제의 zsub 목적 변수 슬롯 커뮤니티"+
408 "긍정변수 매출, 낭비 슬롯 커뮤니티"+
411 " subobj 하위 문제 목적 함수 슬롯 커뮤니티"+
412 " 판매(j) 받은 부분이 판매되었습니다 슬롯 커뮤니티"+
413 " 시장(j) 매출 상한선 슬롯 커뮤니티"+
417 " zsub =e= sum(j, 가격*판매(j)) - sum(j, wastecost*waste(j)); 슬롯 커뮤니티"+
419 "판매(j).. 판매(j) + 폐기물(j) =e= 수령(j); 슬롯 커뮤니티"+
421 "시장(j).. 판매(j) =l= 수요(j); 슬롯 커뮤니티"+
423 "모델 하위 문제 /subobj,판매,시장/; 슬롯 커뮤니티"+
426 "수신(j) = 수요(j); 슬롯 커뮤니티"+