mhw4dxx.gms : 여러 솔루션을 갖춘 MHW4DX

설명

이 인기 있는 테스트 문제에는 여러 로컬 솔루션, 로컬 최소값이 있습니다.
obj 값이 27.87190522 및 52.90257967이고 전역 최소값
obj 값은 0.02931083입니다.  추가 프로그래밍이 수행됩니다.
올바른 솔루션을 테스트하십시오.

우리는 하나의 해결로 두 솔루션을 모두 얻기 위해 적절한 옵션을 사용하여 BARON을 호출합니다.

Wright, MH, 비선형 제약 조건 최적화를 위한 수치적 방법.
1976년 스탠포드대학교 박사학위 논문.

키워드: 비선형 계획법, 수학, 전역 최적화

소형 모델 유형 :NLP


카테고리 : 슬롯 모델 라이브러리


메인 파일 : mhw4dxx.gms

$title 비선형 테스트 문제 - 다중 솔루션(MHW4DXX,SEQ=295)

$onText
이 인기 있는 테스트 문제에는 여러 로컬 솔루션, 로컬 최소값이 있습니다.
obj 값이 27.87190522 및 52.90257967이고 전역 최소값
obj 값은 0.02931083입니다.  추가 프로그래밍이 수행됩니다.
올바른 솔루션을 테스트하십시오.

우리는 하나의 해결로 두 솔루션을 모두 얻기 위해 적절한 옵션을 사용하여 BARON을 호출합니다.

Wright, MH, 비선형 제약 조건 최적화를 위한 수치적 방법.
1976년 스탠포드대학교 박사학위 논문.

키워드: 비선형 계획법, 수학, 전역 최적화
$offText

i / 1*5 / 설정;

변수 m, x(i);

방정식 함수, eq1, eq2, eq3;

기능..
   m =e= sqr(x('1') - 1) + sqr(x('1') - x('2')) + 거듭제곱(x('2') - x('3'),3)
      + power(x('3') - x('4'),4) + power(x('4') - x('5'),4);

eq1.. x('1') + sqr(x('2')) + power(x('3'),3) =e= 3*sqrt(2) + 2;

eq2.. x('2') - sqr(x('3')) + x('4') =e= 2*sqrt(2) - 2;

eq3.. x('1')*x('5') =e= 2;

모델 라이트/모두/;

x.l('1') = -1;
x.l('2') = 2;
x.l('3') = 1;
x.l('4') = -2;
x.l('5') = -2;

$ifI가 "%슬롯nlp%"가 아니면==BARON $exit

옵션 limCol = 0, limRow = 0;

* 최소한 세 가지 국소 최적 솔루션이 있습니다.
* 52.90257967
* 27.87190522
* 0.02931083 글로벌

$onEcho > baron.opt
숫자솔 3
아이솔톨 1
gdx아웃 mhw4dxx
$offEcho

라이트.opt파일 = 1;
라이트.optCa = 100;
m을 최소화하는 nlp를 사용하여 wright를 해결합니다.

세트
   솔셋 / mhw4dxx1, mhw4dxx2, mhw4dxx3 /
   asolset(solset) '솔버에서 찾은 해';

변수 mall(solset), xall(solset,i);

'gdxmerge mhw4dxx*.gdx > "%슬롯scrdir%merge.%슬롯scrext%"'를 실행합니다.
Execute_load 'merged.gdx', asolset = merged_set_1, mall = m, xall = x;

옵션 소수 = 8;
mall.l, xall.l을 표시합니다.

$eolCom //

스칼라 tol / 1e-4 /;

* BARON이 반환한 솔루션의 타당성을 확인하세요.
루프(솔세트,
   m.l = mall.l(asolset);
   x.l(i) = xall.l(asolset,i);
   중단$(abs(m.l - sqr(x.l('1') - 1) - sqr(x.l('1') - x.l('2')) - power(x.l('2') - x.l('3'),3)
                  - power(x.l('3') - x.l('4'),4) - power(x.l('4') - x.l('5'),4)) > tol) '기능이 잘못되었습니다';
   abort$(abs(x.l('1') + sqr(x.l('2')) + power(x.l('3'),3) - 3*sqrt(2) - 2) > tol) 'e1이 잘못되었습니다.';
   abort$(abs(x.l('2') - sqr(x.l('3')) + x.l('4') - 2*sqrt(2) + 2) > tol) 'e2가 잘못되었습니다.';
   abort$(abs(x.l('1')*x.l('5') - 2) > tol) 'e3이 잘못되었습니다.';
);