로드 중...
검색 중...
일치하는 항목 없음
TransportEngine.cs
1사용 중시스템;
2사용 중System.Collections.Generic;
3사용 중시스템.텍스트;
4사용 중시스템.IO;
5사용 중System.Globalization;
6사용 중System.Threading;
7사용 중무료 슬롯;
8
9네임스페이스TransportSeq
10{
22 클래스운송엔진
23{
24 정적 int메인(문자열[] 인수)
25{
27 if(Environment.GetCommandLineArgs().Length > 1)
28ws =신규 무료 슬롯작업공간(systemDirectory: Environment.GetCommandLineArgs()[1]);
29 그밖에
30ws =신규 무료 슬롯작업공간(workingDirectory:@"c:\data\tmp");
31
32 if(파일.존재(경로.결합(ws.작업 디렉터리, "test.txt")))
33파일.삭제(경로.결합(ws.작업 디렉터리, "test.txt"));
34
35 /*
36* 무료 슬롯 엔진의 모든 작업에 필요한 구성 설정
37 */
38 GAMSEngineConfigurationengineConf =신규 GAMSEngineConfiguration(호스트: Environment.GetEnvironmentVariable("엔진_URL"),
39사용자 이름: Environment.GetEnvironmentVariable("엔진_사용자"),
40비밀번호: Environment.GetEnvironmentVariable("엔진_비밀번호"),
41공간: Environment.GetEnvironmentVariable("ENGINE_NAMESPACE"));
42
43 /*
44* GDX 파일로 명시적으로 내보내는 무료 슬롯 구문을 사용하여 문자열의 데이터로 실행
45 */
46 GAMSJobtEdata = ws.AddJobFromString(GetDataText());
47 시도
48{
49tEdata.RunEngine(engineConf, 출력: Console.Out);
50}
51 잡기(예외 예)
52{
53Console.WriteLine("예외 발생:"+ 예: 메시지);
54 반환1;
55}
56tEdata.아웃DB.내보내기(Path.Combine(ws.작업 디렉터리, "tdata.gdx"));
57
58Dictionary<string, double> ExpectLevels =신규사전<문자열, 이중>"seattle.new-york", 0.0 }, {"seattle.chicago", 300.0 }, {"seattle.topeka", 0.0 },
59{"san-diego.new-york", 325.0 }, {"san-diego.chicago", 0.0 }, {"san-diego.topeka", 275.0 } };
60
61 /*
62* 데이터 포함 파일을 정의하는 GAMSOptions 인스턴스를 사용하여 작업 실행
63 */
64 GAMSJobtEmodel = ws.AddJobFromString(GetModelText());
65 사용 중 (무료 슬롯옵션opt = ws.추가옵션())
66{
67선택.정의.추가("gdxincname", "tdata.gdx");
68opt.AllModelTypes ="익스프레스";
69 시도해 보세요
70{
71tEmodel.RunEngine(engineConf,신규HashSet<string>"tdata.gdx"},신규사전<문자열, 문자열>"inex_string", "\"유형\": \"포함\", \"파일\": [\"*.gdx\"]", 선택, 출력: Console.Out);
72}
73 잡기(예외 예)
74{
75Console.WriteLine("예외 발생:"+ 예: 메시지);
76 반환1;
77}
78
79 foreach (GAMSVariableRecordrecintEmodel.아웃DB.GetVariable("x"))
80{
81Console.WriteLine("x("+ Rec.Key(0) +","+ Rec.Key(1) +"): 레벨="+ 추천레벨 + " 한계="+ 추천한계);
82 if(예상레벨[rec.Key(0) +"."+ Rec.Key(1)] != Rec.레벨)
83{
84Console.WriteLine("예상치 못한 결과, 예상 수준: "+ 예상레벨[rec.Key(0) +"."+ rec.Key(1)].ToString());
85 반환1;
86}
87}
88
89 if(파일.존재(경로.결합(ws.작업 디렉터리, "test.txt")))
90{
91Console.WriteLine("Test.txt를 다시 보내서는 안 됩니다. inex_string이 실패했습니다.");
92 반환1;
93}
94}
95
96 /*
97* 동일하지만 암시적 데이터베이스 통신이 있음
98 */
100 사용 중 (무료 슬롯옵션opt = ws.추가옵션())
101{
102 GAMSJobtEa = ws.AddJobFromString(GetDataText());
103 GAMSJobtEb = ws.AddJobFromString(GetModelText());
104 시도
105{
106tEa.RunEngine(engineConf, 출력: Console.Out);
107}
108 잡기(예외 예)
109{
110Console.WriteLine("예외 발생:"+ 예: 메시지);
111 반환1;
112}
113선택.정의.추가("gdxincname", tEa.아웃DB.이름);
114opt.AllModelTypes ="익스프레스";
115 시도해 보세요
116{
117tEb.RunEngine(engineConf, gamsOptions: opt, 체크포인트: cp, 출력: Console.Out, 데이터베이스: tEa.아웃DB);
118}
119 잡기(예외 예)
120{
121Console.WriteLine("예외 발생:"+ 예: 메시지);
122 반환1;
123}
124 foreach (GAMSVariableRecordrecintEb.OutDB.GetVariable("x"))
125{
126Console.WriteLine("x("+ Rec.Key(0) +","+ Rec.Key(1) +"): 레벨="+ 추천레벨 + " 한계="+ 추천한계);
127 if(예상레벨[rec.Key(0) +"."+ Rec.Key(1)] != Rec.레벨)
128{
129Console.WriteLine("예상치 못한 결과, 예상 수준: "+ 예상레벨[rec.Key(0) +"."+ rec.Key(1)].ToString());
130 반환1;
131}
132}
133
134사전<string, double>[] bmultExpected =신규사전<string, double>[2];
135bmultExpected[0] =신규사전<string, double>()"bmult", 0.9 }, {"ms", 1 }, {"ss", 1 }, {"obj", 138.31 } };
136bmultExpected[1] =신규사전<string, double>()"bmult", 1.2 }, {"ms", 4 }, {"ss", 1 }, {"obj", 184.41 } };
137
138 // GAMSCheckpoint에서 초기화되는 새 GAMSJob 생성
139 foreach(사전<문자열, 이중> 장면inbmult예상됨)
140{
141 GAMSJobtEbmult = ws.AddJobFromString("bmult="+ 장면["bmult"].ToString(CultureInfo.CreateSpecificCulture("en-US")) +"; lp를 사용하여 전송 최소 z 해결; ms=transport.modelstat; ss=transport.solvestat;", cp);
142 시도
143{
144tEbmult.RunEngine(engineConf, 출력: Console.Out);
145Console.WriteLine("시나리오 bmult="+ 장면["bmult"].ToString() +":");
146Console.WriteLine(" 모델 상태: "+ tEbmult.아웃DB.GetParameter("ms").첫 번째 레코드().);
147Console.WriteLine(" 해결 상태: "+ tEbmult.아웃DB.GetParameter("ss").첫번째 기록().);
148Console.WriteLine(" 개체: "+ tEbmult.아웃DB.GetVariable("z").첫 번째 레코드().레벨);
149 if(tEbmult.아웃DB.GetParameter("bmult").첫 번째 레코드().!= 장면["bmult"]) Console.WriteLine("예기치 않은 입력, 예상되는 bmult: "+ 장면["bmult"].ToString());반환1; }
150 if(tEbmult.아웃DB.GetParameter("ms").첫 번째 레코드().!= 장면["ms"]) Console.WriteLine("예상치 못한 결과, 예상 ms: "+ 장면["ms"].ToString());반환1; }
151 if(tEbmult.아웃DB.GetParameter("ss").첫 번째 레코드().!= 장면["ss"]) Console.WriteLine("예상치 못한 결과, 예상된 ss: "+ 장면["ss"].ToString());반환1; }
152 if(Math.Round(tEbmult.아웃DB.GetVariable("z").첫 번째 레코드().레벨,2) != 장면["obj"]) Console.WriteLine("예기치 않은 결과, 예상된 객체: "+ 장면["obj"].ToString());반환1; }
153
154}
155 잡기(예외 예)
156{
157Console.WriteLine("예외 발생:"+ 예: 메시지);
158 반환1;
159}
160}
161}
162
163 /*
164* 엔진 작업을 중단하는 방법의 예
165 */
166 GAMSJobjc = ws.AddJobFromGamsLib("입은");
167
168 // 사용할 솔버에 대한 옵션 파일을 정의
169 문자열optFile1Path = Path.Combine(ws.작업 디렉터리, "cplex.opt");
170StreamWriter optFile1 =신규StreamWriter(optFile1Path);
171 // 처음에는 상대 중지 허용 오차를 0으로 설정
172optFile1.WriteLine("epgap 0");
173 // 인터럽트 시 대화형 옵션 설정 활성화
174optFile1.WriteLine("대화형 1");
175 // 인터럽트 시 읽을 새 옵션 파일 정의
176optFile1.WriteLine("iafile cplex.op2");
177optFile1.Close();
178
179 // 새 Cplex 옵션 파일 작성
180 문자열optFile2Path = Path.Combine(ws.작업 디렉터리, "cplex.op2");
181StreamWriter optFile2 =신규StreamWriter(optFile2Path);
182optFile2.WriteLine("epgap 0.1");
183optFile2.Close();
184
185 문자열logPath = Path.Combine(ws.작업 디렉터리, "ej.log");
186 사용 중 (무료 슬롯옵션opt = ws.추가옵션())
187 사용 중(TextWriter 로그파일 =신규StreamWriter(logPath))
188{
189opt.MIP ="복합체";
190opt.OptFile = 1;
191opt.SolveLink =무료 슬롯옵션.ESolveLink.LoadLibrary;
192
193스레드 optThread =신규스레드(신규ThreadStart(대리자 () jc.RunEngine(engineConf,신규HashSet<string> optFile1Path, optFile2Path,"claddat.gdx", gamsOptions: opt, 출력: logFile); ));
194optThread.Start();
195
196 그동안 ()
197{
198 if(파일.존재(logPath) && (신규파일정보(logPath).길이 == 0))
199{
200스레드.수면(500);
201 계속;
202}
203jc.인터럽트();
204Console.WriteLine("새 옵션을 계속하기 위해 Cplex가 중단되었습니다.");
205 휴식;
206}
207
208 // j1이 아직 실행 중이면 완료될 때까지 기다리세요.
209 if(optThread.IsAlive)
210optThread.Join();
211}
212
213 // 모든 것이 예상대로 작동했는지 확인
214부울이 중단되었습니다 =거짓;
215 사용 중(var sr =신규StreamReader(logPath,))
216{
217 for (문자열라인; (라인 = sr.ReadLine()) !=;)//한 줄씩 읽기
218 if(line.Contains("중단됨"))
219{
220중단됨 =;
221 휴식;
222}
223 if(!중단됨)
224{
225Console.WriteLine("솔버가 적어도 한 번은 중단될 것으로 예상됩니다.");
226 반환1;
227}
228}
229Console.WriteLine("성공적으로 중단되었습니다");
230
231 반환0;
232}
233
234 정적문자열 GetDataText()
235{
236문자열 데이터 =@"
237세트
238i 통조림 공장 / 시애틀, 샌디에이고 /
239j 마켓 / 뉴욕, 시카고, 토피카 / ;
240
241매개변수
242
243a(i) 경우에 따라 공장 i의 용량
244/시애틀 350
245샌디에고 600 /
246
247b(j) 경우에 따라 시장 j의 수요
248/ 뉴욕 325
249시카고 300
250토페카 275 / ;
251
252테이블 d(i,j) 거리(천 마일 단위)
253뉴욕 시카고 토피카
254시애틀 2.5 1.7 1.8
255산디에고 2.5 1.8 1.4 ;
256
257스칼라 f 화물(1,000마일당 케이스당 달러) / 90 /
258b다중 수요 승수 / 1 /;
259";
260 반환데이터;
261}
262
263정적문자열 GetModelText()
264{
265문자열 모델 =@"
266세트
267나는 통조림 공장
268j 시장
269
270매개변수
271a(i) 경우에 따라 공장 i의 용량
272b(j) 경우에 따라 시장 j의 수요
273d(i,j) 거리(천 마일)
274천 마일당 케이스당 달러 단위의 스칼라 f 화물
275b다중 수요 승수;
276
277$if 설정되지 않음 gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름 없음'
278$gdxLoad %gdxincname% i j a b d f bmult
279
280$echo 테스트 > test.txt
281
282매개변수 c(i,j) 운송 비용(케이스당 수천 달러) ;
283
284c(i,j) = f * d(i,j) / 1000 ;
285
286변수
287x(i,j) 케이스의 배송 수량
288z 총 운송 비용(천 달러) ;
289
290양수 변수 x ;
291
292방정식
293비용 정의 목적 함수
294공급(i) 공장 i의 공급 제한 준수
295수요(j)는 시장 j의 수요를 충족합니다. ;
296
297비용 .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
298
299공급(i) .. 합계(j, x(i,j)) =l= a(i) ;
300
301수요(j) .. sum(i, x(i,j)) =g= bmult*b(j) ;
302
303모델 전송 /all/ ;
304
305z를 최소화하는 lp를 사용하여 전송을 해결합니다;
306
307스칼라 ms '모델 상태', ss '해결 상태';
308
309x.l, x.m 표시 ;
310";
311
312 반환모델;
313}
314
315}
316}
GAMSVariable GetVariable(문자열 변수 식별자)
GAMSParameter GetParameter(문자열 매개변수 식별자)
무료 슬롯데이터베이스 OutDB
void RunEngine(GAMSEngineConfiguration 엔진 구성, HashSet< 문자열 > extraModelFiles=null, Dictionary< 문자열, 문자열 > 엔진 옵션=null, GAMSOptions gamsOptions=null, GAMSCheckpoint 체크포인트=null, TextWriter 출력=null, 부울 createOutDB=true, 부울 RemoveResults=true, params GAMSDatabase[] 데이터베이스)
사전< 문자열, 문자열 > 정의
새 GAMSParameterRecord FirstRecord()
새 GAMSVariableRecord FirstRecord()
GAMSJob AddJobFromString(문자열 gamsSource, GAMSCheckpoint 체크포인트=null, 문자열 jobName=null)
GAMSJob AddJobFromGamsLib(문자열 모델, GAMSCheckpoint 체크포인트=null, 문자열 jobName=null)
GAMSCheckpoint AddCheckpoint(string checkpointName=null)
GAMSOptions AddOptions(GAMSOptions optFrom=null)
다음은 run_engine 메소드를 사용하여 무료 슬롯 엔진에서 GAMSJob을 실행하는 방법의 예입니다: 함께 보내는 방법...