로드 중...
검색 중...
일치하는 항목 없음
Form1.cs
1사용 중시스템;
2사용 중System.Collections.Generic;
3사용 중System.ComponentModel;
4사용 중시스템.데이터;
5사용 중시스템.드로잉;
6사용 중System.Linq;
7사용 중시스템.텍스트;
8사용 중System.Windows.Forms;
9사용 중메가 슬롯;
10사용 중시스템.반사;
11사용 중System.Data.OleDb;
12
13네임스페이스CutStockGUI
14{
21 공개 부분 수업양식1: 양식
22{
23 비공개목록<string> 컷 =신규목록<문자열>()"i1", "i2", "i3", "i4"};
24 비공개사전<string, int> d =신규사전<string, int>()"i1", 97 }, {"i2", 610 }, {"i3", 395 }, {"i4", 211 } };
25 비공개사전<string, int> w =신규사전<string, int>()"i1", 47 }, {"i2", 36 }, {"i3", 31 }, {"i4", 14 } };
26 비공개 intr = 100;// 원시 너비
27 비공개 int최대 패턴 = 35;
28 비공개 intnrCuts = 0;
29 비공개목록<색상> 색상 =신규목록<색상>() Color.FromArgb(255, 192, 255, 255), Color.FromArgb(255, 255, 255, 192),
30Color.FromArgb(255, 192, 255, 192), Color.FromArgb(255, 255, 224, 192),
31Color.FromArgb(255, 255, 192, 255), Color.FromArgb(255, 129, 255, 192),
32Color.FromArgb(255, 192, 192, 255), Color.FromArgb(255, 255, 192, 192),
33Color.FromArgb(255, 100, 192, 220), Color.FromArgb(255, 129, 100, 192),
34Color.FromArgb(255, 192, 192, 100), Color.FromArgb(255, 255, 192, 100) ;
35
36 공개 양식1()
37{
38초기화구성요소();
39nudWidth.Value = r;
40nudMax.Value = 최대 패턴;
41
42 // 절단 너비 추가
43 foreach (문자열iin컷)
44{
45flowLayoutPanel1.Controls.Add(신규 CutWidthsControl(i, w[i], (int) nudWidth.Value, d[i], colors[nrCuts%colors.Count], nudWidth));
46nrCuts++;
47}
48}
49
50 //새 절단 너비 추가
51 비공개 무효button3_Click(객체발신자, EventArgs e)
52{
53flowLayoutPanel1.Controls.Add(신규 CutWidthsControl("나"+ (nrCuts + 1), (int)nudWidth.값, (int)nudWidth.Value, 0, colors[nrCuts % colors.Count], nudWidth));
54flowLayoutPanel1.VerticalScroll.Value = flowLayoutPanel1.VerticalScroll.Maximum;
55flowLayoutPanel1.Update();
56flowLayoutPanel1.VerticalScroll.Value = flowLayoutPanel1.VerticalScroll.Maximum;
57nrCuts++;
58}
59
60 //마지막 절단 너비 삭제
61 비공개 무효button2_Click(객체발신자, EventArgs e)
62{
63 if(nrCuts <= 1)
64MessageBox.Show("적어도 하나는 있어야 하기 때문에 마지막 절단 너비를 삭제할 수 없습니다.");
65 그밖에
66{
67flowLayoutPanel1.Controls.RemoveAt(nrCuts-1);
68flowLayoutPanel1.Update();
69nrCuts--;
70}
71}
72
73 비공개 무효button1_Click(객체발신자, EventArgs e)
74{
75richTextBox1.Clear();
76tabControl1.Visible =거짓;
77tabControl1.TabPages.Clear();
78 시도해 보세요
79{
81
82 // GAMSOptions 인스턴스화 및 매개변수 정의
85opt.AllModelTypes ="CBC";
86opt.OptCR = 0.0;// 최적으로 해결
87선택.정의.추가("pmax", nudMax.Value.ToString());
88선택.정의.추가("solveMasterAs", "RMIP");
89
90 GAMSSet너비 = cutstockData.AddSet("나", 1,"너비");
91 메가 슬롯매개변수rawWidth = cutstockData.매개변수 추가("r", 0,"원시 너비");
92 메가 슬롯매개변수수요 = cutstockData.매개변수 추가("d", 1,"수요");
93 메가 슬롯매개변수너비 = cutstockData.매개변수 추가("w", 1,"너비");
94
95원시 너비.AddRecord().= (int)nudWidth.Value;
96
97 foreach(CutWidthsControl컷폭inflowLayoutPanel1.Controls)
98{
99widths.AddRecord(cutWidth.Name);
100demand.AddRecord(cutWidth.Name).Value = cutWidth.DemandValue;
101너비.AddRecord(cutWidth.Name).Value = cutWidth.WidthValue;
102}
103
104 // 초기 체크포인트 생성
105 메가 슬롯체크포인트masterCP = ws.AddCheckpoint();
106 GAMSJobmasterInitJob = ws.AddJobFromString(GetMasterModel());
107masterInitJob.실행(opt, masterCP, cutstockData);
108
109 GAMSJobmasterJob = ws.AddJobFromString("execute_load 'csdata', aip, pp; %solveMasterAs%를 사용하여 마스터 min z 해결;", 마스터CP);
110
111 GAMSSet패턴 = cutstockData.AddSet("pp", 1,"패턴 색인");
112 메가 슬롯매개변수patternData = cutstockData.AddParameter("아이피", 2,"패턴 데이터");
113
114 // 초기 패턴: 패턴 i는 너비 i를 유지합니다.
115 int패턴수 = 0;
116
117 foreach (GAMSParameterRecordrecin폭)
118{
119patternData.AddRecord(rec.Keys[0], 패턴.AddRecord((++patternCount).ToString()).Keys[0]).Value = (int)((int)nudWidth.값/rec.);
120}
121
122 // 하위 작업에 대한 모델 인스턴스 생성
123 메가 슬롯체크포인트subCP = ws.AddCheckpoint();
124ws.AddJobFromString(GetSubModel()).Run(opt, subCP, cutstockData);
125 GAMSModelInstancesubMI = 하위 CP.AddModelInstance();
126
127 // 수식어 demdual 정의
128 메가 슬롯매개변수demandDual = subMI.SyncDB.매개변수 추가("뎀듀얼", 1,"마스터의 이중 요구");
129subMI.인스턴스화("mip를 사용하여 min z 가격 책정", 선택,신규 GAMSModifier(demandDual));
130
131 // 새로운 패턴 찾기
132 부울패턴 추가됨 =;
133
134{
135masterJob.Run(opt, masterCP, cutstockData);
136 // gmssubMI.SyncDB DB에 이중 복사
137demandDual.Clear();
138 foreach (GAMSequationRecorddeminmasterJob.OutDB.GetEquation("수요"))
139수요이중.AddRecord(dem.Keys[0]).= dem.한계;
140
141subMI.해결();
142 if(subMI.SyncDB.GetVariable("z").기록 찾기().레벨< -0.00001)
143{
144 if(patternCount == maxpattern)
145{
146richTextBox1.AppendText("패턴이 벗어났습니다. 최대 패턴을 늘리십시오(현재 "+ nudMax.Value +")."+ Environment.NewLine);
147패턴 추가됨 =거짓;
148}
149 그밖에
150{
151richTextBox1.AppendText("새 패턴! 값: "+ 하위MI.SyncDB.GetVariable("z").기록 찾기().레벨+ Environment.NewLine);
152richTextBox1.ScrollToCaret();
153 GAMSSetRecords = 패턴.AddRecord((++patternCount).ToString());
154 foreach (GAMSVariableRecordyinsubMI.SyncDB.GetVariable("y"))
155{
156 if(y.레벨> 0.5)
157{
158patternData.AddRecord(y.Keys[0], s.Keys[0]).Value = Math.Round(y.레벨);
159}
160}
161}
162}
163 그밖에패턴 추가됨 =거짓;
164}그동안(패턴 추가됨);
165
166 // 최종 MIP 해결
167opt.정의["solveMasterAs"] ="MIP";
168masterJob.Run(opt, cutstockData);
169richTextBox1.AppendText("최적의 해결책: "+ masterJob.OutDB.GetVariable("z").FindRecord().레벨 + Environment.NewLine); richTextBox1.ScrollToCaret();
170tabControl1.Visible =;
171 foreach (GAMSVariableRecordxpinmasterJob.OutDB.GetVariable("xp"))
172{
173 if(xp.레벨> 0.5)
174{
175richTextBox1.AppendText(String.Format(" 패턴 0,2 1,4 회: ", xp.Keys[0], Math.Round(xp.레벨))); richTextBox1.ScrollToCaret();
176 GAMSParameterRecordaip = masterJob.OutDB.GetParameter("aip").첫 번째 레코드(" ", xp.Keys[0]);
177탭페이지 tp =신규탭페이지("패턴"+ xp.Keys[0].ToString());
178tp.BackColor = Color.White;
179tabControl1.TabPages.Add(tp);
180
181 intx = 0;
182 더블scale = tp.Width/masterJob.OutDB.GetParameter("r").FirstRecord().값;
183 할 것
184{
185richTextBox1.AppendText(" "+ aip.Keys[0] +": "+ aip..ToString()); richTextBox1.ScrollToCaret();
186 // 드로컷
187 for (inti = 0; 나 <알았어.; 나++)
188{
189패널 p =신규패널();
190p.BorderStyle = BorderStyle.FixedSingle;
191p.BackColor = flowLayoutPanel1.Controls.Find(aip.Keys[0],)[0].BackColor;
192p.높이 = tp.높이;
193p.Width = (int) (width.FindRecord(aip.Keys[0]).Value * scale);
194p.왼쪽 = x;
195x += p.너비 - 1;
196tp.Controls.Add(p);
197}
198}그동안(aip.MoveNext());
199
200패널 pExcess =신규패널();
201pExcess.BorderStyle = BorderStyle.FixedSingle;
202pExcess.BackColor = Color.LightGray;
203pExcess.Height = tp.Height;
204pExcess.Width = (int) (rawWidth.FirstRecord().Value*scale - x);
205pExcess.Left = x;
206tp.Controls.Add(pExcess);
207
208richTextBox1.AppendText(Environment.NewLine); richTextBox1.ScrollToCaret();
209}
210}
211 // 관리되지 않는 리소스 정리
212cutstockData.Dispose();
213subMI.Dispose();
214opt.Dispose();
215}
216 잡기(예외 예)
217{
218richTextBox1.AppendText("예외: "+ 예: 메시지);
219}
220}
221
222 정적문자열 GetMasterModel()
223{
224문자열 모델 =@"
225$Title 절단 재고 - 마스터 문제
226
227i 너비 설정
228매개변수
229w(i) 너비
230d(i) 수요
231스칼라
232r 원시 너비;
233$gdxin csdata
234$load i w d r
235
236$pmax를 설정하지 않은 경우 $set pmax 1000
237p개의 가능한 패턴 설정 /1*%pmax%/
238pp(p) p의 동적 하위 집합
239매개변수
240aip(i,p) p에서 성장하는 패턴의 너비 i 수;
241
242* 마스터 모델
243변수 xp(p) 패턴이 사용됨
244z 목적변수
245정수 변수 xp; xp.up(p) = 합계(i, d(i));
246
247사용된 패턴의 방정식 숫자
248수요(i) 수요를 충족함;
249
250numpat.. z =e= sum(pp, xp(pp));
251수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);
252
253모델 마스터 /numpat, 수요/;";
254
255 반환모델;
256}
257 정적문자열 GetSubModel()
258{
259문자열 하위 모델 =@"
260$제목 절단 재고 - 가격 문제는 배낭 모델임
261
262i 너비 설정
263매개변수
264w(i) 너비;
265스칼라
266r 원시 너비;
267
268$gdxin csdata
269$load i w r
270
271매개변수
272demdual(i) 마스터 수요 제약 조건의 이중 /#i eps/;
273
274변수 z, y(i) 새로운 패턴;
275정수 변수 y; y.up(i) = ceil(r/w(i));
276
277수식 defobj
278배낭 배낭 제약 조건;
279
280defobj.. z =e= 1 - sum(i, demdual(i)*y(i));
281배낭.. sum(i, w(i)*y(i)) =l= r;
282옵션 optcr=0;
283모델 가격 /defobj, 배낭/; 가격.optfile=1";
284
285 반환하위 모델;
286}
287
288 비공개 공허button4_Click(객체발신자, EventArgs e)
289{
290OpenFileDialog 브라우저 =신규OpenFileDialog();
291
292browser.DefaultExt ="accdb";
293browser.Filter ="액세스 데이터베이스(*.accdb)|*.accdb";
294browser.InitialDirectory = 환경.CurrentDirectory;
295
296 if(browser.ShowDialog() == DialogResult.OK)
297{
298 // 액세스 데이터베이스에서 읽기
299OleDbConnection 연결 =;
300 시도해 보세요
301{
302연결 =신규OleDbConnection("공급자=Microsoft.ACE.OLEDB.12.0;데이터 소스="+ 브라우저.파일 이름);
303
304 // 절단 너비 삭제
305 그동안(nrCuts>0)
306{
307flowLayoutPanel1.Controls.RemoveAt(nrCuts-1);
308nrCuts--;
309}
310flowLayoutPanel1.Update();
311
312OleDbCommand cmd =신규OleDb명령("RawWidth에서 너비 선택", 연결);
313연결.열기();
314OleDbDataReader 리더 = cmd.ExecuteReader();
315 그동안(reader.Read())
316{
317nudWidth.Value = (int)reader.GetValue(0);
318nudWidth.Update();
319}
320
321cmd =신규OleDb명령("CutWidths에서 라벨, 너비, 수요 선택", 연결);
322reader = cmd.ExecuteReader();
323 그동안(reader.Read())
324flowLayoutPanel1.Controls.Add(신규 CutWidthsControl(reader.GetString(0), (int)reader.GetValue(1), (int)nudWidth.값, (int)reader.GetValue(2), colors[nrCuts % colors.Count], nudWidth));
325flowLayoutPanel1.VerticalScroll.Value = flowLayoutPanel1.VerticalScroll.Maximum;
326flowLayoutPanel1.Update();
327flowLayoutPanel1.VerticalScroll.Value = flowLayoutPanel1.VerticalScroll.Maximum;
328nrCuts++;
329}
330연결.닫기();
331}
332 잡기(예외 예)
333{
334MessageBox.Show("데이터베이스에서 데이터를 읽는 동안 오류가 발생했습니다. \n"+ 예: 메시지);
335연결.닫기();
336환경.종료(1);
337}
338}
339
340}
341}
342}
이 예에서는 데이터베이스에서 데이터를 로드하거나 수동으로 데이터를 입력할 수 있습니다....
GAMSModelInstance AddModelInstance(string modelInstanceName=null)
GAMSVariable GetVariable(문자열 변수 식별자)
GAMSSet AddSet(문자열 식별자, int 차원, 문자열 설명Text="", SetType setType=SetType.multi)
GAMSParameter AddParameter(문자열 식별자, 정수 차원, 문자열 설명텍스트="")
void Run(GAMSOptions gamsOptions=null, GAMSCheckpoint 체크포인트=null, TextWriter 출력=null, Boolean createOutDB=true)
메가 슬롯데이터베이스 SyncDB
void Solve(SymbolUpdateType 업데이트 유형=SymbolUpdateType.BaseCase, TextWriter 출력=null, GAMSModelInstanceOpt miOpt=null)
void 인스턴스화(문자열 모델 정의, params GAMSModifier[] 수정자)
사전< 문자열, 문자열 > 정의
새 GAMSParameterRecord AddRecord(params 문자열[] 키)
새 GAMSVariableRecord FindRecord(params 문자열[] 키)
GAMSDatabase AddDatabase(문자열 데이터베이스 이름=null, 문자열 inModelName=null)
GAMSOptions AddOptions(GAMSOptions optFrom=null)