설명
이 모델은 비볼록형 mathopt1을 기반으로 합니다. 로컬 솔버는 실패합니다. 전역 최적점을 찾아보세요. 여기서는 검색 전략과 파티션을 구현합니다. x, y 공간을 동일한 크기의 상자로 만듭니다. 각 상자에 대해 로컬 최적화를 시작합니다. 이 방법으로 전역 최적을 얻을 수 있습니다. 이 예는 2차원 시나리오에서 GUSS를 사용하는 방법을 보여줍니다. 색인. 세트 샘플(s1,s2)은 설명된 모든 2차원 상자를 나타냅니다. 상자의 하한(x/yLo) 및 상한(x/yUp) 경계로. x,y 솔루션 매개변수 sx,sy에 저장됩니다.
소형 모델 유형 :NLP
카테고리 : 슬롯 커뮤니티 모델 라이브러리
메인 파일 : guss2dim.gms
$title 2차원 시나리오 GUSS 예(GUSS2DIM,SEQ=423)
$onText
이 모델은 비볼록 mathopt1을 기반으로 합니다. 로컬 솔버는 실패합니다.
전역 최적점을 찾아보세요. 여기서는 검색 전략과 파티션을 구현합니다.
x, y 공간을 동일한 크기의 상자로 만듭니다. 각 상자에 대해 로컬 최적화를 시작합니다.
이 방법으로 전역 최적을 얻을 수 있습니다.
이 예는 2차원 시나리오에서 GUSS를 사용하는 방법을 보여줍니다.
색인. 세트 샘플(s1,s2)은 설명된 모든 2차원 상자를 나타냅니다.
상자의 하한(x/yLo) 및 상한(x/yUp) 경계로. x,y 솔루션
sx,sy 매개변수에 저장됩니다.
Bussieck, MR, Ferris, MC 및 Lohmann, T, GUSS: 데이터 수집 해결
슬롯 커뮤니티 내의 관련 모델. Kallrath, J, Ed, 대수 모델링 시스템: 모델링
및 실제 최적화 문제 해결. Springer, 베를린 하이델베르그, 2012, pp. 35-56.
키워드: 비선형 계획법, 수학, 전역 최적화, GUSS, 다중 시작
$offText
$eolCom //
변수 x, y, obj;
x.lo = -10; y.lo = -15; // 하한
x.l = 8; y.l = -14; // 초기값
x.up = 20; y.up = 20; // 상한
방정식 objdef, eqs, ineqs;
objdef.. obj =e= 10*sqr(sqr(x) - y) + sqr(x - 1);
eqs.. x =e= x*y;
ineqs.. 3*x + 4*y =l= 25;
모델 m / 모두 /;
* NUMBOX는 [x.lo,x.up]을 덮을 상자의 개수입니다.
$설정되지 않은 경우 NUMBOX $set NUMBOX 20
s / s1*s%NUMBOX% / 설정; 별칭(s,s1,s2);
샘플 설정(s1,s2) / #s1.#s2 /;
Parameter xLo(s1,s2), xUp(s1,s2), yLo(s1,s2), yUp(s1,s2) '[x.lo,x.up]*[y.lo,y.up] 공간을 덮는 상자';
xLo(s,s2) = x.lo + (x.up-x.lo)*(s.pos-1)/%NUMBOX%;
xUp(s,s2) = xLo(s,s2) + (x.up-x.lo)/%NUMBOX%;
yLo(s1,s) = y.lo + (y.up-y.lo)*(s.pos-1)/%NUMBOX%;
yUp(s1,s) = yLo(s1,s) + (y.up-y.lo)/%NUMBOX%;
mattrib 'objval 및 modelstat와 같은 모델 속성' 설정' / system.GUSSModelAttributes /;
매개변수
sx(s1,s2), sy(s1,s2) 'x와 y에 대한 수집기'
srep(s1,s2, mattrib) 'modelstat 등과 같은 모델 속성'
o 'GUSS 옵션' / SkipBaseCase 1, LogOption 1 /;
dict/sample.scenario를 설정하세요.''
오. .srep 선택
x. 낮은 .xLo
x. 상위 .xUp
x. 레벨 .sx
y. 낮은 .yLo
y. 위쪽 .yUp
y. 레벨 .sy /;
nlp 시나리오 dict를 사용하여 obj를 최소화하는 문제를 해결하세요.
* 최소한의 타당성으로 해결된 샘플만 고려(실행 불가능한 샘플은 필터링)
샘플(s1,s2) = srep(s1,s2,'ModelStat')=%modelStat.optimal% 또는
srep(s1,s2,'ModelStat')=%modelStat.locallyOptimal% 또는
srep(s1,s2,'ModelStat')=%modelStat.IntermediateNonoptimal%;
* 가능한 모든 샘플에서 전역 최소값을 구하고 x.l 및 y.l에 해당 샘플 수준 값을 할당합니다.
obj.l = smin(샘플, srep(샘플,'ObjVal'));
* 전역 최적의 샘플이 두 개 이상 있을 수 있으므로 싱글톤에 여러 샘플을 할당할 수 있지만 첫 번째 샘플을 사용합니다.
싱글톤 세트 bestSample(s1,s2); 옵션 strictSingleton=0; // UG_GamsCall.html#GAMSAOstrictSingleton 참조
bestSample(샘플) = abs(srep(샘플,'ObjVal')-obj.l)<1e-6;
x.l = sx(bestSample); y.l = sy(bestSample);
bestSample, obj.l, x.l, y.l을 표시합니다.
*매개변수 sobj(s1,s2) 'obj에 대한 수집기';
*sobj(샘플) = srep(샘플,'ObjVal');
*옵션 sobj:0:1:1; 표시 sobj;
* 일부 테스트에서는 전역 최소값에 가깝습니다.
abort$(abs(obj.l - 0)>1e-3) '전역 최소값이 아님', obj.l;
abort$(abs(x.l - 1)>1e-3) '올바른 x가 아님', x.l;
abort$(abs(y.l - 1)>1e-3) '올바른 y가 아닙니다', y.l;