로드 중...
검색 중...
일치하는 항목 없음
GMSCutstock.cs
1// -------------------------------------------------- -*- C# -*-
2// 파일: Cutstock.cs
3// --------------------------------------------------------------------------
4사용 중시스템;
5사용 중시스템.IO;
6사용 중무료 슬롯;
7사용 중System.Collections.Generic;
8
9네임스페이스컷스톡
10{
19 클래스컷스톡
20{
21 정적 무효메인(문자열[] 인수)
22{
24 if(Environment.GetCommandLineArgs().Length > 1)
25ws =신규 무료 슬롯작업공간(systemDirectory: Environment.GetCommandLineArgs()[1]);
26 그밖에
27ws =신규 무료 슬롯작업공간();
28 // GAMSOptions 인스턴스화 및 매개변수 정의
31opt.AllModelTypes ="복합단지";
32opt.OptCR = 0.0;// 최적으로 해결
33 int최대 패턴 = 35;
34선택.정의.추가("pmax", maxpattern.ToString());
35선택.정의.추가("solveMasterAs", "RMIP");
36
37 // 입력 데이터 정의
38사전<문자열, 더블> d =신규사전<string, double>()"i1", 97 }, {"i2", 610 }, {"i3", 395 }, {"i4", 211 } };
39사전<string, double> w =신규사전<string, double>()"i1", 47 }, {"i2", 36 }, {"i3", 31 }, {"i4", 14 } };
40 intr = 100;// 원시 너비
41
42 // cutstockData.AddSet("i", 1, "widths").AddRecords(d.Keys);
43 // cutstockData.AddParameter("d", 1, "수요").AddRecords(d);
44 // cutstockData.AddParameter("w", 1, "너비").AddRecords(w);
45 // cutstockData.AddParameter("r", 0, "원시 너비").AddRecord().Value = r;
46
47 GAMSSet너비 = cutstockData.AddSet("나", 1,"너비");
48 무료 슬롯매개변수rawWidth = cutstockData.매개변수 추가("r", 0,"원시 너비");
49 무료 슬롯매개변수수요 = cutstockData.매개변수 추가("d", 1,"수요");
50 무료 슬롯매개변수너비 = cutstockData.매개변수 추가("w", 1,"너비");
51
52원시 너비.AddRecord().=r;
53 foreach (문자열iind.키)
54너비.AddRecord(i);
55 foreach(KeyValuePair<string, double> tind)
56demand.AddRecord(t.Key).Value = t.Value;
57 foreach(KeyValuePair<string, double> tw)
58너비.AddRecord(t.Key).값 = t.값;
59
60 // 초기 체크포인트 생성
61 무료 슬롯체크포인트masterCP = ws.AddCheckpoint();
62 GAMSJobmasterInitJob = ws.AddJobFromString(GetMasterModel());
63masterInitJob.실행(opt, masterCP, cutstockData);
64
65 GAMSJobmasterJob = ws.AddJobFromString("execute_load 'csdata', aip, pp; %solveMasterAs%를 사용하여 마스터 최소 z를 해결합니다.", masterCP);
66
67 GAMSSet패턴 = cutstockData.AddSet("pp", 1,"패턴 색인");
68 무료 슬롯매개변수patternData = cutstockData.AddParameter("aip", 2,"패턴 데이터");
69
70 // 초기 패턴: 패턴은 너비 i를 유지합니다.
71 int패턴수 = 0;
72 foreach(KeyValuePair<string,double> tw)
73{
74patternData.AddRecord(t.Key, 패턴.AddRecord((++patternCount).ToString()).Key(0)).Value = (int)(r / t.Value);
75}
76
77 // 하위 작업에 대한 모델 인스턴스 생성
78 무료 슬롯체크포인트subCP = ws.AddCheckpoint();
79ws.AddJobFromString(GetSubModel()).Run(opt, subCP, cutstockData);
80 GAMSModelInstancesubMI = 하위 CP.AddModelInstance();
81
82 // 수식어 demdual 정의
83 무료 슬롯매개변수demandDual = subMI.SyncDB.매개변수 추가("뎀듀얼", 1,"마스터의 이중 요구");
84subMI.인스턴스화("mip를 사용하여 min z 가격 책정", 선택,신규 GAMSModifier(demandDual));
85
86 // 새로운 패턴 찾기
87 부울패턴 추가됨 =;
88 할 것
89{
90masterJob.Run(opt, masterCP, cutstockData);
91 // gmssubMI.SyncDB DB에 이중 복사
92demandDual.Clear();
93 foreach (GAMSequationRecorddemmasterJob.OutDB.GetEquation("수요"))
94수요듀얼.AddRecord(dem.Key(0)).= dem.한계;
95
96subMI.해결();
97 if(subMI.SyncDB.GetVariable("z").기록 찾기().레벨< -0.00001)
98{
99 if(patternCount == maxpattern)
100{
101Console.Out.WriteLine("패턴이 벗어났습니다. 최대 패턴을 늘리십시오(현재 0).", 최대 패턴);
102패턴 추가됨 =거짓;
103}
104 그밖에
105{
106Console.WriteLine("새로운 패턴! 값: "+ 하위MI.SyncDB.GetVariable("z").기록 찾기().레벨);
107 GAMSSetRecords = 패턴.AddRecord((++patternCount).ToString());
108 foreach (GAMSVariableRecordyinsubMI.SyncDB.GetVariable("y"))
109{
110 if(y.레벨> 0.5)
111{
112patternData.AddRecord(y.Key(0), s.Key(0)).Value = Math.Round(y.레벨);
113}
114}
115}
116}
117 그밖에패턴 추가됨 =거짓;
118}그동안(패턴 추가됨);
119
120 // 최종 MIP 해결
121opt.정의["solveMasterAs"] ="MIP";
122masterJob.Run(opt, cutstockData);
123Console.WriteLine("최적의 해결책: 0", masterJob.OutDB.GetVariable("z").FindRecord().레벨);
124 foreach (GAMSVariableRecordxpinmasterJob.OutDB.GetVariable("xp"))
125{
126 if(xp.레벨> 0.5)
127{
128콘솔.아웃.쓰기(" 패턴 0 1 회: ", xp.Key(0), xp.레벨);
129 GAMSParameterRecordaip = masterJob.OutDB.GetParameter("아이피").FirstRecord(" ", xp.Key(0));
130
131{
132콘솔.아웃.쓰기(" 0: 1", aip.Key(0), aip.);
133}그동안(aip.MoveNext());
134Console.Out.WriteLine();
135}
136}
137 // 관리되지 않는 리소스 정리
138cutstockData.Dispose();
139subMI.Dispose();
140opt.Dispose();
141}
142
143 정적문자열 GetMasterModel()
144{
145문자열 모델 =@"
146$Title 재고 절단 - 마스터 문제
147
148i 너비 설정
149매개변수
150w(i) 너비
151d(i) 수요
152스칼라
153r 원시 너비;
154$gdxin csdata
155$load i w d r
156
157$pmax를 설정하지 않은 경우 $set pmax 1000
158p개의 가능한 패턴 설정 /1*%pmax%/
159pp(p) p의 동적 하위 집합
160매개변수
161aip(i,p) p에서 성장하는 패턴의 너비 i 수;
162
163* 마스터 모델
164가변 xp(p) 패턴 사용
165z 목적변수
166정수 변수 xp; xp.up(p) = 합계(i, d(i));
167
168방정식 숫자 사용된 패턴 수
169수요(i) 수요를 충족함;
170
171numpat.. z =e= sum(pp, xp(pp));
172수요(i).. sum(pp, aip(i,pp)*xp(pp)) =g= d(i);
173
174모델 마스터 /numpat, 수요/;";
175
176 반환모델;
177}
178 정적문자열 GetSubModel()
179{
180문자열 하위 모델 =@"
181$제목 재고 절단 - 가격 문제는 배낭 모델임
182
183i 너비 설정
184매개변수
185w(i) 너비;
186스칼라
187r 원시 너비;
188
189$gdxin csdata
190$load i w r
191
192매개변수
193demdual(i) 마스터 수요 제약 조건의 이중 /#i eps/;
194
195변수 z, y(i) 새 패턴;
196정수 변수 y; y.up(i) = ceil(r/w(i));
197
198수식 defobj
199배낭 배낭 제약 조건;
200
201defobj.. z =e= 1 - sum(i, demdual(i)*y(i));
202knapsack..sum(i, w(i)*y(i)) =l= r;
203option optcr=0;
204모델 가격 /defobj, 배낭/; 가격.optfile=1";
205
206 반환하위 모델;
207}
208}
209}
GAMSModelInstance AddModelInstance(string modelInstanceName=null)
GAMSVariable GetVariable(문자열 변수 식별자)
GAMSSet AddSet(문자열 식별자, int 차원, 문자열 설명텍스트="", 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)