설명
이것은 방법을 보여주는 일련의 예 중 두 번째입니다. 크레이지 슬롯/CONOPT와 함께 외부 방정식(=X=) 기능을 사용합니다. 두 번째 모델 역시 단순 비제약 2차 모델입니다. 이차 함수는 외부 방정식으로 정의됩니다. 하지만 이번에는 Put 파일을 통해 크레이지 슬롯의 데이터를 전달합니다. 모델의 크기에 대한 정보를 포함합니다. 이제 우리는 바꿀 수 있어요 Fortran이나 C 루틴을 다시 프로그래밍하지 않고도 크레이지 슬롯의 데이터를 사용할 수 있습니다. 모델이 약간 복잡해졌습니다. 우리는 해결할 수 있기를 원합니다 도메인 D의 다른 하위 집합 I에 대한 것입니다.
소형 모델 유형 :크레이지 슬롯
카테고리 : 크레이지 슬롯 테스트 라이브러리
메인 파일 : ex2.gms
$title 외부 방정식 - 예 2 (EX2,SEQ=565)
$offSymList offsymxref
$onText
이는 방법을 보여주는 일련의 예제 중 두 번째입니다.
크레이지 슬롯/CONOPT와 함께 외부 방정식(=X=) 기능을 사용합니다.
두 번째 모델 역시 단순 비제약 2차 모델입니다.
이차 함수는 외부 방정식으로 정의됩니다.
하지만 이번에는 Put 파일을 통해 크레이지 슬롯의 데이터를 전달합니다.
모델의 크기에 대한 정보를 포함합니다. 이제 우리는 바꿀 수 있어요
Fortran이나 C 루틴을 다시 프로그래밍하지 않고도 크레이지 슬롯의 데이터를 사용할 수 있습니다.
모델이 약간 복잡해졌습니다. 우리는 해결할 수 있기를 원합니다
도메인 D의 다른 하위 집합 I에 대한 것입니다.
$offText
변수 / i1*i14 /에 대해 D 도메인을 설정합니다.
실제 최적화를 위해 I(D) 하위 집합을 설정합니다.
별칭 (D,E), (i,j);
모수 Q(D,D) 공분산 행렬
X0(D) 목표;
Q(D,E) = power(0.5, abs(ord(D)-ord(E)) );
X0(D) = ord(D) / 카드(D);
Q, x0을 표시합니다.
변수 x(D), z;
방정식 zdef, zdefX;
* 7개 요소를 보유하는 첫 번째 해결 방법으로 I를 정의합니다.
I(D) = yes$(ord(D) le 7);
* 크레이지 슬롯에서 구현된 원하는 방정식은 다음과 같습니다.
zdef..sum (i,j),
(x(i)-x0(i)) * Q(i,j) * (x(j)-x0(j))
=e=z;
* 다음과 같이 외부 방정식으로 구현됩니다.
zdefX.. sum D$I(D), ord(D)*x(D) + (카드(I)+1)* z =X= 1;
$onText
자세한 내용은 ex1.gms의 설명을 참조하세요.
나는 이제 동적이므로 방정식에서 I 대신 D를 사용합니다.
설정하고 ord(I)를 사용할 수 없습니다.
이제 세트 I의 크기와 모델 데이터가 기록됩니다.
PUT 문을 사용하여 ex2.put 파일. 우리는 다음으로 끝납니다.
파일을 읽을 때 파일이 닫히도록 하는 putclose 문
외부 모듈에서.
$offText
파일 f / ex2.put /; f.nw = 0; f.nd = 13;
f.nr = 0; f 카드 넣기(i):0:0 /; f.nr = 2;
루프 나,
x0(i)를 넣어 /;
루프 j,
q(i,j)를 넣어 /;
;
;
닫다 f;
$ 미리 설정
$ifI %system.filesys%==unix $set pre 'lib'
$ 세트 '64'
$set N ex2
$set c_cbN %pre%%N%c_cb%suf%
$set d_cbN %pre%%N%d_cb%suf%
$set f_cbN %pre%%N%f_cb%suf%
모델 %N% '크레이지 슬롯 구현' / zdef /;
model %c_cbN% '콜백이 포함된 C의 외부 방정식' / zdefX /;
model %d_cbN% '콜백이 포함된 Delphi의 외부 방정식' / zdefX /;
model %f_cbN% '콜백이 포함된 F77의 외부 방정식' / zdefX /;
옵션 limcol = 0;
$onText
예상 결과를 비교하는 요약 테이블을 만듭니다.
x0에 실제 결과 x.l을 추가하여 데이터가
외부 방정식에 올바르게 전달됩니다.
$offText
매개변수 보고서(*,*,*) '솔루션 요약';
옵션 보고서:5;
스칼라 totdist /0/;
* 동일한 코드를 여러 번 재사용
$onEchoV > runme.gms
z.l = 0;
z.m = 0;
x.l(i) = 0;
x.m(i) = 0;
zdef.l = 0;
zdef.m = 0;
z를 최소화하는 nlp를 사용하여 %1을 해결합니다.
abort$(%1.solvestat %2) '%1 모델 실행에 문제가 있습니다';
실행 오류 = 0;
Report('Solve','Stat', '%1') = %1.solvestat;
Report('모델','Stat', '%1') = %1.modelstat;
Report(i,'대상', '%1') = x0(i);
보고서(i,'값', '%1') = x.l(i);
보고서(i,'거리','%1') = abs(x.l(i) - x0(i));
totdist = totdist + sum(i,abs(x.l(i) - x0(i)));
$offEcho
$ 확장 '.dll' 설정
$ifI %system.filesys%==unix $set ext '.so'
$ifI %system.platform%==dex $set ext '.dylib'
$ifI %system.platform%==dax $set ext '.dylib'
$ 세트 eq
$ifI %system.filesys%==unix $set eq "'"
$if set runall $set runC_cb '1' set runD_cb '1' set runF_cb '1'
$ifThen nocomp를 설정하지 않음
$ ifI set runC_cb $call 크레이지 슬롯 complink lo=%크레이지 슬롯lo% --lang=c --files=ex2c_cb.c --libname=%c_cbN%%ext%
$ 오류 수준 1인 경우 $abort C 라이브러리 컴파일 오류
$ ifI set runD_cb $call 크레이지 슬롯 complink lo=%크레이지 슬롯lo% --lang=Delphi --files=ex2d_cb.dpr
$ 오류 수준 1인 경우 $abort 델파이 라이브러리 컴파일 오류
$ ifI set runF_cb $call 크레이지 슬롯 complink lo=%크레이지 슬롯lo% --lang=fortran90 --files=%eq%"gehelper.f90 msg2_f.f90 ex2f_cb.f90"%eq% --libname=%f_cbN%%ext%
$ 오류 수준 1인 경우 $abort Fortran90 라이브러리 컴파일 오류
$endIf
$ batInclude runme %N% '<> 1'
$if set runC_cb $batInclude runme %c_cbN% '<> 1'
$if set runD_cb $batInclude runme %d_cbN% '<> 1'
$if set runF_cb $batInclude runme %f_cbN% '<> 1'
보고서 표시;
if ((totdist < 1.0E-6),
"@@@@ #테스트에 통과했습니다."를 표시합니다.
그렇지 않으면
abort totdist, "@@@@ #테스트가 통과되지 않았습니다. 자세한 내용은 ex2.lst를 검사하세요.";
);
$onText
이제 14개 요소를 모두 보유하도록 I를 정의합니다. 이는 다음을 야기해야 합니다.
10개의 요소에 대한 공간만 할당했기 때문에 오류가 발생했습니다.
포트란과 델파이 루틴.
C 버전은 메모리를 동적으로 할당하고 올바르게 작동합니다.
$offText
나(D) = 그렇습니다;
$onText
쓰기 위해 PUT 파일을 다시 열면 기본적으로
덮어쓰려면 다음이 필요합니다.
$offText
* 새 데이터와 빈 보고서로 다시 시작
f.nr = 0; f 카드 넣기(i):0:0 /; f.nr = 2;
루프 나,
x0(i)를 넣어 /;
루프 j,
q(i,j)를 넣어 /;
;
;
닫다 f;
옵션 지우기 = 보고;
토트디스트 = 0;
$ batInclude runme %N% '<> 1'
$if set runC_cb $batInclude runme %c_cbN% '<> 1'
$if set runD_cb $batInclude runme %d_cbN% ' = 1'
$if set runF_cb $batInclude runme %f_cbN% ' = 1'
보고서 표시;