설명
이 예는 확률론적 Bender 구현을 보여줍니다.
간단한 운송 예.
이것은 확률론적 벤더 시퀀스의 첫 번째 예입니다.
마스터 문제를 해결하기 위해 다양한 방법을 사용하여 구현
하위 문제.
이 첫 번째 예는 다음을 사용하여 확률론적 벤더 알고리즘을 구현합니다.
무료 슬롯 게임 루프에서 마스터 문제와 하위 문제를 순차적으로 해결합니다.
키워드: 선형 계획법, 확률론적 벤더 알고리즘, 교통
문제
소형 모델 유형 :LP
카테고리 : 무료 슬롯 게임 모델 라이브러리
메인 파일 : spbenders1.gms
$title 확률론적 벤더 - 순차 무료 슬롯 게임 루프(SPBENDERS1,SEQ=418)
$onText
이 예는 확률론적 Bender 구현을 보여줍니다.
간단한 운송 예.
이것은 확률론적 벤더 시퀀스의 첫 번째 예입니다.
마스터 문제를 해결하기 위해 다양한 방법을 사용하여 구현
하위 문제.
이 첫 번째 예는 다음을 사용하여 확률론적 벤더 알고리즘을 구현합니다.
무료 슬롯 게임 루프에서 마스터 문제와 하위 문제를 순차적으로 해결합니다.
키워드: 선형 계획법, 확률론적 벤더 알고리즘, 교통
문제
$offText
세트
나는 '공장' / f1*f3 /
j '물류 센터' / d1*d5 /;
매개변수
생산 능력(i) '공장의 단위 생산 능력'
/ f1 500, f2 450, f3 650 /
수요(j) '유통센터의 단위수요'
/ d1 160, d2 120, d3 270, d4 325, d5 700 /
prodcost '단위 생산 비용' / 14 /
가격 '판매 가격' / 24 /
wastecost '과잉 재고 제품 제거 비용' / 4 /;
테이블 transcost(i,j) '단위 운송 비용'
d1 d2 d3 d4 d5
f1 2.49 5.21 3.76 4.85 2.07
f2 1.46 2.54 1.83 1.86 4.76
f3 3.26 3.08 2.60 3.76 4.45;
$ifThen 설정되지 않음 useBig
'시나리오' 설정 / lo, mid, hi /;
테이블 ScenarioData(s,*) '수요와 확률에 대한 가능한 결과'
d1 d2 d3 d4 d5 문제
로우 150 100 250 300 600 0.25
중반 160 120 270 325 700 0.50
안녕 170 135 300 350 800 0.25;
$else
$ nrScen을 설정하지 않은 경우 $set nrScen 10
s '시나리오' 설정 / s1*s%nrScen% /;
Parameter ScenarioData(s,*) '수요 + 확률에 대한 가능한 결과';
옵션 시드 = 1234;
ScenarioData(s,'prob') = 1/카드;
ScenarioData(s,j) = 수요(j)*uniform(0.6,1.4);
$endIf
* 벤더스 마스터 문제
$maxiter를 설정하지 않은 경우 $set maxiter 25
세트
iter '최대 벤더 반복 횟수' / 1*%maxiter% /
itActive(iter) '활성 벤더 컷';
매개변수
cutconst(iter) '최적 컷의 상수' / #iter 0 /
cutcoeff(iter,j) '최적 컷의 계수' / #iter.#j 0 /;
변수
ship(i,j) '배송'
제품(i) '생산'
received(j) '시장에 보낸 수량'
zmaster '마스터 문제의 목적 변수'
세타 '미래 이익';
포지티브 가변 선박;
방정식
masterobj '마스터 목적 함수'
Production(i) '각 공장의 생산량을 계산합니다.'
receive(j) '시장에 보낼 수량을 계산합니다'
optcut(iter) '벤더 최적성 감소';
마스터로브..
zmaster =e= 세타 - 합계((i,j), 거래 비용(i,j)*배송(i,j))
- sum(i, prodcost*product(i));
receive(j).. received(j) =e= sum(i, ship(i,j));
생산(i).. 제품(i) =e= sum(j, ship(i,j));
optcut(itActive)..
theta =l= cutconst(itActive) + sum(j, cutcoeff(itActive,j)*received(j));
product.up(i) = 용량(i);
모델 마스터문제 / 모두 /;
* 벤더스의 하위 문제
변수
sales(j) '판매량(실제 판매됨)'
waste(j) '과잉 제품'
zsub '하위 문제의 목적 변수';
긍정적인 변동판매, 낭비;
방정식
subobj '하위 문제 목적 함수'
Selling(j) '수취한 부분이 판매되었습니다'
market(j) '매출 상한선';
subobj.. zsub =e= sum(j, 가격*판매(j)) - sum(j, wastecost*waste(j));
판매(j)..판매(j) + 폐기물(j) =e= 수신됨.l(j);
시장(j)..매출(j) =l= 수요(j);
모델 하위 문제 / 하위 개체, 판매, 시장 /;
* 벤더 루프
스칼라
rgap '상대적 간격' / 0 /
lowerBound '전역 하한' / -inf /
upperBound '전역 상한' / +inf /
obj마스터 / 0 /
objSub / 0 /;
옵션 limRow = 0, limCol = 0, solPrint = 자동, 솔버 = cplex,solveLink = %solveLink.loadLibrary%;
수신됨.l(j) = 0;
obj마스터 = 0;
$rtol을 설정하지 않은 경우 $set rtol 0.001
루프(반복,
objSub = 0;
루프(들,
수요(j) = 시나리오데이터(s,j);
lp를 사용하여 zsub를 최대화하는 하위 문제를 해결합니다.
objSub = objSub + ScenarioData(s,'prob')*zsub.l;
cutconst(iter) = cutconst(iter) + ScenarioData(s,'prob')*sum(j, market.m(j)*demand(j));
cutcoeff(iter,j) = cutcoeff(iter,j) + ScenarioData(s,'prob')*판매.m(j);
);
itActive(iter) = 예;
if(lowerBound < objMaster + objSub, lowerBound = objMaster + objSub;);
rgap = (상한 - 하한)/(1 + abs(상한));
break$(rgap < %rtol%);
lp를 사용하여 zmaster를 최대화하는 마스터 문제를 해결합니다.
upperBound = zmaster.l;
objMaster = zmaster.l - theta.l;
);
abort$(rgap >= %rtol%) '추가 반복 필요', 하한, 상한;
'최적 솔루션' 표시, 하한, 상한;