5wsInfo = 피망 슬롯control.WorkspaceInfo();
6wsInfo.systemDirectory = varargin1;
7ws = 피망 슬롯control.Workspace(wsInfo);
9ws = 피망 슬롯control.Workspace();
14cutstockData = ws.addDatabase(
'csdata');
15opt.setAllModelTypes(
'복합체');
16opt.optCR = 0; % 최적성 해결
18opt.defines(
'pmax', 스프린트(
'%d', 최대 패턴));
19opt.defines(
'solveMasterAs',
'RMIP');
22d = 컨테이너.맵(
'i1',
'i2',
'i3',
'i4'}, {97, 610, 395, 211});
23w = 컨테이너.맵(
'i1',
'i2',
'i3',
'i4'}, {45, 36, 31, 14});
26너비 = cutstockData.addSet(
'나', 1,
'너비');
27rawWidth = cutstockData.addParameter(
'r', 0,
'원시 너비');
28수요 = cutstockData.addParameter(
'd', 1,
'수요');
29너비 = cutstockData.addParameter(
'w', 1,
'너비');
33rec =demand.addRecord(키1);
37rec = width.addRecord(키1);
40rec = rawWidth.addRecord();
55 '$pmax를 설정하지 않은 경우 $set pmax 1000 '
56 'p개의 가능한 패턴 설정 /1*%pmax%/ '
59 ' aip(i,p) p에서 성장하는 패턴의 너비 i 수;'
64 '정수 변수 xp; xp.up(p) = sum(i, d(i)); '
69 'numpat.. z =e= sum(pp, xp(pp)); '
70 '수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i); '
72 '모델 마스터 /numpat, 수요/; '
74마스터모델 = 스프린트f(
'%s\n', 마스터모델:);
77 '$제목 절단 재고 - 가격 문제는 배낭 모델입니다. '
89 ' demdual(i) 마스터 수요 제약의 이중 /#i eps/; '
92 '정수 변수 y; y.up(i) = ceil(r/w(i)); '
97 'defobj.. z =e= 1 - sum(i, demdual(i)*y(i)); '
98 '배낭.. sum(i, w(i)*y(i)) =l= r; '
99 '모델 가격 /defobj, 배낭/; '
101하위 모델 = sprintf(
'%s\n', 하위 모델:);
104masterCP = ws.addCheckpoint();
105masterInitJob = ws.addJobFromString(masterModel);
106masterInitJob.run(opt, masterCP, cutstockData);
108masterJob = ws.addJobFromString(
'execute_load ''csdata'', aip, pp; %solveMasterAs%를 사용하여 마스터 최소 z를 해결합니다.', 마스터CP);
110패턴 = cutstockData.addSet(
'pp', 1,
'패턴 색인');
111patternData = cutstockData.addParameter(
'아이피', 2,
'패턴 데이터');
113% 초기 패턴: 패턴 i는 너비 i를 유지합니다.
116patternCount = 패턴수 + 1;
117patternCount_str = 스프린트f(
'%d', 패턴수);
118pattern.addRecord(patternCount_str);
119rec = PatternData.addRecord(key1, PatternCount_str);
120rec.value = 바닥(r / w(키1));
124subCP = ws.addCheckpoint();
125ws.addJobFromString(subModel).run(opt, subCP, cutstockData);
127subMI = subCP.addModelInstance();
130demandDual = subMI.syncDB.addParameter(
'뎀듀얼', 1,
'마스터의 이중 요구');
131subMI.instantiate(
'mip를 사용하여 최소 z 가격 책정', opt, 피망 슬롯control.Modifier(demandDual));
136masterJob.run(opt, masterCP, cutstockData);
138% gmssubMI.syncDB DB에 이중 복사
140 ford = masterJob.outDB.getEquation(
'수요').기록
141rec =demandDual.addRecord(d1.key(1));
142rec.value = d1.marginal;
147z_level = subMI.syncDB.getVariable(
'z').record.level;
149if PatternCount == maxpattern
150fprintf('패턴이 벗어났습니다. 최대 패턴을 늘립니다(현재 [%d])\n', maxpattern);
153fprintf(
'새 패턴 값: %g\n', z_level);
155s = 패턴.addRecord(sprintf(
'%d', 패턴수));
156 fory = subMI.syncDB.getVariable(
'y').기록
158rec = PatternData.addRecord(y1.key(1), s.key(1));
159rec.value = round(y1.level);
169opt.defines(
"solveMasterAs",
"MIP");
170masterJob.run(opt, cutstockData);
172fprintf(
"최적의 해결책: %g\n", masterJob.outDB.getVariable(
"z").record.level);
173 forxp = masterJob.outDB.getVariable(
"xp").기록
175fprintf(
" 패턴 [%s] [%g] 회: ", xp1.key(1), xp1.level);
176 foraip = masterJob.outDB.getParameter(
"aip").기록
177fprintf(
" [%s] : [%g]\n", aip1.key(1), aip1.value);
184cutstockData.dispose();