설명
이 모델은 일반적인 단순 외부 근사 알고리즘을 구현하는 방법을 보여줍니다. 볼록 혼합 이진 비선형 프로그램의 경우. 이 모델은 모델 인스턴스의 두 가지 표현인 인덱스를 사용합니다. 모델 인스턴스(원래 이름 포함) 및 벡터/스칼라 모델 인스턴스. 후자는 야코비안(Jacobian) 및 이와 유사한 것을 처리할 수 있게 해줍니다. 일반적인 n x m 행렬 방식의 객체입니다. 수정(OA 컷, 솔루션 제거 컷, 고정 하위 문제에 대한 변수 등)은 슬롯 사이트 소스 재작성에 의해 수행됩니다. 스칼라 모델 인스턴스 공간에서. 사용자가 수행해야 하는 유일한 사용자 정의 부분은 식별하는 것입니다. 비선형 제약 조건과 원본의 이진 변수 인덱스 모델. 기고자: Michael Bussieck, 2012년 11월 START 문제별 부분
소형 모델 유형 :슬롯 사이트
카테고리 : 슬롯 사이트 EMP 라이브러리
메인 파일 : oa.gms
$title 이진 변수의 볼록 최소화 문제에 대한 외부 근사(OA,SEQ=95)
$onText
이 모델은 일반적인 단순 외부 근사 알고리즘을 구현하는 방법을 보여줍니다.
볼록 혼합 이진 비선형 프로그램의 경우.
이 모델은 모델 인스턴스의 두 가지 표현인 인덱스를 사용합니다.
모델 인스턴스(원래 이름 포함) 및 벡터/스칼라 모델
인스턴스. 후자는 야코비안(Jacobian) 및 이와 유사한 것을 처리할 수 있게 해줍니다.
일반적인 n x m 행렬 방식의 객체입니다.
수정(OA 컷, 솔루션 제거 컷, 고정
하위 문제에 대한 변수 등)은 슬롯 사이트 소스 재작성에 의해 수행됩니다.
스칼라 모델 인스턴스 공간에서.
사용자가 수행해야 하는 유일한 사용자 정의 부분은 식별하는 것입니다.
비선형 제약 조건과 원본의 이진 변수
인덱스 모델.
기고자: Michael Bussieck, 2012년 11월
$offText
* START 문제 특정 부분
$모델을 설정하지 않은 경우 $set 모델 연료
$call gamslib -q %model%
$goTo %모델%
$label 연료
$set binvar status_vm
$set nlequ 비용fn_em, oileq_em
$set binvarc binvar(j) = sum(status_vm(j,u1),1);
$set nlequc nlequ(i) = 1$costfn_em(i) + sum(oileq_em(i,u1),1);
$set는 ucom 최소 비용을 해결합니다.
$goTo 계속
$label 프로셀
$set binvar y1_vm, y2_vm, y3_vm
$set nlequ inout2_em, inout3_em
$set binvarc binvar(j) = 1$y1_vm(j) + 1$y2_vm(j) + 1$y3_vm(j);
$set nlequc nlequ(i) = 1$inout2_em(i) + 1$inout3_em(i);
$set 해결 프로세스 최소 pr
$goTo 계속
$label 배치
$set binvar y_vm
$set nlequ time_em, obj_em
$set binvarc binvar(j) = sum(y_vm(j,u1,u2), 1);
$set nlequc nlequ(i) = 1$time_em(i) + 1$obj_em(i);
$set 해결 배치 최소 비용
$goTo 계속
* STOP 문제 특정 부분
* 일반 OA 알고리즘
$label 계속
$onEcho > 변환.op2
dumpgdx jacobian.gdx
객체
$offEcho
$onEcho > 변환.opt
게임
gmsinsert
객체
딕트맵
$offEcho
* 마지막 해결 문이 해결될 MINLP라고 가정합니다.
$call 슬롯 사이트 %model% minlp=optfile 변환=1 lo=%슬롯 사이트lo%
$if errorlevel 1 $abort %model% 실행 문제
i 스칼라 방정식 설정
j 스칼라 변수
nlequ(i) 스칼라 비선형 방정식
binvar(j) 스칼라 이진 변수;
* 원본 이진 변수 및 비선형 방정식 맵
%binvar%, %nlequ% 설정;
$gdxIn 딕셔너리 맵
$load i j %binvar% %nlequ%
별칭(*,u1,u2,u3);
%binvarc%;
%nlequc%;
스칼라
sstat 해결 상태
mstat 모델 상태
obj 목적 함수;
변수
x(j) 스칼라 변수;
방정식
e(i) 스칼라 방정식;
파일 fx /'insert.gms'/; fx.pw=4095;
put fx 'rminlp min objvar를 사용하여 m 해결'
/ '스칼라 mstat,sstat,obj;'
/ 'mstat=m.modelstat; sstat=m.solvestat; obj=m.objval;'
/ 'execute_unload "rminlp", mstat, sstat, obj;'
/ '옵션 minlp=변환; m.optfile=2; minlp min objvar'를 사용하여 m을 해결합니다.
/ '$정지';
닫다;
'슬롯 사이트 슬롯 사이트 lo=%슬롯 사이트lo% u1=insert'를 실행합니다.
abort$errorlevel 'rminlp 해결 문제';
Execute_load 'rminlp', mstat, sstat, obj;
if((mstat=%modelStat.optimal% 또는 mstat=%modelStat.locallyOptimal%)가 아님),
'rminlp가 (로컬) 최적성으로 해결되지 않음'을 중단합니다.
);
* 정수가 가능한지 확인
Execute_load '야코비안', x;
if (sum(binvar(j), abs(x.l(j)-round(x.l(j))))<1e-6,
abort.noerror 'rminlp 정수 가능';
);
iter OA 반복 설정 / i1*i10 /
oacutpmarg(iter,i) OA 컷 양수 한계 표시기
oacut(iter,i) OA컷
mipcut(iter) MIP 컷
mipcut1(iter,j) MIP는 컷에서 레벨 1의 이진 변수를 컷합니다.
매개변수
lb 하한
ub 상한
A(i,j) 야코비안
oacutcoef(iter,i,j) OA 절단 계수
oacutrhs(iter,i) OA 컷 rhs;
lb = obj;
ub = inf;
mipcut(iter) = 아니요; mipcut1(iter,j) = 아니요;
별칭(iter,it);
$set fmt 18:15
루프(반복,
Execute_load 'jacobian', A, e, x;
* 외부 근사 컷 작성:
루프(nlequ(i)$e.m(i),
oacutcoef(iter,i,j)$A(i,j) = A(i,j);
oacutrhs(iter,i) = sum(j$A(i,j), A(i,j)*x.l(j)) - e.l(i);
oacut(iter,i) = 예;
oacutpmarg(iter,i) = e.m(i)>0;
);
* MIP 해결
fx를 넣어;
루프(oacut(it,i),
/ '방정식 oa_', it.tl:0 '_' i.tl:0 ';을 입력하세요. '
'변수 보아_', it.tl:0 '_' i.tl:0 ' / lo ' e.lo(i) ', up ' e.up(i) ' /;'
/ 'oa_' it.tl:0 '_' i.tl:0 '.. ';
loop(j$oacutcoef(it,i,j), put$(oacutcoef(it,i,j)>0) '+';
put oacutcoef(it,i,j):%fmt% '*' j.tl:0);
if(oacutpmarg(it,i), put ' =g= '; else put ' =l= ');
put oacutrhs(it,i):%fmt% ' + boa_', it.tl:0 '_' i.tl:0 ';';
);
루프(밉컷(그것),
/ '방정식 mc_', it.tl:0 ';'을 입력하세요.
/ 'mc_' it.tl:0 '.. ';
loop(binvar(j), if (mipcut1(it,j), put '+' j.tl:0; else put '-' j.tl:0));
put ' =l= ' (sum(mipcut1(it,binvar),1)-1):0:0 ';';
);
'모델 mp / 모두'를 입력하세요.
loop(nlequ(i), put '-' i.tl:0); '/;'를 넣어
/ 'mip min objvar를 사용하여 mp를 해결합니다.'
/ '스칼라 mstat,sstat,obj;'
/ 'mstat=mp.modelstat; sstat=mp.solvestat; obj=mp.objval;'
/ '매개변수 binX(*);'
loop(binvar(j), put / 'binX("' j.tl:0 '") = ' j.tl:0 '.l;');
put / 'execute_unload "mip", mstat, sstat, obj, binX;'
/ '$정지';
닫다;
'슬롯 사이트 슬롯 사이트 optcr=0 lo=%슬롯 사이트lo% u1=insert'를 실행합니다.
abort$errorlevel '밉 해결 문제';
Execute_load 'mip', mstat, sstat, obj, x.l=binX;
if((mstat=%modelStat.optimal% 또는 mstat=%modelStat.integerSolution%)가 아님),
if (mstat=%modelStat.infeasible% 또는
mstat=%modelStat.integerInfeasible% 또는
mstat=%modelStat.infeasibleNoSolution%,
abort.noerror 'MIP 실행 불가능', lb, ub;
그렇지 않으면
'Mip이 최적성 또는 실행 불가능성으로 해결되지 않음'을 중단합니다.
);
* 하한 업데이트
lb = obj;
abort.noerror$(lb>ub) '크로스오버', lb, ub;
* MIP 컷 추가
밉컷(iter) = 예;
mipcut1(iter,binvar(j)) = x.l(j)>0.5;
* 고정 NLP 해결
loop(binvar(j), put fx / j.tl:0 '.fx = ' round(x.l(j)):0:0 ';');
put / 'rminlp min objvar를 사용하여 m 해결'
/ '스칼라 mstat,sstat,obj;'
/ 'mstat=m.modelstat; sstat=m.solvestat; obj=m.objval;'
/ 'execute_unload "rminlp", mstat, sstat, obj;'
/ '옵션 minlp=변환; m.optfile=2; minlp min objvar'를 사용하여 m을 해결합니다.
/ '$정지';
닫다;
'슬롯 사이트 슬롯 사이트 lo=%슬롯 사이트lo% u1=insert'를 실행합니다.
abort$errorlevel 'rminlp 해결 문제';
Execute_load 'rminlp', mstat, sstat, obj;
if (mstat=%modelStat.optimal% 또는 mstat=%modelStat.locallyOptimal%,
ub = min(ub, obj);
);
* 융합
abort.noerror$((ub - lb) < 1e-4) '수렴', lb, ub;
);
'반복 횟수 없음', lb, ub 표시;