설명
이 테스트를 통해 우리는 추가 업데이트 기록이 있는 모델 인스턴스를 테스트하고 전체 업데이트 프로그램이 성공하더라도 성공할 만큼 충분히 큰 no_match_limit를 사용합니다. 모델에서 쫓겨났습니다. 기고자: Michael Bussieck, 2021년 3월
소형 모델 유형 :슬롯 나라
카테고리 : 슬롯 나라 테스트 라이브러리
메인 파일 : embpy07.gms
$title 모델 인스턴스에 대한 테스트 no_match_limit (embpy07,SEQ=859)
$onText
이 테스트를 통해 추가 업데이트 레코드가 있는 모델 인스턴스를 테스트하고
전체 업데이트 프로그램이 성공하더라도 성공할 만큼 충분히 큰 no_match_limit를 사용합니다.
모델에서 쫓겨났습니다.
기고자: Michael Bussieck, 2021년 3월
$offText
$log --- Python 라이브러리 %sysEnv.GMSPYTHONLIB% 사용
세트
i '통조림 식물' / 시애틀, 샌디에이고 /
j 'markets' / 뉴욕, 시카고, 토피카 /;
매개변수
a(i) '경우에 따라 식물 i의 용량'
/시애틀 350
샌디에이고 600 /
b(j) '경우에 따라 시장 j의 수요'
/ 뉴욕 325
시카고 300
토피카 275 /;
테이블 d(i,j) '거리(천 마일)'
뉴욕 시카고 토피카
시애틀 2.5 1.7 1.8
샌디에고 2.5 1.8 1.4;
스칼라 f '1,000마일당 케이스당 운임(달러)' / 90 /;
매개변수 c(i,j) '케이스당 운송 비용(단위: 수천 달러)';
c(i,j) = f*d(i,j)/1000;
매개변수 pen(*) / #j 999, doesNotExist 999 /, useShort /1/;
변수
x(i,j) '케이스의 선적 수량'
short(j) '공급 여유'
z '총 운송 비용(천 달러)';
양수 변수 x;
방정식
비용 '목적 함수 정의'
Supply(i) '공장 i의 공급 제한을 준수합니다.'
수요(j) '시장 j의 수요를 충족';
비용.. z =e= sum((i,j), c(i,j)*x(i,j)) + sum(j, short(j)*pen(j))$useShort;
공급(i).. sum(j, x(i,j)) =l= a(i);
수요(j).. sum(i, x(i,j)) =g= b(j) - short(j)$useShort;
모델 운송 / 모두 /;
'실행할 시나리오' 설정 / base, run1, run2 /;
테이블 newsupply(s,i) '(용량)에 대한 업데이트 프로그램'
시애틀 샌디에고
베이스 350 600
실행1 300 650
실행2 400 550;
테이블 newdemand(s,j) 'b(수요)에 대한 업데이트'
뉴욕 시카고 토피카
베이스 325 300 275
실행1 325 300 275
실행2 350 300 250;
$set 솔버로그
$if set useSolverLog $setsolverlog 출력=sys.stdout
임베디드 코드 Python:
defsolvMI(mi, SymIn=[], SymOut=[], nomatchlimit=0):
SymIn의 Sym에 대해:
슬롯 나라db[sym].copy_symbol(mi.sync_db[sym])
miopt = GamsModelInstanceOpt(no_match_limit = nomatchlimit)
mi.solve(mi_opt=miopt)
SymOut의 Sym에 대해:
시도해 보세요:
슬롯 나라db[sym].clear() # Sym에 대해 "writerTo" 플래그가 설정되었는지 확인하기 위해 기호를 명시적으로 지웁니다.
mi.sync_db[sym].copy_symbol(슬롯 나라db[sym])
제외:
통과
일시중지임베디드코드
abort$execerror '파이썬 오류입니다. 로그를 확인하세요';
$libInclude pyEmbMI tMI 'transport us lp min z' -all_model_types=cplex a.Zero b.Zero pen.Zero
useShort = 0;
$libInclude pyEmbMI tMInoShort 'lp min z 전송' -all_model_types=cplex a.Zero b.Zero pen.Zero
매개변수 repX 'x 레벨에 대한 수집기';
루프(들,
a(i) = 뉴스공급(s,i);
b(j) = 새로운 수요(s,j);
계속임베디드코드:
solvMI(tMI,['a','b','pen'],['x']) # 펜에 추가 uel "doesnoexist"가 있기 때문에 실패합니다.
일시 중지EmbeddedCode x
);
abort$(execerror=0) '실행 오류가 예상됩니다';
실행 오류 = 0;
루프(들,
a(i) = 뉴스공급(s,i);
b(j) = 새로운 수요(s,j);
계속임베디드코드:
solvMI(tMI,['a','b','pen'],['x'],999) # 추가 uel "doesnotexist" 때문에 nomatchlimit
일시 중지EmbeddedCode x
repX('short',s,i,j) = x.l(i,j);
);
abort$(execerror<>0) '실행 오류가 없을 것으로 예상됩니다.';
루프(들,
a(i) = 뉴스공급(s,i);
b(j) = 새로운 수요(s,j);
계속임베디드코드:
solvMI(tMInoShort,['a','b','pen'],['x']) # 펜을 눌렀기 때문에 nomatchlimit
일시 중지EmbeddedCode x
);
abort$(execerror=0) '실행 오류가 예상됩니다';
실행 오류 = 0;
루프(들,
a(i) = 뉴스공급(s,i);
b(j) = 새로운 수요(s,j);
계속임베디드코드:
solvMI(tMInoShort,['a','b','pen'],['x'],999) # 압착된 펜으로 인해 일치 제한 없음
일시 중지EmbeddedCode x
repX('noshort',s,i,j) = x.l(i,j);
);
abort$(execerror<>0) '실행 오류가 없을 것으로 예상됩니다.';
옵션 담당자X:0:2:2;
대표X 표시;
오류 '빈 솔루션' 설정;
오류(들) = sum((i,j), repX('short',s,i,j)) = 0;
abort$card(error) '일부 시나리오에 대한 솔루션 누락(짧음)', error;
오류(들) = sum((i,j), repX('noshort',s,i,j)) = 0;
abort$card(error) '일부 시나리오에 대한 솔루션 누락(noshort)', 오류;