5wsInfo = 무료 슬롯control.WorkspaceInfo();
6wsInfo.systemDirectory = varargin1;
7ws = 무료 슬롯control.Workspace(wsInfo);
9ws = 무료 슬롯control.Workspace();
16 'sub_tour 제거 제약 조건은 Python에 의해 생성됩니다.'
17 '스크립트. MIP는 계속해서 해결되지만 무료 슬롯는 '
18 'n개의 컷이 추가된 후에만 모델을 생성합니다. '
22 '$tspdata를 설정하지 않은 경우 $abort ''tspdata가 설정되지 않음'' '
26 '별칭 (ii,jj),(i,j,k); '
28 '매개변수 c(ii,jj) 거리 행렬; '
33 '$nrCities를 설정하지 않은 경우 $set nrCities 20'
34 'i(ii)$(ord(ii) < %nrCities%) = 예; '
36 '변수 x(ii,jj) 결정 변수 - 여행 구간 '
38 '이진변수 x; x.fx(ii,ii) = 0; '
41 ' rowsum(ii) 각 도시를 한 번만 떠나세요 '
42 ' colsum(jj)는 각 도시에 한 번만 도착합니다. '
44 '* 할당 문제는 무료 슬롯의 완화입니다. '
45 '목적.. z =e= sum((i,j), c(i,j)*x(i,j)); '
46 'rowsum(i).. sum(j, x(i,j)) =e= 1; '
47 'colsum(j)..sum(i, x(i,j)) =e= 1; '
49 '$cmax를 설정하지 않은 경우 $set cmax 2 '
52 ' acut(무료 슬롯ii,jj) 절단 제약 행렬 '
53 ' rhscut(무료 슬롯) 제약 조건을 잘라냅니다. rhs; '
55 'equation sscut(무료 슬롯) sub_tour 제거 컷; '
56 'sscut(무료 슬롯).. sum((i,j), Acut(무료 슬롯i,j)*x(i,j)) =l= RHScut(무료 슬롯); '
58 'cc(컷) 이전 컷 설정; cc(컷) = 아니오; '
59 '$if set cutdata 실행_로드 ''%cutdata%'', 참조, Acut, RHScut; '
61 'Acut(무료 슬롯i,j)$(cc(무료 슬롯) 아님) = eps; '
62 'RHScut(컷)$(cc(컷) 아님) = 카드(ii); '
67모델 = 스프린트f(
'%s\n', 모델:);
69모델 인스턴스에 추가할 수 있는 컷 수 %
73% 삭감 한도
for현재 모델 인스턴스(cmax = curCut + cutsPerRound)
76생성된 모든 컷을 수집하는 데 사용되는 데이터베이스 %
77cutData = ws.addDatabase();
78cc = cutData.addSet(
'cc', 1,
'');
79acut = cutData.addParameter(
'아컷', 3,
'');
80rhscut = cutData.addParameter(
'rhscut', 1,
'');
82% 도시 목록(i1, i2, i3, ...)
87% 생성
신규컷 제한에 도달한 경우의 모델 인스턴스
90cMax = curCut + cutsPerRound;
94tspJob = ws.addJobFromString(모델);
95cp = ws.addCheckpoint();
97opt.defines(
'nrcities',
'20');
98opt.defines(
'cmax', int2str(cMax - 1));
99opt.defines(
'컷데이터', cutData.name);
101%는에서 입력 데이터를 읽었습니다.
'무료 슬롯gdx'
102opt.defines(
'tspdata', [
'"', 전체 파일(ws.systemDirectory,
'API파일',
'데이터',
'무료 슬롯gdx'),
'"']);
107 fori = tspJob.outDB.getSet(
'나').기록
112% 수정자 miAcut 및 miRhscut을 사용하여 모델 인스턴스를 인스턴스화
113mi = cp.addModelInstance();
114miAcut = mi.syncDB.addParameter(
'아컷', 3,
'');
115miRhscut = mi.syncDB.addParameter(
'rhscut', 1,
'');
116수정자 = 무료 슬롯control.Modifier(miAcut), 무료 슬롯control.Modifier(miRhscut);
117mi.instantiate(
'mip min z 사용 할당', 수정자);
122% 모델 인스턴스 해결
사용 중업데이트 유형을 누적하고 이후에 acut 및 rhscut 삭제
123mi.solve(무료 슬롯control.globals.SymbolUpdateType.ACCUMULATE);
124mi.syncDB.getParameter(
'아컷').clear();
125mi.syncDB.getParameter(
'rhscut').clear();
127%는 솔루션에서 그래프 정보를 수집합니다.
132 ifmi.syncDB.getVariable(
'x').findRecord(i1,j1).level > 0.5
138% 모든 하위 투어를 찾고 acut 및 rhscut을 수정하여 필요한 컷을 추가합니다.
139 그동안numel(방문하지 않음) ~= 0
142 그동안~strcmp(graph(ii), 방문하지 않음1)
147 fori = numel(notVisited):-1:1
148for j = 1:numel(subTour)
149if strcmp(notVisitedi, subTourj)
156% 두 데이터베이스에 컷 추가(cutData, mi.SyncDB)
159키 = ['c', int2str(curCut)], i1, j1;
160rec = acut.addRecord(keys);
162rec = miAcut.addRecord(keys);
167키 = ['c', int2str(curCut)];
168rec = rhscut.addRecord(키);
169rec.value = numel(subTour) - 0.5;
170rec = miRhscut.addRecord(키);
171rec.value = numel(subTour) - 0.5;
176 ifnumel(subTour) >= numel(n)
181fprintf(
'\nz=%g\n', mi.syncDB.getVariable(
'z').record.level);
182fprintf(
'sub_tour: ');
184fprintf(
'%s -> ', 나1);
186fprintf(
'%s\n', 하위 둘러보기1);