circlen.gms : 원을 둘러싸는 점 n차원

설명

이것은 슬롯 게임/SNOPT 매뉴얼의 예입니다. 가장 작은 것을 찾아라
주어진 수의 점을 포함하는 원. 이는 다음으로 확장됩니다.
n차원 공.

https://en.wikipedia.org/wiki/Smallest_circle_problem

소형 모델 유형 :NLP


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


메인 파일 : circlen.gms

$title 원을 둘러싸는 점 n차원 (CIRCLEN,SEQ=551)
$onText

이는 슬롯 게임/SNOPT 매뉴얼의 예입니다. 가장 작은 것을 찾아라
주어진 수의 점을 포함하는 원. 이는 다음으로 확장됩니다.
n차원 공.

https://en.wikipedia.org/wiki/Smallest_circle_problem

Gill, P E, Murray, W 및 Saunders, MA, 슬롯 게임/SNOPT: SQP 알고리즘
대규모 제약 최적화, 1988.

슬롯 게임 모델 라이브러리의 확장 모델

기여자: Michael Bussieck

$offText

$설정되지 않은 경우 TESTTOL $set TESTTOL 1e-6

$설정되지 않은 경우 DEMOSIZE $set DEMOSIZE 0
$설정되지 않은 경우 GLOBALSIZE $set GLOBALSIZE 0
$%DEMOSIZE%가 아닌 경우 == 0 $set DEMOSIZE 1
$%GLOBALSIZE%가 아닌 경우 == 0 $set GLOBALSIZE 1

$if %DEMOSIZE%%GLOBALSIZE% == 11 $set 희미한 9

$크기가 설정되지 않은 경우 $크기 10으로 설정
$희미하게 설정되지 않은 경우 $set 희미 10
$ifE %dim%>10 $abort 슬롯 게임 함수는 10개 이상의 인수를 가질 수 없습니다.

i 포인트 설정 /p1*p%size%/
    d 치수 /d1*d%dim%/;

* 희미한 값을 기반으로 스칼라 edist 인수 목록 작성
$set 편집 인수 x(i,'d1')-a('d1')
$세트컨트 1
$label addarg
$if %cnt%==%dim% $goTo 계속
$eval cnt %cnt%+1
$set edistarg %edistarg%,x(i,'d%cnt%')-a('d%cnt%')
$goTo 추가 변수
$label 계속

매개변수
   x(i,d) 좌표;

* 무작위 데이터로 채우기
x(i,d) = 균일(1,10);

변수
   a(d) 원의 중심 좌표
   df(i,d) 차이 x와 a
   r 반경
   rx(i) SOCP에 대한 반경 사본;
양의 변수 rx; r.lo=0;

방정식
   e(i) 점은 edist가 있는 원 안에 있어야 합니다.
   e2(i) 점은 sqr 및 sqrt가 있는 원 안에 있어야 합니다.
   ddf(i,d) 차이 정의
   drx(i) r의 복사본을 정의합니다.
   콘(i) SOCP;

e(i)..edist(%edistarg%) =l= r;
e2(i).. sqrt(sum(d, sqr(x(i,d)-a(d)))) =l= r;
ddf(i,d).. df(i,d) =e= a(d) - x(i,d);
drx(i)..rx(i) =e= r;
원뿔(i)..sqr(rx(i)) =g= sum(d,sqr(df(i,d)));

매개변수 xmin(d),xmax(d);
xmin(d) = smin(i, x(i,d));
xmax(d) = smax(i, x(i,d));

* 시작점 설정
a.l(d) = (xmin(d)+xmax(d))/2;
r.l = sqrt(sum(d,sqr(a.l(d)-xmin(d))));

모델 m /e/;
모델 m2 /e2/;
모델 mSOCP /ddf, drx,cone/;

r을 최소화하는 nlp를 사용하여 m을 해결합니다.

if (m.solvestat = %solveStat.capabilityProblems%),
  abort$[m.modelstat <> %modelStat.noSolutionReturned%] '잘못된 상태 코드',
  m.solvestat, m.modelstat;
  abort.NoError '기능 문제';
그렇지 않으면
  if (m.modelstat <> %modelStat.optimal% 및
      m.modelstat <> %modelStat.locallyOptimal% 및
      m.modelstat <> %modelStat.feasibleSolution%,
      '잘못된 상태 코드'를 중단합니다.);

매개변수 repm, repm2, repmSOCP;

repm('r') = r.l;
대표(d) = a.l(d);

* 시작점 재설정
a.l(d) = (xmin(d)+xmax(d))/2;
r.l = sqrt(sum(d,sqr(a.l(d)-xmin(d))));

r을 최소화하는 nlp를 사용하여 m2를 해결합니다.

if (m2.modelstat <> %modelStat.optimal% 및
    m2.modelstat <> %modelStat.locallyOptimal% 및
    m2.modelstat <> %modelStat.feasibleSolution%,
    '잘못된 상태 코드'를 중단합니다.);

repm2('r') = r.l;
repm2(d) = a.l(d);

* 원초값 확인
abort$(abs(repm('r')-repm2('r'))>%TESTTOL%) 'r 다름', repm, repm2;
abort$(sum(d,abs(repm(d)-repm2(d)))>%TESTTOL%) '포인트 다름', repm, repm2;

* SOCP로 풀어보세요
* 시작점 재설정
a.l(d) = (xmin(d)+xmax(d))/2;
r.l = sqrt(sum(d,sqr(a.l(d)-xmin(d))));

r을 최소화하는 qcp를 사용하여 mSOCP를 해결합니다.

* 이는 SOCP 솔버(및 글로벌 솔버)에서만 발생합니다.
if (mSOCP.modelstat = %modelStat.optimal%,
  repmSOCP('r') = r.l;
  repmSOCP(d) = a.l(d);

  abort$(abs(repm('r')-repmSOCP('r'))>%TESTTOL%) 'r 다름', repm, repmSOCP;
  abort$(sum(d,abs(repm(d)-repmSOCP(d)))>%TESTTOL%) '포인트 다름', repm, repmSOCP;
);