설명
transmcp를 기반으로 하며 다양한solvLink 값에 대한 '부호 뒤집기'를 테스트합니다. 기여자: Alex
소형 모델 유형 :슬롯
카테고리 : 슬롯 테스트 라이브러리
메인 파일 : mcp10.gms
$title 슬롯 모델(음수 equ.var 포함)(MCP10,SEQ=604)
$onText
transmcp를 기반으로 하며 다양한solvLink 값에 대한 '부호 뒤집기'를 테스트합니다.
기여자: 알렉스
$offText
세트
i 통조림 공장 / 시애틀, 샌디에이고 /
j 마켓 / 뉴욕, 시카고, 토피카 / ;
매개변수
a(i) 경우에 따라 공장 i의 생산 능력(가격이 단일인 경우)
/시애틀 350
샌디에이고 600 /,
b(j) 경우에 시장 j의 수요(가격이 1일 때)
/ 뉴욕 325
시카고 300
토피카 275 /,
esub(j) 수요의 가격 탄력성(가격이 1과 동일할 때)
/ 뉴욕 1.5
시카고 1.2
토피카 2.0 /;
* 공급 제약에 대해 0이 아닌 PI를 얻기 위해 거리를 변경했습니다.
테이블 d(i,j) 거리(천 마일)
뉴욕 시카고 토피카
시애틀 2.5 1.7 1.8
샌디에이고 52.5 31.8 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), c(i,j)*x(i,j)) ;
공급(i) .. sum(j, x(i,j)) =l= a(i);
수요(j) .. sum(i, x(i,j)) =g= b(j) ;
* 슬롯에 필요한 새로운 equs 및 vars
긍정적인 변수
w(i) 공급 노드 i의 그림자 가격,
p(j) 수요 노드 j의 그림자 가격;
방정식
공급x(i) 방향이 재설정된 방정식
이익(i,j) 영 이익 조건;
이익(i,j).. w(i) + c(i,j) =g= p(j);
Supplyx(i).. a(i) =g= sum(j, x(i,j));
* 방정식-변수의 사양을 포함하는 모델 선언
* 연관:
모델 운송 / 비용, 공급, 수요 /
거래 / 비용, 공급x, 수요 /
transmcp /profit.x,-supply.w,demand.p/
transmcpX / 이익.x, 공급x.w, 수요.p/ ;
세트 실행 / lp,lpX,mcpX,0*6,13 'sl=3이지만 Readycollect 사용' /
슬링크(실행) / 0*6,13 /;
매개변수 담당자(i,runs) 공급 한계에 대한 Q&D 요약 보고서;
옵션 limcol=0,limrow=0;
운송 min z us lp를 해결하십시오.
담당자(i,'lp') = -supply.m(I);
transx us lp min z를 풀어보세요;
담당자(i,'lpX') = 공급x.m(I);
transmcpx us 슬롯를 해결하십시오.
담당자(i,'mcpX') = 공급x.m(I);
옵션 solprint=off;
$ontext
주의: 선택한solvLink 값으로 실행할 수 없는 솔버의 경우,
CMEX는 필요에 따라solvLink 값을 재설정합니다.
사용된 값(재설정 후)은 <modelname>.linkUsed에서 확인할 수 있습니다.
새로운 코드는 그리드 해석(solveLink=3)에도 ReadyCollect를 사용해야 합니다.
하지만 이전 스타일의 수면 루프는 여전히 작동하며 이전 코드에서 사용됩니다.
$offtext
스칼라
핸들, 카운트, RC
useOldCollect '오래된 투박한 수면 루프 사용'
useNewCollect '더 새롭고 더 나은 ReadyCollect를 사용하세요'
;
루프 스링크,
transmcp.solveLink = mod(slink.val,10);
x.l(i,j) = 0;
이익.m(i,j) = 0;
공급.m(i) = 0;
transmcp를 우리 슬롯로 해결하십시오.
useOldCollect = (transmcp.linkUsed = 3) 및 (slink.val < 10);
useNewCollect = (transmcp.linkUsed = 6) 또는 (slink.val > 10);
transmcp.solveLink, transmcp.linkUsed, useOldCollect, useNewCollect를 표시합니다.
if useOldCollect,
핸들 = transmcp.handle;
개수 = 0;
while handlecollect(처리)가 아님,
abort.noError$[count >= 50] '기다렸지만 그리드 해석이 완료되지 않았습니다.';
개수 = 개수 + 1;
display$sleep(0.1) '0.1초 동안 자고 있었습니다', count;
;
display$handledelete(handle) '핸들 삭제 문제';
;
if useNewCollect,
핸들 = transmcp.handle;
rc = ReadyCollect(핸들,5);
abort.noError$[4=rc] '멀티 스레드 해결을 기다렸지만 사용자 시간 초과에 도달했습니다.';
abort.noError$[5=rc] '그리드 해석을 기다렸지만 사용자 시간 초과에 도달했습니다.';
abort$rc '멀티 스레드 또는 그리드 해석이 잘못 반환될 때까지 기다리세요', rc;
abort$[0=handlecollect(handle)] '모델 솔루션 수집 오류';
display$handledelete(handle) '핸들 삭제 문제';
;
담당자(i,slink) = 공급.m(I);
;
디스플레이 담당자;
매개변수 repx(i,runs)는 허용오차를 초과합니다.
repx(i,runs) = max(0,abs(rep(i,runs)-rep(i,'lp'))-1e-6);
디스플레이 repx;
abort$card(repx) '여백이 잘못되었습니다.';