로드 중...
검색 중...
일치하는 항목 없음
Benders2StageMT.cs
1사용 중시스템;
2사용 중System.Collections.Generic;
3사용 중시스템.텍스트;
4사용 중시스템.IO;
5사용 중System.Threading.Tasks;
6사용 중슬롯 나라;
7
8네임스페이스BendersDecomposition2StageSP
9{
27{
28 비공개 정적 무효센솔브(GAMSModelInstance수비, 심판더블cutconst, ref Dictionary<string, double> cutcoeff, Queue<Tuple<문자열, 더블, 사전<string, double>>> demQueue, ref더블objsub, 객체 queueMutex, 객체 ioMutex)
29{
30 그동안 (사실)
31{
32튜플<string, double, Dictionary<string, double>> demDict;
33잠금(queueMutex)
34{
35 if(0 == demQueue.Count)
36 반환;
37demDict = demQueue.Dequeue();
38}
39
40수비.SyncDB.GetParameter("수요").지우기();
41
42 foreach(KeyValuePair<string, double> kvindemDict.Item3)
43수비.SyncDB.GetParameter("수요").AddRecord(kv.키).= kv.값;
44
46
47잠금(ioMutex)
48Console.WriteLine(" 하위 "+ 하위.모델상태 + " : obj="+ 하위.SyncDB.GetVariable("zsub").첫 번째 레코드().레벨);
49
50 더블확률 = demDict.Item2;
51objsub += 확률 * subi.SyncDB.GetVariable("zsub").첫 번째 레코드().레벨;
52
53 foreach(KeyValuePair<string, double> kvdemDict.Item3)
54{
55cutconst += 확률 * 하위.SyncDB.GetEquation("시장").기록 찾기(kv.키).한계* kv.값;
56cutcoeff[kv.Key] += 확률 * 하위.SyncDB.GetEquation("판매 중").기록 찾기(kv.키).한계;
57}
58}
59}
60
61 정적 공허메인(문자열[] 인수)
62{
64 if(Environment.GetCommandLineArgs().Length > 1)
65ws =신규 슬롯 나라작업공간(systemDirectory: Environment.GetCommandLineArgs()[1]);
66 그밖에
67ws =신규 슬롯 나라작업공간();
68 GAMSJob데이터 = ws.AddJobFromString(GetDataText());
69
71optData.정의.추가("useBig", "1");
72optData.정의.추가("nrScen", "100");
73
74데이터.실행(optData);
75
76optData.폐기();
77 슬롯 나라매개변수scenarioData = 데이터.아웃DB.GetParameter("시나리오데이터");
78
80선택.정의.추가("데이터인", 데이터.아웃DB.이름);
81 int맥시터 = 40;
82선택.정의.추가("맥시터", maxiter.ToString());
83opt.AllModelTypes ="복합체";
84
87
88ws.AddJobFromString(GetMasterText()).실행(선택, cpMaster, 데이터.아웃DB);
89
90 GAMSModelInstancemasteri = cpMaster.AddModelInstance();
91 슬롯 나라매개변수cutconst = masteri.SyncDB.매개변수 추가("cutconst", 1,"벤더 최적성 컷 상수");
92 슬롯 나라매개변수cutcoeff = masteri.SyncDB.매개변수 추가("cutcoeff", 2,"벤더 최적성 계수");
93 슬롯 나라변수세타 = 마스터리.SyncDB.변수 추가("세타", 0,VarType.무료,"미래 이익 함수 변수");
94 슬롯 나라매개변수thetaFix = 마스터리.SyncDB.매개변수 추가("thetaFix", 0,"");
95masteri.인스턴스화("lp를 사용하는 masterproblem max zmaster", 선택,신규 GAMSModifier(cutconst),신규 GAMSModifier(cutcoeff),신규 GAMSModifier(세타,업데이트액션.Fixed, thetaFix));
96
97ws.AddJobFromString(GetSubText()).실행(선택, cpSub, 데이터.아웃DB);
98
99 intnumThreads = 4;
100 GAMSModelInstance[] 수비 =신규 GAMSModelInstance[numThreads];
101큐<Tuple<string, double, Dictionary<string, double>>> demQueue =신규큐<Tuple<string, double, Dictionary<string, double>>>();
102
103subi[0] = cpSub.AddModelInstance();
104 슬롯 나라매개변수수신 = subi[0].SyncDB.매개변수 추가("수신됨", 1,"1단계 솔루션에서 받은 단위");
105 슬롯 나라매개변수수요 = subi[0].SyncDB.매개변수 추가("수요", 1,"확률적 수요");
106수비[0].인스턴스화("LP를 사용하는 하위 문제 최대 zsub", 선택,신규 GAMSModifier(수신),신규 GAMSModifier(요구));
107
108 (inti = 1; i < 스레드 수; 나++)
109subi[i] = subi[0].CopyModelinstance();
110
111선택.폐기();
112
113 더블하한 =더블.NegativeInfinity, 상한 =더블.PositiveInfinity, objmaster =더블.PositiveInfinity;
114 intiter = 1;
115 할 것
116{
117Console.WriteLine("반복: "+ iter);
118 // 해결 마스터
119 if(1 == 반복)// 첫 번째 반복의 세타 수정
120thetaFix.AddRecord().= 0;
121 그밖에
122thetaFix.Clear();
123
125Console.WriteLine(" 스승님 "+ 마스터리.모델상태 + " : obj="+ 마스터리.SyncDB.GetVariable("z마스터").첫 번째 레코드().레벨);
126 if(1 < 반복)
127상한 = 마스터리.SyncDB.GetVariable("z마스터").첫 번째 레코드().레벨;
128objmaster = 마스터리.SyncDB.GetVariable("z마스터").첫번째 기록().레벨- 세타.첫 번째 레코드().레벨;
129
130 foreach (GAMSSetRecordsin데이터.아웃DB.GetSet("들"))
131{
132사전<string, double> demDict =신규사전<string, double>();
133 foreach (GAMSSetRecordjin데이터.아웃DB.GetSet("j"))
134demDict[j.Key(0)] = 시나리오데이터.기록 찾기(s.Key(0), j.Key(0)).;
135demQueue.Enqueue(신규튜플<문자열, 더블, Dictionary<string, double>>(s.Key(0), 시나리오데이터.기록 찾기(s.키(0),"문제")., demDict));
136}
137
138 for (inti = 0; i < 스레드 수; 나++)
139subi[i].SyncDB.GetParameter("수신됨").지우기();
140 foreach (GAMSVariableRecordrinmasteri.SyncDB.GetVariable("접수됨"))
141{
142cutcoeff.AddRecord(iter.ToString(), r.Key(0));
143 for (inti = 0; i < 스레드 수; 나++)
144subi[i].SyncDB.GetParameter("접수됨").AddRecord(r.Keys).Value = r.레벨;
145}
146
147cutconst.AddRecord(iter.ToString());
148 더블objsubsum = 0.0;
149
150 // 여러 모델 인스턴스를 병렬로 해결
151객체 queueMutex =신규객체();
152객체 ioMutex =신규객체();
153 더블[] objsub =신규 더블[numThreads];
154사전<문자열, 더블>[] coef =신규사전<string, double>[numThreads];
155 더블[] 단점 =신규 더블[numThreads];
156
157 for (inti = 0; i < 스레드 수; 나++)
158{
159coef[i] =신규사전<string, double>();
160 foreach (GAMSSetRecordj데이터.아웃DB.GetSet("j"))
161coef[i].Add(j.Key(0), 0.0);
162}
163
164Parallel.For(0, numThreads, 대리자(inti) ScenSolve(subi[i], ref cons[i], ref coef[i], demQueue, ref objsub[i], queueMutex, ioMutex); );
165
166 for (inti = 0; i < 스레드 수; 나++)
167{
168objsubsum += objsub[i];
169cutconst.기록 찾기(iter.ToString()).+= 단점[i];
170 foreach (GAMSSetRecordj데이터.아웃DB.GetSet("j"))
171cutcoeff.기록 찾기(iter.ToString(), j.Key(0)).+= coef[i][j.Key(0)];
172}
173하한값 = Math.Max(하한값, objmaster + objsubsum);
174
175iter++;
176 if(iter == 맥시터 + 1)
177 던지기 신규예외("반복에서 벤더");
178
179Console.WriteLine(" 하한값: "+ 하한 +" 상한: "+ 상한 +" objmaster: "+ objmaster);
180}그동안((상한 - 하한) >= 0.001 * (1 + Math.Abs(상한)));
181
182masteri.폐기();
183 foreach (GAMSModelInstanceinstin수비)
184인스트.폐기();
185}
186
187 정적문자열 GetDataText()
188{
189문자열 모델 =@"
190세트
191i 공장 /f1*f3/
192j 유통 센터 /d1*d5/
193
194매개변수
195capacity(i) 공장의 단위 용량
196/f1 500, f2 450, f3 650/
197demand(j) 유통 센터의 단위 수요
198/d1 160, d2 120, d3 270, d4 325, d5 700 /
199생산비용 단위 생산비용 /14/
200가격 판매가 /24/
201과잉 재고 제거에 따른 낭비 비용 /4/
202
203테이블 운송 비용(i,j) 단위 운송 비용
204d1 d2 d3 d4 d5
205f1 2.49 5.21 3.76 4.85 2.07
206f2 1.46 2.54 1.83 1.86 4.76
207f3 3.26 3.08 2.60 3.76 4.45;
208
209$ifthen useBig를 설정하지 않음
210설정
211s 시나리오 /lo,mid,hi/
212
213테이블 ScenarioData(s,*) 수요에 대한 가능한 결과 + 확률
214d1 d2 d3 d4 d5 문제
215lo 150 100 250 300 600 0.25
216중간 160 120 270 325 700 0.50
217안녕하세요 170 135 300 350 800 0.25;
218$else
219$nrScen을 설정하지 않은 경우 $set nrScen 10
220s 시나리오 설정 /s1*s%nrScen%/;
221매개변수 ScenarioData(s,*) 수요와 확률에 대한 가능한 결과;
222옵션 시드=1234;
223ScenarioData(s,'prob') = 1/카드;
224ScenarioData(s,j) = 수요(j)*uniform(0.6,1.4);
225$endif
226";
227
228 반환모델;
229}
230
231 정적문자열 GetMasterText()
232{
233문자열 모델 =@"
234세트
235나는 공장
236j 유통 센터
237
238매개변수
239capacity(i) 공장의 단위 용량
240생산비용 단위 생산비용
241transcost(i,j) 단위 운송 비용
242
243$데이터가 설정되지 않은 경우 $abort '데이터가 설정되지 않음'
244$gdxin %datain%
245$load i j 용량 생산 비용 거래 비용
246
247* 벤더 마스터 문제
248$maxiter가 설정되지 않은 경우 $set maxiter 25
249설정
250iter max 벤더 반복 /1*%maxiter%/
251
252매개변수
253최적 컷의 cutconst(iter) 상수
254최적 컷의 cutcoeff(iter,j) 계수
255
256변수
257배송(i,j) 배송
258제품(i) 생산
259수신(j) 수량을 시장으로 보냈습니다.
260마스터 문제의 zmaster 목적 변수
261세타 미래 이익
262양수 변수 배송;
263
264수식
265masterobj 마스터 목적 함수
266production(i) 각 공장의 생산량을 계산
267receive(j) 시장에 보낼 수량을 계산
268optcut(iter) 벤더 최적성 감소;
269
270masterobj..
271zmaster =e= theta -sum((i,j), transcost(i,j)*ship(i,j))
272- 합계(i,prodcost*product(i));
273
274receive(j).. received(j) =e= sum(i, ship(i,j));
275
276생산(i).. 제품(i) =e= 합계(j, 배송(i,j));
277product.up(i) = 용량(i);
278
279optcut(iter).. theta =l= cutconst(iter) +
280sum(j, cutcoeff(iter,j)*수신(j));
281
282모델 마스터문제 /all/;
283
284* 비구속적 컷으로 초기화
285cutconst(iter) = 1e15;
286cutcoeff(iter,j) = eps;
287";
288
289 반환모델;
290}
291
292 정적문자열 GetSubText()
293{
294문자열 모델 =@"
295세트
296나는 공장
297j 유통 센터
298
299매개변수
300demand(j) 유통 센터의 단위 수요
301가격 판매 가격
302과잉 재고 제품 제거에 따른 낭비 비용
303received(j) 수신된 1단계 결정 단위
304
305$데이터가 설정되지 않은 경우 $abort '데이터가 설정되지 않음'
306$gdxin %datain%
307$load i j 수요 가격 낭비 비용
308
309* 벤더스의 하위 문제
310
311변수
312sales(j) 매출(실제 판매)
313폐기물(j) 재고가 과잉된 제품
314하위 문제의 zsub 목적 변수
315긍정변수 매출, 낭비
316
317방정식
318subobj 하위 문제 목적 함수
319판매(j) 받은 것 중 일부가 판매되었습니다.
320market(j) 매출 상한
321;
322
323하위 개체..
324zsub =e= sum(j, 가격*판매(j)) - sum(j, wastecost*waste(j));
325
326판매(j)..판매(j) + 낭비(j) =e= 받음(j);
327
328시장(j).. 판매(j) =l= 수요(j);
329
330모델 하위 문제 /subobj,판매,시장/;
331
332* 초기화 수신됨
333수신(j) = 수요(j);
334";
335
336 반환모델;
337}
338
339}
340}
이 예는 st에 대한 간단한 Benders 분해 방법의 병렬 구현을 보여줍니다...
GAMSModelInstance AddModelInstance(string modelInstanceName=null)
GAMSVariable GetVariable(문자열 변수 식별자)
GAMSParameter GetParameter(문자열 매개변수 식별자)
GAMSSet GetSet(string setIdentifier)
GAMSVariable AddVariable(문자열 식별자, int 차원, VarType varType, 문자열 explanatoryText="")
GAMSEquation GetEquation(문자열 방정식 식별자)
GAMSParameter AddParameter(문자열 식별자, 정수 차원, 문자열 설명텍스트="")
새 GAMSEquationRecord FindRecord(params 문자열[] 키)
슬롯 나라데이터베이스 OutDB
void Run(GAMSOptions gamsOptions=null, GAMSCheckpoint 체크포인트=null, TextWriter 출력=null, Boolean createOutDB=true)
슬롯 나라데이터베이스 SyncDB
void Solve(SymbolUpdateType 업데이트 유형=SymbolUpdateType.BaseCase, TextWriter 출력=null, GAMSModelInstanceOpt miOpt=null)
void Instantiate(string modelDefinition, params GAMSModifier[] modifiers)
사전< 문자열, 문자열 > 정의
새 GAMSParameterRecord FindRecord(params 문자열[] 키)
새 GAMSParameterRecord AddRecord(params 문자열[] 키)
새 GAMSVariableRecord FirstRecord()
GAMSJob AddJobFromString(문자열 gamsSource, GAMSCheckpoint 체크포인트=null, 문자열 jobName=null)
GAMSCheckpoint AddCheckpoint(string checkpointName=null)
GAMSOptions AddOptions(GAMSOptions optFrom=null)
업데이트작업