로드 중...
검색 중...
일치하는 항목 없음
무료 슬롯m
1함수무료 슬롯(varargin)
2
3% 인수에서 작업공간 정보 확인
4 if나긴 > 0
5wsInfo = 무료 슬롯control.WorkspaceInfo();
6wsInfo.systemDirectory = varargin1;
7ws = 무료 슬롯control.Workspace(wsInfo);
8 그밖에
9ws = 무료 슬롯control.Workspace();
10
11
12모델 =
13 '$Title 여행하는 외판원 문제 '
14 '$Ontext '
15 ' '
16 'sub_tour 제거 제약 조건은 Python에 의해 생성됩니다.'
17 '스크립트. MIP는 계속해서 해결되지만 무료 슬롯는 '
18 'n개의 컷이 추가된 후에만 모델을 생성합니다. '
19 ' '
20 '$Offtext '
21 ' '
22 '$tspdata를 설정하지 않은 경우 $abort ''tspdata가 설정되지 않음'' '
23 ' '
24 '2개 도시 설정'
25 ' i(ii) 도시의 하위 집합 '
26 '별칭 (ii,jj),(i,j,k); '
27 ' '
28 '매개변수 c(ii,jj) 거리 행렬; '
29 ' '
30 '$gdxin %tspdata% '
31 '$load ii c '
32 ' '
33 '$nrCities를 설정하지 않은 경우 $set nrCities 20'
34 'i(ii)$(ord(ii) < %nrCities%) = 예; '
35 ' '
36 '변수 x(ii,jj) 결정 변수 - 여행 구간 '
37 ' z 목적변수; '
38 '이진변수 x; x.fx(ii,ii) = 0; '
39 ' '
40 '방정식 목표 총 비용'
41 ' rowsum(ii) 각 도시를 한 번만 떠나세요 '
42 ' colsum(jj)는 각 도시에 한 번만 도착합니다. '
43 ' '
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; '
48 ' '
49 '$cmax를 설정하지 않은 경우 $set cmax 2 '
50 '컷 설정 /c0*c%cmax%/; '
51 '매개변수'
52 ' acut(무료 슬롯ii,jj) 절단 제약 행렬 '
53 ' rhscut(무료 슬롯) 제약 조건을 잘라냅니다. rhs; '
54 ' '
55 'equation sscut(무료 슬롯) sub_tour 제거 컷; '
56 'sscut(무료 슬롯).. sum((i,j), Acut(무료 슬롯i,j)*x(i,j)) =l= RHScut(무료 슬롯); '
57 ' '
58 'cc(컷) 이전 컷 설정; cc(컷) = 아니오; '
59 '$if set cutdata 실행_로드 ''%cutdata%'', 참조, Acut, RHScut; '
60 ' '
61 'Acut(무료 슬롯i,j)$(cc(무료 슬롯) 아님) = eps; '
62 'RHScut(컷)$(cc(컷) 아님) = 카드(ii); '
63 ' '
64 '모델 할당 /all/; '
65 ' '
66 '옵션 optcr=0; '};
67모델 = 스프린트f('%s\n', 모델:);
68
69모델 인스턴스에 추가할 수 있는 컷 수 %
70cutsPerRound = 10;
71% 현재 삭감
72curCut = 0;
73% 삭감 한도for현재 모델 인스턴스(cmax = curCut + cutsPerRound)
74c최대 = 0;
75
76생성된 모든 컷을 수집하는 데 사용되는 데이터베이스 %
77cutData = ws.addDatabase();
78cc = cutData.addSet('cc', 1,'');
79acut = cutData.addParameter('아컷', 3,'');
80rhscut = cutData.addParameter('rhscut', 1,'');
81
82% 도시 목록(i1, i2, i3, ...)
83n = ;
84하위 투어 = ;
85
86 그동안 사실
87% 생성신규컷 제한에 도달한 경우의 모델 인스턴스
88 ifcurCut >= cMax
89fprintf(',');
90cMax = curCut + cutsPerRound;
91cutData.export();
92
93% 체크포인트 생성
94tspJob = ws.addJobFromString(모델);
95cp = ws.addCheckpoint();
96opt = ws.addOptions();
97opt.defines('nrcities', '20');
98opt.defines('cmax', int2str(cMax - 1));
99opt.defines('컷데이터', cutData.name);
100
101%는에서 입력 데이터를 읽었습니다.'무료 슬롯gdx'
102opt.defines('tspdata', ['"', 전체 파일(ws.systemDirectory,'API파일', '데이터', '무료 슬롯gdx'), '"']);
103tspJob.run(opt, cp);
104
105%는 n 목록을 한 번만 채웁니다.
106 ifnumel(n) == 0
107 fori = tspJob.outDB.getSet('나').기록
108nend+1 = i1.key(1);
109
110
111
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 사용 할당', 수정자);
118 그밖에
119fprintf('.');
120
121
122% 모델 인스턴스 해결사용 중업데이트 유형을 누적하고 이후에 acut 및 rhscut 삭제
123mi.solve(무료 슬롯control.globals.SymbolUpdateType.ACCUMULATE);
124mi.syncDB.getParameter('아컷').clear();
125mi.syncDB.getParameter('rhscut').clear();
126
127%는 솔루션에서 그래프 정보를 수집합니다.
128그래프 = 컨테이너.Map();
129방문하지 않음 = n;
130 fori = n
131 forj = n
132 ifmi.syncDB.getVariable('x').findRecord(i1,j1).level > 0.5
133그래프(i1) = j1;
134
135
136
137
138% 모든 하위 투어를 찾고 acut 및 rhscut을 수정하여 필요한 컷을 추가합니다.
139 그동안numel(방문하지 않음) ~= 0
140ii = 방문하지 않음1;
141하위 투어 = ii;
142 그동안~strcmp(graph(ii), 방문하지 않음1)
143ii = 그래프(ii);
144하위 투어end+1 = ii;
145
146
147 fori = numel(notVisited):-1:1
148for j = 1:numel(subTour)
149if strcmp(notVisitedi, subTourj)
150방문하지 않음(i) = [];
151 휴식
152
153
154
155
156% 두 데이터베이스에 컷 추가(cutData, mi.SyncDB)
157for i = subTour
158j = subTour의 경우
159키 = ['c', int2str(curCut)], i1, j1;
160rec = acut.addRecord(keys);
161rec.값 = 1;
162rec = miAcut.addRecord(keys);
163rec.값 = 1;
164
165
166
167키 = ['c', int2str(curCut)];
168rec = rhscut.addRecord(키);
169rec.value = numel(subTour) - 0.5;
170rec = miRhscut.addRecord(키);
171rec.value = numel(subTour) - 0.5;
172cc.addRecord(키);
173curCut = curCut + 1;
174
175
176 ifnumel(subTour) >= numel(n)
177 휴식
178
179
180
181fprintf('\nz=%g\n', mi.syncDB.getVariable('z').record.level);
182fprintf('sub_tour: ');
183 fori = 하위 투어
184fprintf('%s -> ', 나1);
185
186fprintf('%s\n', 하위 둘러보기1);
187