설명
이 모델은 다음의 글로벌 솔루션을 위한 알고리즘을 제공합니다. 볼록성 가정이 없는 반무한 프로그램(SIP)입니다. 이는 보장된 실현가능점으로 유한하게 종료되며, EPS^f-슬롯 무료체험성 인증서. 유일한 가정은 연속성이다 슬롯 무료체험의 SIP-Slater 포인트의 기능과 존재 여부. 하한과 상한은 두 개의 비볼록형을 해로 구합니다. 각각 비선형 프로그램(NLP)을 수행하여 비볼록성을 다음으로 이동시킵니다. 글로벌 NLP 솔버. 이 예는 SIP에 대한 솔루션을 제공합니다. min(x_1,x_2) in [-1000,1000]^2 1/3*sqr(x_1) + sqr(x_2) + 1/2*x_1; 성. sqr(1 - sqr(x_1)*sqr(y)) - x_1*sqr(y) - sqr(x_2) + x_2 <= 0([0,1]의 모든 y에 대해) 모델은 2009년 6월 Alexander Mitsos가 제공했습니다. 파생 저작물에는 아래 인용문을 사용해 주세요.
대형 슬롯 무료체험 유형 :NLP
카테고리 : 슬롯 무료체험 모델 라이브러리
메인 파일 : 슬롯 무료체험gms
$title 우변 제한을 통한 반무한 프로그램의 전역 최적화(SIPRES,SEQ=372)
$onText
이 모델은 다음의 전역 솔루션을 위한 알고리즘을 제공합니다.
볼록성 가정이 없는 반무한 프로그램(SIP)입니다.
이는 보장된 실현가능점으로 유한하게 종료되며,
EPS^f-최적성 인증서. 유일한 가정은 연속성이다
최적의 SIP-Slater 포인트의 기능과 존재 여부.
하한과 상한은 두 개의 비볼록형을 해로 구합니다.
각각 비선형 프로그램(NLP)을 수행하여 비볼록성을 다음으로 이동시킵니다.
글로벌 NLP 솔버.
이 예는 SIP에 대한 솔루션을 제공합니다.
min(x_1,x_2) in [-1000,1000]^2 1/3*sqr(x_1) + sqr(x_2) + 1/2*x_1;
성.
sqr(1 - sqr(x_1)*sqr(y)) - x_1*sqr(y) - sqr(x_2) + x_2 <= 0([0,1]의 모든 y에 대해)
모델은 2009년 6월 Alexander Mitsos가 제공했습니다.
파생 저작물에는 아래 인용문을 활용하시기 바랍니다.
Mitsos, A, 반무한 프로그램의 전역 최적화
오른쪽의 제한. 최적화 60, 7(2010).
http://doi.org/10.1080/02331934.2010.527970
키워드: 비선형 프로그래밍, 전역 최적화, 반무한 프로그래밍,
수학
$offText
* 결정론적 글로벌 코드로만 테스트
$ifI %슬롯 무료체험nlp%==안티고네 $goTo 계속
$ifI %슬롯 무료체험nlp%==남작 $goTo 계속
$ifI %슬롯 무료체험nlp%==lindoglobal $goTo 계속
$ifI %슬롯 무료체험nlp%==scip $goTo 계속
$log %슬롯 무료체험nlp%는 결정론적 전역 최적화를 제공하지 않습니다.
$exit
$label 계속
$onEmpty
매개변수
myoptR 'SIP에 대한 상대적 종료 기준' / 1e-3 /
myoptA 'SIP에 대한 절대 종료 기준' / 1e-3 /
엡실론 '엡실론의 초기값' / 1 /
epsfactor '엡실론의 분할 인자' / 2 /;
세트
디스크 / 1*30 /
dlbd(disc) '하한 경계의 이산화' / /
dubd(disc) '상한 경계의 분리' / /;
* 차원 >= 예상 반복 횟수
스칼라 맥시터;
맥시터 = 카드(디스크);
xset, yset 설정;
매개변수
ylbd(yset,disc) '하한 이산화'
yubd(yset,disc) '상한 이산화';
변수
x(xset) '상한 경계 및 하한 경계 문제에 대한 변수'
y(yset) '하위 수준에 대한 변수'
obj '상위 목적 함수'
vio '하위 프로그램에 대한 제약 조건 위반';
모델 lowmod, ubdmod, lbdmod;
* 문제별 정의
방정식
eqobj '상위 목적 함수'
eqconlow 'SIP 제약'
eqconlbd(disc) '하한 경계 문제에 대한 이산화된 제약 조건'
eqconubd(disc) '상한 문제에 대한 이산화된 제약조건';
세트
x세트 / 1*2 /
yset / 1*1 /;
$macro ResetBoundsOnX x.lo(xset) = -1000; x.up(xset) = 1000
ResetBoundsOnX;
y.lo(yset) = 0;
y.up(yset) = 1;
eqobj..obj =e= 1/3*sqr[x('1')] + sqr[x('2')] + 1/2*x('1');
$macro eqcon(y) sqr1 - sqr[x('1')]*sqr[y] - x('1')*sqr[y] - sqr[x('2')] + x('2')
eqconlow.. eqcon(y('1')) =e= vio;
eqconlbd(dlbd).. eqcon(ylbd('1',dlbd)) =l= 0;
eqconubd(dubd).. eqcon(yubd('1',dubd)) =l= -epsilon;
* 세 가지 하위 문제
모델
lowmod / eqconlow /
ubdmod / eqobj, eqconubd /
lbdmod / eqobj, eqconlbd /;
* 문제별 선언의 끝
결과가 표시되는 파일 출력 / 'ex2res.txt' /;
출력을 넣어;
lowmod.holdFixed = 1;
옵션 solPrint = 꺼짐, limRow = 0, limCol = 0, optCa = 1e-6, optCr = 1e-4;
스칼라
LBD '하한' / -1e10 /
UBD '상한' / +1e10 /
UBD_LBD '절대적인 격차'
iter '반복 카운터' / 0 /
CPULBD / 0 /
CPUlbdlow / 0 /
CPUubd / 0 /
CPUubdlow / 0 /
CPUOT;
매개변수 xstar(xset) '솔루션';
* 혹시라도 더미 초기화
ylbd(yset,dlbd) = 6e66;
yubd(yset,dubd) = 6e66;
$eolCom //
$macro putsol(v) loop(v&set, put ' ' v.l(v&set):20:15)
$macro putstat(m) put 'msolveStat=' m.solveStat ' modelStat=' m.modelStat
루프(디스크,
iter = 반복 + 1;
if(iter > 맥시터,
put 'iter='를 기대하지 않았습니다. iter /;
'너무 많은 반복'을 중단합니다.
);
put '####' / 'iter=' iter:5:0 ' LBD=' LBD:20:15 ' UBD=' UBD:20:15 /;
nlp를 사용하여 obj를 최소화하는 lbdmod를 해결합니다. // 하한 문제
cpulbd = cpulbd + lbdmod.resUsd;
putstat(lbdmod);
if(lbdmod.solveStat <> %solveStat.normalCompletion% 또는
(lbdmod.modelStat <> %modelStat.optimal% 및
lbdmod.modelStat <> %modelStat.feasibleSolution% 및
lbdmod.modelStat <> %modelStat.locallyOptimal%),
'예기치 않은 실패 lbdmod'를 입력하세요. /;
if(LBD < lbdmod.objEst, LBD = lbdmod.objEst;);
그렇지 않으면
LBD = lbdmod.objEst;
);
put ' lbd obj=' obj.l:20:15 ' 가능한 최선=' lbdmod.objEst:20:15,' x='; 푸솔(x);
넣어 /;
* 고정 매개변수에 대한 하위 수준 문제(지금까지는 모두 양호하다고 가정)
x.fx(xset) = x.l(xset);
nlp를 사용하여 vio를 최대화하는 lowmod를 해결합니다.
ResetBoundsOnX;
cpulbdlow = cpulbdlow + lowmod.resUsd;
putstat(lowmod);
if(lowmod.solveStat = %solveStat.normalCompletion% 및
(lowmod.modelStat = %modelStat.optimal% 또는
lowmod.modelStat = %modelStat.feasibleSolution% 또는
lowmod.modelStat = %modelStat.locallyOptimal%),
' 일반 vio=' vio.l:20:15 ' 가능한 가장 좋은 =' lowmod.objEst:20:15 ' y='; 푸솔(y);
넣어 /;
if(lowmod.objEst <= 0,
'하한 경계 문제가 실현 가능점을 찾았으나 사용하지 않음'을 입력합니다. /;
그렇지 않으면
dlbd(디스크) = 예;
ylbd(yset,disc) = y.l(yset);
);
);
* 상한 문제
nlp를 사용하여 obj를 최소화하는 ubdmod를 해결합니다.
CPUubd = CPUubd + ubdmod.resUsd;
putstat(ubdmod);
if(ubdmod.solveStat <> %solveStat.normalCompletion%,
'비정상'을 입력 /;
'실패한 ubdmod'를 중단합니다.
elseIf(ubdmod.modelStat = %modelStat.infeasible% 또는
ubdmod.modelStat = %modelStat.infeasibleNoSolution%),
' 실행 불가능 엡실론=' 엡실론:20:15 /;
엡실론 = 엡실론/엡스팩터;
elseIf(ubdmod.modelStat <> %modelStat.optimal% 및
ubdmod.modelStat <> %modelStat.feasibleSolution% 및
ubdmod.modelStat <> %modelStat.locallyOptimal%),
'예상치 못한'을 넣어 /;
"예기치 않은 ubdmod.modelstat"를 중단합니다.
그렇지 않으면
' 최적의 후보 obj=' obj.l:20:15 ' 가능한 최선=' ubdmod.objEst:20:15 ' x='; 푸솔(x);
put 'epsilon=' 엡실론:20:15 /;
* 고정 매개변수에 대한 하위 수준 문제
x.fx(xset) = x.l(xset);
nlp를 사용하여 vio를 최대화하는 lowmod를 해결합니다.
ResetBoundsOnX;
cpuubdlow = cpuubdlow + lowmod.resUsd;
putstat(lowmod);
if(lowmod.solveStat <> %solveStat.normalCompletion% 또는
(lowmod.modelStat <> %modelStat.optimal% 및
lowmod.modelStat <> %modelStat.feasibleSolution% 및
lowmod.modelStat <> %modelStat.locallyOptimal%),
'예상치 못한'을 넣어 /;
'낮은 모드 실패'를 중단합니다.
그렇지 않으면
' 일반 vio=' vio.l:20:15 ' 가능한 가장 좋은 =' lowmod.objEst:20:15 ' y='; 푸솔(y);
넣어 /;
if(lowmod.objEst <= 0,
엡실론 = 엡실론/엡스팩터;
if(obj.l < UBD,
UBD = obj.l;
xstar(xset) = x.l(xset));
그렇지 않으면
* 이산화에 포인트 추가
dubd(디스크) = 예;
yubd(yset,disc) = y.l(yset));
);
);
UBD_LBD = UBD - LBD;
* 하한이 상한보다 낮은지 확인하십시오(그렇지 않으면 sth가 잘못됨).
if(UBD_LBD < 0,
put 'UBD=' UBD:20:15 '는 LBD=' LBD:20:15 /;보다 커야 합니다.
'예기치 않은 UBD < LBD'를 중단합니다.
);
* 종료가 발생했는지 확인
if(UBD_LBD < myoptA 또는 LBD > UBD - myoptR*abs(UBD),
put 'UBD=' UBD:10:7 ' LBD=' LBD:10:7 ' 차이=' UBD_LBD:10:7 ' xstar=';
loop(xset, put ' ' xstar(xset):20:15;);
넣어 /;
휴식;
);
);
* 상한 및 하한 경계 문제에 대한 출력 이산화
put / '##' / 'lbd에 대한 이산화' /;
루프(디스크,
dlbd(디스크)를 넣습니다.
if(dlbd(disc), loop(yset, put ' ' ylbd(yset,disc):20:15););
넣어 /;
);
put / '##' / 'ubd에 대한 이산화' /;
루프(디스크,
dubd(디스크)를 넣어;
if(dubd(disc), loop(yset, put ' ' yubd(yset,disc):20:15););
넣어 /;
);
* CPU 시간 및 솔루션 출력
CPUTOT = CPULBD + CPULBDLOW + CPUUBD + CPUUBDLOW;
넣어 / '##' / '해결책'
/ CPUTOT:10:2
/cpulbd:10:2
/cpulbdlow:10:2
/ CPUubd:10:2
/ CPUubdlow:10:2
/ LBD:10:5
/ UBD:10:5 /;
loop(xset, xstar(xset):20:15 /;);