설명
이 모델은 EMP가 변수 jj를 올바르게 처리하는지 확인합니다. 만 발생합니다 mNLP의 목적에 따라 선형적으로. 해당 MCP를 고려하면 다음과 같은 변수가 있는 경우 크레이지 슬롯의 mcp 검사가 실패합니다. 제약 조건에 매핑되어 모델에 표시되지 않습니다. 유지해야 할 한 가지 해결 방법 모델의 변수는 eps*jj를 사용하고 있습니다(모델 mMCP 참조). MCP는 EMP를 통해 자동으로 생성되고 해결될 수 있습니다. EMP는 모델을 전처리하고 생성된 하위 모델에서 jj 및 dldJJ를 생략합니다. 따라서, Eps*jj를 사용한 해결 방법은 필요하지 않지만 EMP는 jj.l/m을 확인해야 합니다. 올바른 값으로 설정됩니다(모델 mNLP 참조). 해당 VI를 고려하십시오. MCP와 유사하게 다음을 사용하여 jj를 포함해야 합니다. eps*jj(모델 mVI 참조) 마지막으로 다음의 간단한 예인 동족 VI(동일하지 않음!)를 작성합니다. 최적화 문제로 공식화할 수 없는 VI. 이 모델은 크레이지 슬롯 EMP 라이브러리의 zerofunc 모델의 변형입니다. 기여자: Jan-H. Jagla, 2009년 3월
소형 모델 유형 :크레이지 슬롯
카테고리 : 크레이지 슬롯 테스트 라이브러리
메인 파일 : empvi05.gms
$title EMP의 홀수 변수 처리 테스트(EMPVI05,SEQ=435)
$onText
이 모델은 EMP가 변수 jj를 올바르게 처리하는지 확인합니다. 만 발생합니다
mNLP의 목적에 따라 선형적으로.
해당 MCP를 고려하면 다음과 같은 변수가 있는 경우 크레이지 슬롯의 mcp 검사가 실패합니다.
제약 조건에 매핑되어 모델에 표시되지 않습니다. 유지해야 할 한 가지 해결 방법
모델의 변수는 eps*jj를 사용하고 있습니다(모델 mMCP 참조).
MCP는 EMP를 통해 자동으로 생성되고 해결될 수 있습니다. EMP는
모델을 전처리하고 생성된 하위 모델에서 jj 및 dldJJ를 생략합니다. 따라서,
Eps*jj를 사용한 해결 방법은 필요하지 않지만 EMP는 jj.l/m을 확인해야 합니다.
올바른 값으로 설정됩니다(모델 mNLP 참조).
해당 VI를 고려하십시오. MCP와 유사하게 다음을 사용하여 jj를 포함해야 합니다.
eps*jj(모델 mVI 참조)
마지막으로 다음의 간단한 예인 동족 VI(동일하지 않음!)를 작성합니다.
최적화 문제로 공식화할 수 없는 VI.
이 모델은 크레이지 슬롯 EMP 라이브러리의 zerofunc 모델의 변형입니다.
기여자: Jan-H. 자글라, 2009년 3월
$offText
파일 myinfo / '%emp.info%' /;
**** 간단한 NLP
자유 변수 y, z, jj;
자유 변수 obj;
방정식 objDef, gCons;
jj.lo=3;
objDef.. obj =E= power(y,3) / 3 + jj;
gCons..y =G= sqr(z);
모델 mNLP / objDef, gCons /;
nlp를 사용하여 mNLP min obj를 해결합니다.
abort$[jj.l <> jj.lo] 'mNLP: jj가 하한에 있지 않음';
**** 해당 MCP
양수 변수 u 'MCP에 대한 명시적 승수';
방정식 dLdy, dLdz, dLdjj, dLdu;
ul = gCons.m;
dLdy..sqr(y) - u =N= 0;
dLdz.. 0 - u*2*z =N= 0;
dLdjj.. 1 + eps*jj - 0 =N= 0;
dLdu..y - sqr(z) =N= 0;
모델 mMCP/dLdy.y, dLdz.z, dLdjj.jj, dLdu.u/;
mcp를 사용하여 mMCP를 해결합니다.
abort$[mMCP.modelStat <> %modelStat.optimal% ] 'mMCP: 모델 상태가 1이 아님';
abort$[mMCP.solveStat <> %solveStat.normalCompletion% ] 'mMCP: 솔버 상태가 1이 아닙니다.';
abort$[mMCP.objval > 1e-6 ] 'mMCP: 모델에 대한 입력이 최적이 아닙니다';
abort$[mMCP.iterusd > 0 ] 'mMCP: 사용된 반복';
abort$[jj.l <> jj.lo ] 'mMCP: jj가 하한에 있지 않음';
**** EMP를 통해 해당 MCP를 생성하고 해결합니다.
* EMP에게 MCP로서 이 문제를 해결하라고 지시합니다.
putclose myinfo '모델 유형 MCP';
emp를 사용하여 mNLP min obj를 해결합니다.
abort$[mNLP.modelStat <> %modelStat.locallyOptimal% ] 'mNLP: 모델 상태가 2가 아님';
abort$[mNLP.solveStat <> %solveStat.normalCompletion% ] 'mNLP: 해결자 상태가 1이 아님';
abort$[mNLP.objval <> obj.l ] 'mNLP: ObjVal과 obj.l이 다름';
abort$[mNLP.iterusd > 0 ] 'mNLP: 사용된 반복';
abort$[jj.l <> jj.lo ] 'mNLP: jj가 하한에 있지 않음';
**** EMP를 통해 해당 VI를 생성하고 해결합니다.
방정식 F_y, F_jj;
F_y..sqr(y) =N= 0;
F_jj.. 1 + eps*jj =N= 0;
* vi에 대한 보완 쌍을 정의
내 정보 'vi'를 넣어 /;
putclose 'F_y y F_jj jj';
모델 mVI / F_y, F_jj, gCons /;
emp를 사용하여 mVI를 해결합니다.
abort$[mVI.modelStat <> %modelStat.locallyOptimal% ] 'mVI: 모델 상태가 1이 아님';
abort$[mVI.solveStat <> %solveStat.normalCompletion% ] 'mVI: 솔버 상태가 1이 아님';
abort$[mVI.objval > 1e-6 ] 'mVI: 모델에 대한 입력이 최적이 아닙니다';
abort$[mVI.iterusd > 0 ] 'mVI: 사용된 반복';
abort$[jj.l <> jj.lo ] 'mVI: jj가 하한에 있지 않음';
********************************************************************************
**** 이제 EMP VI를 VI 함수에서 파생될 수 없는 VI 함수와 함께 사용하세요.
**** 최적화 문제
****
**** F_y만 고려하면 해당 NLP 목표는 다음과 같습니다.
**** objDef.. obj =E= power(y,3) / 3 + y*jj;
**** 그러나 이 경우 F_jj로 끝나게 됩니다.
**** F_jj..y =N= 0;
방정식 mod_F_y;
mod_F_y..sqr(y) + jj =N= 0;
* vi에 대한 보완 쌍을 정의
내 정보 'vi'를 넣어 /;
putclose 'mod_F_y y';
모델 mVI_pure / mod_F_y, gCons /;
jj.up = jj.lo;
gCons.m = 3;
emp를 사용하여 mVI_pure를 해결합니다.
abort$[mVI_pure.modelStat <> %modelStat.locallyOptimal% ] 'mVI_pure: 모델 상태가 1이 아님';
abort$[mVI_pure.solveStat <> %solveStat.normalCompletion% ] 'mVI_pure: 솔버 상태가 1이 아닙니다.';
abort$[mVI_pure.objval > 1e-6 ] 'mVI_pure: 모델에 대한 입력이 최적이 아닙니다.';
abort$[mVI_pure.iterusd > 0 ] 'mVI 순수: 사용된 반복';
abort$[jj.l <> jj.lo ] 'mVI_pure: jj가 하한에 있지 않음';