로드 중...
검색 중...
일치하는 항목 없음
피망 슬롯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% 옵션 인스턴스화 및 매개변수 정의
13opt = ws.addOptions();
14cutstockData = ws.addDatabase('csdata');
15opt.setAllModelTypes('복합체');
16opt.optCR = 0; % 최적성 해결
17최대 패턴 = 35;
18opt.defines('pmax', 스프린트('%d', 최대 패턴));
19opt.defines('solveMasterAs', 'RMIP');
20
21%가 입력 데이터를 정의
22d = 컨테이너.맵('i1', 'i2', 'i3', 'i4'}, {97, 610, 395, 211});
23w = 컨테이너.맵('i1', 'i2', 'i3', 'i4'}, {45, 36, 31, 14});
24r = 100;
25
26너비 = cutstockData.addSet('나', 1,'너비');
27rawWidth = cutstockData.addParameter('r', 0,'원시 너비');
28수요 = cutstockData.addParameter('d', 1,'수요');
29너비 = cutstockData.addParameter('w', 1,'너비');
30
31 for키 = 키(d)
32widths.addRecord(키1);
33rec =demand.addRecord(키1);
34rec.value = d(키1);
35
36 for키 = 키(w)
37rec = width.addRecord(키1);
38rec.value = w(키1);
39
40rec = rawWidth.addRecord();
41rec.값 = 100;
42
43마스터모델 =
44 '$제목 절단 재고 - 마스터 문제 '
45 ' '
46 'i 너비 설정'
47 '매개변수'
48 ' w(i) 너비 '
49 ' d(i) 수요 '
50 '스칼라'
51 ' r 원시 너비; '
52 '$gdxin csdata '
53 '$load i w d r '
54 ' '
55 '$pmax를 설정하지 않은 경우 $set pmax 1000 '
56 'p개의 가능한 패턴 설정 /1*%pmax%/ '
57 ' pp(p) p '의 동적 하위 집합
58 '매개변수'
59 ' aip(i,p) p에서 성장하는 패턴의 너비 i 수;'
60 ' '
61 '* 마스터 모델 '
62 '사용된 가변 xp(p) 패턴'
63 ' z 목적 변수 '
64 '정수 변수 xp; xp.up(p) = sum(i, d(i)); '
65 ' '
66 '사용된 패턴의 방정식 숫자 '
67 ' 수요(i) 수요를 충족합니다. '
68 ' '
69 'numpat.. z =e= sum(pp, xp(pp)); '
70 '수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i); '
71 ' '
72 '모델 마스터 /numpat, 수요/; '
73 ' '};
74마스터모델 = 스프린트f('%s\n', 마스터모델:);
75
76하위 모델 =
77 '$제목 절단 재고 - 가격 문제는 배낭 모델입니다. '
78 ' '
79 'i 너비 설정'
80 '매개변수'
81 ' w(i) 너비; '
82 '스칼라'
83 ' r 원시 너비; '
84 ' '
85 '$gdxin csdata '
86 '$load i w r '
87 ' '
88 '매개변수'
89 ' demdual(i) 마스터 수요 제약의 이중 /#i eps/; '
90 ' '
91 '변수 z, y(i) 새로운 패턴; '
92 '정수 변수 y; y.up(i) = ceil(r/w(i)); '
93 ' '
94 '방정식 defobj '
95 ' 배낭; '
96 ' '
97 'defobj.. z =e= 1 - sum(i, demdual(i)*y(i)); '
98 '배낭.. sum(i, w(i)*y(i)) =l= r; '
99 '모델 가격 /defobj, 배낭/; '
100 ' '};
101하위 모델 = sprintf('%s\n', 하위 모델:);
102
103% 초기 체크포인트 생성
104masterCP = ws.addCheckpoint();
105masterInitJob = ws.addJobFromString(masterModel);
106masterInitJob.run(opt, masterCP, cutstockData);
107
108masterJob = ws.addJobFromString('execute_load ''csdata'', aip, pp; %solveMasterAs%를 사용하여 마스터 최소 z를 해결합니다.', 마스터CP);
109
110패턴 = cutstockData.addSet('pp', 1,'패턴 색인');
111patternData = cutstockData.addParameter('아이피', 2,'패턴 데이터');
112
113% 초기 패턴: 패턴 i는 너비 i를 유지합니다.
114패턴수 = 0;
115 for키 = 키(w)
116patternCount = 패턴수 + 1;
117patternCount_str = 스프린트f('%d', 패턴수);
118pattern.addRecord(patternCount_str);
119rec = PatternData.addRecord(key1, PatternCount_str);
120rec.value = 바닥(r / w(키1));
121
122
123% 모델 인스턴스 생성for하위 직업
124subCP = ws.addCheckpoint();
125ws.addJobFromString(subModel).run(opt, subCP, cutstockData);
126
127subMI = subCP.addModelInstance();
128
129% 수정자 demdual 정의
130demandDual = subMI.syncDB.addParameter('뎀듀얼', 1,'마스터의 이중 요구');
131subMI.instantiate('mip를 사용하여 최소 z 가격 책정', opt, 피망 슬롯control.Modifier(demandDual));
132
133% 발견신규패턴
134패턴 추가됨 =;
135 그동안패턴추가됨
136masterJob.run(opt, masterCP, cutstockData);
137
138% gmssubMI.syncDB DB에 이중 복사
139demandDual.clear();
140 ford = masterJob.outDB.getEquation('수요').기록
141rec =demandDual.addRecord(d1.key(1));
142rec.value = d1.marginal;
143
144
145subMI.solve();
146
147z_level = subMI.syncDB.getVariable('z').record.level;
148 ifz_level < -0.00001
149if PatternCount == maxpattern
150fprintf('패턴이 벗어났습니다. 최대 패턴을 늘립니다(현재 [%d])\n', maxpattern);
151패턴 추가됨 =거짓;
152 그밖에
153fprintf('새 패턴 값: %g\n', z_level);
154패턴카운트 = 패턴카운트 + 1;
155s = 패턴.addRecord(sprintf('%d', 패턴수));
156 fory = subMI.syncDB.getVariable('y').기록
157 ify1.level > 0.5
158rec = PatternData.addRecord(y1.key(1), s.key(1));
159rec.value = round(y1.level);
160
161
162
163 그밖에
164패턴 추가됨 =거짓;
165
166
167
168% 해결최종MIP
169opt.defines("solveMasterAs", "MIP");
170masterJob.run(opt, cutstockData);
171
172fprintf("최적의 해결책: %g\n", masterJob.outDB.getVariable("z").record.level);
173 forxp = masterJob.outDB.getVariable("xp").기록
174 ifxp1.level > 0.5
175fprintf(" 패턴 [%s] [%g] 회: ", xp1.key(1), xp1.level);
176 foraip = masterJob.outDB.getParameter("aip").기록
177fprintf(" [%s] : [%g]\n", aip1.key(1), aip1.value);
178
179fprintf("\n");
180
181
182
183관리되지 않는 리소스 % 정리
184cutstockData.dispose();
185subMI.dispose();
186opt.dispose();
187