설명
이 예는 확률론적 Bender 구현을 보여줍니다.
간단한 운송 예.
이것은 확률론적 벤더 시퀀스의 세 번째 예입니다.
마스터 문제를 해결하기 위해 다양한 방법을 사용하여 구현
하위 문제.
이 세 번째 예는 다음을 사용하여 확률론적 벤더 알고리즘을 구현합니다.
마스터 문제와 하위 문제를 순차적으로 해결합니다. 여기 이 모델들은
Python OO-API GamsModelInstance 객체로 구현됩니다. 는
장점은 모델을 한 번만 생성하고 해결하면 된다는 것입니다.
다양한 데이터로. GamsModelInstance의 모델 림은
변경될 경우 마스터 모델에는 바인딩되지 않은 모든 가능한 컷이 포함됩니다.
시작 부분의 제약 조건: sum(j, eps*received(j)) =l= bigM. 동안
알고리즘의 우변과 계수의 원인
received(j)는 실제 컷 데이터로 업데이트됩니다.
키워드: 선형 계획법, 확률론적 벤더 알고리즘, 운송
문제, 무료 슬롯 사이트 임베디드 코드 기능, Python
소형 모델 유형 :LP
카테고리 : 무료 슬롯 사이트 모델 라이브러리
메인 파일 : spbenders3.gms
$title 확률론적 벤더 - 순차 GamsModelInstance (SPBENDERS3,SEQ=420)
$onText
이 예는 확률론적 Bender 구현을 보여줍니다.
간단한 운송 예.
이것은 확률론적 벤더 시퀀스의 세 번째 예입니다.
마스터 문제를 해결하기 위해 다양한 방법을 사용하여 구현
하위 문제.
이 세 번째 예는 다음을 사용하여 확률론적 벤더 알고리즘을 구현합니다.
마스터 문제와 하위 문제를 순차적으로 해결합니다. 여기 이 모델들은
Python OO-API GamsModelInstance 객체로 구현됩니다. 는
장점은 모델을 한 번만 생성하고 해결하면 된다는 것입니다.
다양한 데이터로. GamsModelInstance의 모델 림은
변경될 경우 마스터 모델에는 바인딩되지 않은 모든 가능한 컷이 포함됩니다.
시작 부분의 제약 조건: sum(j, eps*received(j)) =l= bigM. 동안
알고리즘의 우변과 계수의 원인
received(j)는 실제 컷 데이터로 업데이트됩니다.
키워드: 선형 계획법, 확률론적 벤더 알고리즘, 교통
문제, 무료 슬롯 사이트 임베디드 코드 기능, Python
$offText
$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용
세트
나는 '공장' / 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% / 설정;
별칭(iter,it);
매개변수
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));
옵트컷(iter)..
theta =l= cutconst(iter) + sum(j, cutcoeff(iter,j)*received(j));
product.up(i) = 용량(i);
모델 마스터문제 / 모두 /;
* 벤더스의 하위 문제
매개변수 r(j) '마스터로부터 수신됨';
변수
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= r(j);
시장(j)..매출(j) =l= 수요(j);
모델 하위 문제 / 하위 개체, 판매, 시장 /;
* 벤더 루프
스칼라
rgap '상대적 간격' / 0 /
lowerBound '전역 하한' / -inf /
upperBound '전역 상한' / +inf /
obj마스터 / 0 /
objSub / 0 /;
$set 솔버로그
$if set useSolverLog $setsolverlog 출력=sys.stdout
임베디드 코드 Python:
defsolvMI(mi, SymIn=[], SymOut=[]):
SymIn의 Sym에 대해:
무료 슬롯 사이트db[sym].copy_symbol(mi.sync_db[sym])
mi.solve(%solverlog%)
SymOut의 Sym에 대해:
시도해 보세요:
무료 슬롯 사이트db[sym].clear() # Sym에 대해 "writerTo" 플래그가 설정되었는지 확인하기 위해 기호를 명시적으로 지웁니다.
mi.sync_db[sym].copy_symbol(무료 슬롯 사이트db[sym])
제외:
통과
일시중지임베디드코드
abort$execerror '파이썬 오류입니다. 로그를 확인하세요';
* 컷을 바인딩되지 않은 상태로 초기화합니다.
cutconst(iter) = 1e15;
cutcoeff(iter,j) = EPS;
r(j) = 0;
obj마스터 = 0;
$libInclude pyEmbMI miSub 'lp를 사용하는 하위 문제 최대 zsub' -all_model_types=cplex r.Zero Demand.Zero
$libInclude pyEmbMI miMaster 'lp를 사용하는 masterproblem max zmaster' -all_model_types=cplex cutconst.Accumulate cutcoeff.Accumulate
$rtol을 설정하지 않은 경우 $set rtol 0.001
루프(그것,
* 아래 컷 데이터의 클리어는 Accumulate updateType과 함께 적용됩니다.
* 업데이트 기호. Clear 및 updateType BaseCase 없이도 작동합니다.
* 그러나 매 반복마다 통신하기 때문에 훨씬 더 많은 데이터 교환이 필요합니다.
* 지금까지 생성된 모든 컷의 데이터
옵션 클리어 = cutconst, 클리어 = cutcoeff;
objSub = 0;
cutconst(it) = EPS;
계속임베디드코드:
무료 슬롯 사이트db['r'].copy_symbol(miSub.sync_db['r'])
일시중지임베디드코드
루프(들,
수요(j) = 시나리오데이터(s,j);
계속임베디드코드:
solvMI(miSub,['수요'],['시장','판매','zsub'])
PauseEmbeddedCode 시장, 판매, zsub
objSub = objSub + ScenarioData(s,'prob')*zsub.l;
cutconst(it) = cutconst(it) + ScenarioData(s,'prob')*sum(j, market.m(j)*demand(j));
cutcoeff(it,j) = cutcoeff(it,j) + ScenarioData(s,'prob')*판매.m(j);
);
if(lowerBound < objMaster + objSub, lowerBound = objMaster + objSub);
rgap = (상한 - 하한)/(1 + abs(상한));
break$(rgap < %rtol%);
계속임베디드코드:
solvMI(miMaster,['cutconst','cutcoeff'],['received','zmaster','theta'])
PauseEmbeddedCode 수신됨, zmaster, theta
upperBound = zmaster.l;
objMaster = zmaster.l - theta.l;
r(j) = 수신됨.l(j);
);
abort$(rgap >= %rtol%) '추가 반복 필요', 하한, 상한;
'최적 솔루션' 표시, 하한, 상한;