mcp09.gms : 무한 범위로 불평등 테스트

설명

이것은 동등한 보완성 모델을 보여주기 위한 예로 시작되었습니다.
하나는 양수 변수를 사용하고 다른 하나는 "혼합 경계"를 사용합니다.
임의의 하한 및 상한.  달리 말하면 이렇다.
NCP와 MCP를 비교/대조합니다.  그 속에서 잃어버린 것은 아무것도 없어야 한다.
명확성/유지관리성이 향상된 MCP 공식화.

이 예에서는 무한 경계를 사용할 때 문제가 발생했습니다.
상보성 문제에 대한 불평등.

이 예에서는 최적화 문제에 대한 KKT 시스템을 생각해 보세요.
  최소 제곱(x-c)
  성   L <= x <= U

기고자: Steve Dirkse, 2009년 3월

소형 모델 유형 :MCP


카테고리 : 슬롯 테스트 라이브러리


메인 파일 : mcp09.gms

$title 무한 범위의 부등식 테스트(MCP09,SEQ=440)

$onText
이는 등가 상보성 모델을 보여주기 위한 예시로 시작되었으며,
하나는 양의 변수를 사용하고 다른 하나는 "혼합 경계"를 사용합니다.
임의의 하한 및 상한.  다르게 말하면 이
NCP와 MCP를 비교/대조합니다.  그 속에서 잃어버린 것은 아무것도 없어야 한다.
명확성/유지관리성이 향상된 MCP 공식화.

이 예에서는 무한 경계를 사용할 때 문제가 발생했습니다.
상보성 문제에 대한 불평등.

이 예에서는 최적화 문제에 대한 KKT 시스템을 생각해 보세요.
  최소 제곱(x-c)
  성   L <= x <= U

기고자: Steve Dirkse, 2009년 3월
$offText

스칼라
  c / 3 /
  엘, 유;

변수 z '임의의 경계';
양의 변수 x, loSlack, upSlack;
* L >= 0이면 x를 >= 0으로 둘 수 있습니다.

방정식
  f 'MCP 기능'
  g 'NCP 기능'
  loBound, 업바운드;
  ;

f..2*(z-c) =N= 0;
g.. 2*(x-c) - loSlack + upSlack =G= 0;
loBound.. x =G= L;
업바운드.. U =G= x;

모델 ncp 'NCP 버전' / g.x, loBound.loSlack, upBound.upSlack /;
모델 m 'MCP 버전' / f.z /;

세트
  사례 / c1 * c7 /
  루프 / L, U /;
테이블 BND(케이스, 루프)
         루
c1 4 5
c2 1 2
c3 2 4
c4 4 1e4
c5 -1e4 2
c6 4 inf
c7 -inf 2
;
매개변수
  보고(건수,*,*)
  diff(케이스,*);
별칭(v,*);

루프 케이스,
  L = bnds(cases,'L');
  U = bnds(cases,'U');
  z.lo = L;
  z.up = U;
  mcp를 사용하여 m을 해결합니다.
  abort$[m.modelstat <> %modelStat.optimal%] 'MCP를 해결하는 잘못된 modelstat';
  abort$[m.solvestat <> %solveStat.normalCompletion%] '잘못된solvestat 해결 MCP';
  보고서(케이스,'mcp','xLev') = z.l;
  Report(cases,'mcp','loSlack') = max( z.m,0);
  Report(cases,'mcp','upSlack') = max(-z.m,0);
  mcp를 사용하여 ncp를 해결합니다.
  abort$[ncp.modelstat <> %modelStat.optimal%] 'NCP를 해결하는 잘못된 modelstat';
  abort$[ncp.solvestat <> %solveStat.normalCompletion%] '잘못된solvestat 해결 NCP';
  보고서(케이스,'ncp','xLev') = x.l;
  보고서(케이스,'ncp','loSlack') = loSlack.l;
  보고서(케이스,'ncp','upSlack') = upSlack.l;
;

diff(cases,v) = abs(report(cases,'ncp',v) - 보고서(cases,'mcp',v));
디스플레이 bnds, 보고서, diff;
abort$[smax(cases,v), diff(cases,v) > 1e-6] '다른 결과';