sipres.gms : 우변 제한을 통한 반무한 프로그램의 전역 슬롯 머신화

설명

이 모델은 다음의 글로벌 솔루션을 위한 알고리즘을 제공합니다.
볼록성 가정이 없는 반무한 프로그램(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 /;);