scensol1.gms : 기본 시나리오 솔버 테스트

설명

기고자: Michael Bussieck

소형 모델 유형 :슬롯 무료체험


카테고리 : 슬롯 무료체험 테스트 라이브러리


메인 파일 : scensol1.gms

$title 기본 GUSS 테스트(SCENSOL1,SEQ=407)

$onText
기여자: Michael Bussieck
$offText

세트
     i 통조림 공장 / 시애틀, 샌디에이고 /
     j 마켓 / 뉴욕, 시카고, 토피카 / ;

매개변수

     a(i) 경우에 따라 공장 i의 생산 능력
       /시애틀 350
            샌디에이고 600 /

     b(j) 다음과 같은 경우 시장 j의 수요
       / 뉴욕 325
            시카고 300
            토피카 275 / ;

테이블 d(i,j) 거리(천 마일)
                  뉴욕 시카고 토피카
    시애틀 2.5 1.7 1.8
    샌디에고 2.5 1.4 ;

스칼라 f 운임(1,000마일당 케이스당 달러) /90/ ;

매개변수 c(i,j) 운송 비용(케이스당 수천 달러) ;

         c(i,j) = f * d(i,j) / 1000 ;

변수
     x(i,j) 케이스의 배송 수량
     z 총 운송 비용(단위: 수천 달러);

양수 변수 x ;

방정식
     비용 정의 목적 함수
     공급(i) 공장 i의 공급 제한을 준수합니다.
     수요(j)는 시장 j의 수요를 충족시킵니다.

비용 .. z =e= sum((i,j), f * d(i,j) / 1000 *x(i,j)) ;

공급(i) .. sum(j, x(i,j)) =l= a(i) ;

수요(j) .. sum(i, x(i,j)) =g= b(j) ;

방정식 e 더미 n 행;  즉.. sum((i,j), x(i,j)) =n= 3;

모델 전송 /all/ ;

* DICT 세트는 3차원으로 구성됩니다.
* 1 모델 기호
* 2 액션 유형
* 3 업데이트 매개변수
* DICT는 데이터 문으로 지정되어야 합니다.

dict / s.scenario 를 설정하세요. ''
             오.   .srep 선택
             디.   매개변수 .ds
             가.   매개변수 .as
             x.   상위 .xup
             에프.   매개변수 .fs
             비용.한계.x비용
             x.   레벨 .xx /

* 문제:
* 1 QCP는 작동하지 않으며 MCP, MPECS도 작동하지 않습니다.

sX /s1*s10/ 설정;
$어두움을 설정하지 않은 경우 $set 희미함 1
$ifE (%dim%>3)or(%dim%<1) $abort 희미함은 1~3이어야 합니다.

$if %dim%==1 $set s "sX" 세트 sx #SX
$if %dim%==2 $set s "sX,sX" 세트 sx #SX:#SX
$if %dim%==3 $set s "sX,sX,sX" 세트 sx #SX:#SX:#SX

s(%s%) /%sx%/ 설정;

매개변수
    d에 대한 ds(%s%,i,j) 업데이트 프로그램
    에 대한(%s%,i) 업데이트 프로그램으로
    x.up용 xup(%s%,i,j) 업데이트 프로그램
    f에 대한 fs(%s%) 업데이트 프로그램
    한계 비용에 대한 xcost(%s%) 수집기
    xx(%s%,i,j) x 레벨에 대한 수집기

$eolCom //
ma GUSS 모델 속성 설정 / system.GUSSModelAttributes /;
매개변수
    o(*) GUSS 옵션
       / OptfileInit 0 // 초기 해석을 위한 해석기 옵션 읽기
         Optfile 0 // 연속적인 해결을 위한 솔버 옵션 읽기
         LogOption 0 // 0 - 보통 로그(기본값)
                          // 1 - 최소 로그
                          // 2 - 상세 로그
         NoHotStart 0 // 솔버에서 핫 스타트 기능을 비활성화합니다.
                          // 핫스타트 지원
         NoMatchLimit 0 // 일치하지 않는 시나리오 레코드의 제한(기본값 0)
         RestartType 0 // 시나리오의 재시작 지점을 결정합니다.
                          // 0 - 마지막 솔루션에서 다시 시작(기본값)
                          // 1 - 기본 사례의 솔루션에서 다시 시작
                          // 2 - 입력 지점에서 다시 시작
         SkipBaseCase 0 // 기본 사례를 해결하기 위한 스위치
         SolveEmpty 0 // 해결된 빈 시나리오의 한계,
                          // 이후 시나리오는 건너뜁니다(기본값 0).
         UpdateType 0 // 시나리오 업데이트 메커니즘:
                          // 0 - 모든 것을 0으로 설정하고 변경 사항을 적용합니다(기본값)
                          // 1 - 기본 사례를 재설정하고 변경 사항을 적용합니다.
                          // 2 - 마지막 시나리오를 기반으로 빌드하고 변경 사항을 적용합니다.
       /
    srep(%s%,ma) 솔루션 속성 / #s.(ModelStat na, SolveStat na, ObjVal na) /;

ds(s,i,j) = max(0,uniform(-5,2)) + eps;
as(s,i) = a(i)*(1+normal(0.05,0.1));
xup(s,i,j) = 균일(120,300);
fs(s) = 균일(80,100);

$if 설정: $goTo %goto%

* 거스 실행
$라벨 scensl1
z 시나리오 dict를 최소화하는 lp를 사용하여 전송을 해결합니다.

* 라이센스 오류(글로벌 솔버)가 발생하면 그냥 종료하세요.
if(transport.modelstat=%modelStat.licensingProblem%,
    abort.noerror '전역 솔버에 비해 너무 큼');

xx, xcost를 표시합니다.
$if 설정 시 $exit로 이동

매개변수 repsl1(%s%,ma); repsl1(s,ma)$srep(s,ma) = srep(s,ma);
repsl1(s,'objval')$(repsl1(s,'modelstat')<>1) = 0;

* 계산된 obj가 objval과 일치하는지 확인합니다.
매개변수 xdiff(%s%);
xdiff(s)$repsl1(s,'objval') = round(repsl1(s,'objval') - sum((i,j), fs(s) * ds(s,i,j) / 1000 *xx(s,i,j)),4);
중단$카드(xdiff) xdiff, repsl1, fs, ds, xx;

* 이제solvelink %solveLink.loadLibrary%를 사용하여 GUSS를 실행합니다.
$라벨 scenl5
옵션solvelink=%solveLink.loadLibrary%;
z 시나리오 dict를 최소화하는 lp를 사용하여 전송을 해결합니다.
$if 설정 시 $exit로 이동
매개변수 repsl5(%s%,ma); repsl5(s,ma)$srep(s,ma) = srep(s,ma);
repsl5(s,'objval')$(repsl5(s,'modelstat')<>1) = 0;

* 계산된 obj가 objval과 일치하는지 확인합니다.
xdiff(s)$repsl5(s,'objval') = round(repsl5(s,'objval') - sum((i,j), fs(s) * ds(s,i,j) / 1000 *xx(s,i,j)),4);
중단$카드(xdiff) xdiff, repsl5, fs, ds, xx;

* 전통적인 방식으로 이것을 실행하십시오:
$label 게임
옵션 limrow=0, limcol=0, solprint=silent;
매개변수 리피터;
루프(들,
   d(i,j) = ds(s,i,j);
   a(i) = as(s,i);
   x.up(i,j) = xup(s,i,j);
   f = fs(들);
   z를 최소화하는 lp를 사용하여 전송을 해결합니다.
   repiter(s,'modelstat') = Transport.modelstat;
   repiter(s,'solvestat') = Transport.solvestat;
   if(transport.modelstat = %modelStat.optimal%,
      repiter(s,'objval') = Transport.objval));

$if 설정 시 $exit로 이동

매개변수 대표; 별칭(*,u);

ma1(ma) / modelstat,solvstat, objval / 설정;
repdiff(s,ma1) = round(repiter(s,ma1) - repsl1(s,ma1),5);
abort$card(repdiff) 'iter와 sl1이 다름', repdiff, repiter, repsl1;

repdiff(s,ma1) = round(repiter(s,ma1) - repsl5(s,ma1),5);
abort$card(repdiff) 'iter와 sl5가 다름', repdiff, repiter, repsl5;