로드 중...
검색 중...
일치하는 항목 없음
transportEngine.cpp
이 파일의 문서로 이동하세요.
1
25#include "피망 슬롯h"
26#include "gamsengineconfiguration.h"
27#include "gamsvariablerecord.h"
28
29#include <cmath>
30#include <iostream>
31#include <fstream>
32#include <파일 시스템>
33#include <예외>
34#include <gamspath.h>
35
36#ifdef _WIN32
37#include <stdlib.h>
38#endif
39
40네임스페이스 사용게임;
41네임스페이스 사용표준;
42네임스페이스 사용std::string_literals;
43
44정적 문자열 getDataText()
45{
46 문자열데이터
47R"(
48세트
49i 통조림 공장 / 시애틀, 샌디에이고 /
50j 마켓 / 뉴욕, 시카고, 토피카 / ;
51
52매개변수
53
54a(i) 경우에 따라 공장 i의 용량
55/시애틀 350
56샌디에고 600 /
57
58b(j) 경우에 따라 시장 j의 수요
59/ 뉴욕 325
60시카고 300
61토페카 275 / ;
62
63테이블 d(i,j) 거리(천 마일 단위)
64뉴욕 시카고 토피카
65시애틀 2.5 1.7 1.8
66산디에고 2.5 1.8 1.4 ;
67
68스칼라 f 화물(1,000마일당 케이스당 달러) / 90 /
69b다중 수요 승수 / 1 /;
70)"s
71};
72 반환데이터;
73}
74
75정적 문자열 getModelText()
76{
77 문자열모델
78R"(
79세트
80나는 통조림 공장
81j 시장;
82
83매개변수
84a(i) 경우에 따라 공장 i의 용량
85b(j) 경우에 따라 시장 j의 수요
86d(i,j) 거리(천 마일)
87천 마일당 케이스당 달러 단위의 스칼라 f 화물
88b다중 수요 승수;
89
90$if 설정되지 않음 gdxincname $abort '제공된 데이터 파일에 대한 포함 파일 이름 없음'
91$gdxLoad %gdxincname% i j a b d f bmult
92
93$echo 테스트 > test.txt
94
95매개변수 c(i,j) 운송 비용(케이스당 수천 달러) ;
96c(i,j) = f * d(i,j) / 1000 ;
97
98변수
99x(i,j) 케이스의 배송 수량
100z 총 운송 비용(수천 달러) ;
101
102양수 변수 x ;
103
104수식
105비용 정의 목적 함수
106공급(i) 공장 i의 공급 제한 준수
107수요(j)는 시장 j의 수요를 충족합니다. ;
108
109비용 .. z =e= sum((i,j), c(i,j)*x(i,j)) ;
110공급(i) .. 합계(j, x(i,j)) =l= a(i) ;
111수요(j) .. sum(i, x(i,j)) =g= bmult*b(j) ;
112
113모델 전송 /all/ ;
114
115z를 최소화하는 lp를 사용하여 전송을 해결합니다;
116
117스칼라 ms '모델 상태', ss '해결 상태';
118
119x.l, x.m 표시 ;
120)"s
121};
122 반환모델;
123}
124
134int 메인(intargc,문자* 인수[])
135{
136cout <<"------------ 운송 엔진 ------------"<< endl;
137
138 GAMSWorkspaceInfowsInfo;
139 if(인수 > 1)
140wsInfo.setSystemDirectory(argv[1]);
142
143파일 시스템::remove(ws.workingDirectory().append("/test.txt"));
144
145 문자열envValues[4] = ;
146
147 문자열envPrefix("엔진_");
148 int색인 = 0;
149 for (const 문자열&id: {"URL", "사용자", "비밀번호", "NAMESPACE"}) {
150
151#ifdef _WIN32
152 문자*버퍼;
153 size_tlen;
154errno_t err = _dupenv_s( &buffer, &len, (envPrefix +id).c_str() );
155 if(err == 0 && 버퍼)
156envValues[index++] = 문자열(버퍼);
157무료(버퍼);
158}그밖에{
159무료(버퍼);
160cerr <<"엔진 없음_"<<id<<" 설정"<< endl;
161 반환-1;
162}
163#else
164 const 문자* 값 = getenv((envPrefix +id).c_str());
165 if(!값)
166cerr <<"엔진 없음_"<<id<<" 설정"<< endl;
167 반환-1;
168}그밖에{
169envValues[index++] = 값;
170}
171#endif
172}
173
174GAMSEngineConfiguration 엔진Conf(envValues[0], envValues[1],
175envValues[2], envValues[3]);
176
177 // GDX 파일로 명시적으로 내보내는 피망 슬롯 구문을 사용하여 문자열의 데이터로 실행
178 GAMSJobjobData = ws.addJobFromString(getDataText());
179 피망 슬롯옵션defaultOptions = ws.addOptions();
180
181cout <<"실행 1"<< endl;
182jobData.runEngine(engineConf, &defaultOptions,nullptr, &cout);
183jobData.outDB().do내보내기(파일 시스템::absolute(ws.workingDirectory().append("/tdata.gdx")).string());
184
185map<string, double> ExpectLevels ="seattle.new-york", 0.0 },
186{"seattle.chicago", 300.0 },
187{"seattle.topeka", 0.0 },
188{"san-diego.new-york", 325.0 },
189{"san-diego.chicago", 0.0 },
190{"san-diego.topeka", 275.0 }
191};
192
193
194 GAMSJobjobModel = ws.addJobFromString(getModelText());
195
196 피망 슬롯옵션opt = ws.addOptions();
197선택.setDefine("gdxincname", "tdata.gdx");
198선택.setAllModelTypes("익스프레스");
199
200 // 데이터 포함 파일을 정의하는 GAMSOptions 인스턴스를 사용하여 작업 실행
201cout <<"실행 2"<< endl;
202jobModel.runEngine(engineConf, &opt,nullptr, &cout, ,"tdata.gdx"},
203{
204{"inex_string", "\"유형\": \"포함\", \"파일\": [\"*.gdx\"]"}
205});
206
207 for (GAMSVariableRecord&rec : 직업 모델.outDB().get변수("x")) {
208cout <<"x("<< Rec.key(0) <<","+ Rec.key(1) <<"): 레벨="<< Rec.level()
209<<"한계="<< Rec.marginal() <<"\n";
210
211 if(expectedLevels.at(rec.key(0).append(".").append(rec.key(1))) != rec.level())
212cout <<"예상치 못한 결과, 예상 수준: "
213<< 예상 레벨.at(rec.key(0).append(".").append(rec.key(1)))
214<< endl;
215 반환1;
216}
217}
218
219 if(filesystem::exists(filesystem::path(ws.workingDirectory()).append("test.txt"))) {
220cout <<"Test.txt를 다시 보내서는 안 됩니다 - inex_string 실패"<< endl;
221 반환1;
222}
223
224 // 동일하지만 암시적 데이터베이스 통신이 있음
225 피망 슬롯체크포인트cp = ws.addCheckpoint();
226{
227 피망 슬롯옵션opt = ws.addOptions();
228 GAMSJobjobA = ws.addJobFromString(getDataText());
229 GAMSJobjobB = ws.addJobFromString(getModelText());
230
231cout <<"실행 3"<< endl;
232직업A.runEngine(engineConf, &defaultOptions,nullptr, &cout);
233
234선택.setDefine("gdxincname", 직업A.outDB().이름());
235선택.setAllModelTypes("익스프레스");
236
237cout <<"실행 4"<< endl;
238직업B.runEngine(engineConf, &opt, &cp, &cout, 벡터<GAMSDatabase>jobA.outDB()});
239
240 for (GAMSVariableRecord&rec : 직업B.outDB().get변수("x")) {
241cout <<"x("<< Rec.key(0) <<","+ Rec.key(1) <<"): 레벨="<< Rec.level()
242<<"한계="<< Rec.marginal() <<"\n";
243
244 if(expectedLevels.at(rec.key(0).append(".").append(rec.key(1))) != rec.level())
245cout <<"예상치 못한 결과, 예상 수준: "
246<< 예상 레벨.at(rec.key(0).append(".").append(rec.key(1)))
247<< endl;
248 반환1;
249}
250}
251벡터<map<string, double>> bmultExpected
252{{"bmult", 0.9 }, {"ms", 1 }, {"ss", 1 }, {"obj", 138.31 } },
253{{"bmult", 1.2 }, {"ms", 4 }, {"ss", 1 }, {"obj", 184.41 } }
254};
255
256 for(map<string, double> &m : bmultExpected)
257 GAMSJobtEbmult = ws.addJobFromString("bmult="+ to_string(m["bmult"])
258 + "; lp를 사용하여 전송 최소 z 해결; ms=transport.modelstat; "
259 "ss=transport.solvestat;", cp);
260 시도해 보세요{
261cout <<"실행 5"<< endl;
262tEbmult.runEngine(engineConf, &defaultOptions,nullptr, &cout);
263cout <<"시나리오 bmult="<< to_string(m["bmult"]) <<":"<< endl;
264cout <<" 모델 상태: "<< tEbmult.outDB().getParameter("ms").첫 번째 레코드().() << endl;
265cout <<" 해결 상태: "<< tEbmult.outDB().getParameter("ss").첫 번째 레코드().() << endl;
266cout <<" 개체: "<< tEbmult.outDB().getVariable("z").첫 번째 레코드().레벨() << endl;
267 if(tEbmult.outDB().getParameter("bmult").첫 번째 레코드().() != m["bmult"]) {
268cout <<"예기치 않은 입력, 예상되는 bmult: "+ to_string(m["bmult"]) << endl;
269 반환1;
270}
271 if(tEbmult.outDB().getParameter("ms").첫 번째 레코드().() !=m["ms"]) {
272cout <<"예상치 못한 결과, 예상 ms: "+ to_string(m["ms"]);
273 반환1;
274}
275 if(tEbmult.outDB().getParameter("ss").첫 번째 레코드().() !=m["ss"]) {
276cout <<"예상치 못한 결과, 예상된 ss: "+ to_string(m["ss"]);
277 반환1;
278}
279 if(팹(tEbmult.outDB().get변수("z").첫 번째 레코드().레벨() - m["obj"]) > 0.01)
280cout <<"예상치 못한 결과, 예상된 객체: "+ to_string(m["obj"]);
281 반환1;
282}
283
284}
285 잡기(예외 예)
286cout <<"예외 발생:"<< ex.what() << endl;
287 반환1;
288}
289}
290}
291
292 // 엔진 작업을 중단하는 방법 예
293 GAMSJobjc = ws.addJobFromGamsLib("입은");
294
295 // 사용할 솔버에 대한 옵션 파일을 정의
296 문자열optFile1Path = 파일 시스템::path(ws.workingDirectory().append("/cplex.opt")).string();
297{
298ofstream optFile1(optFile1Path);
299
300 // 처음에는 상대 중지 허용 오차를 0으로 설정
301optFile1 <<"epgap 0"<< endl;
302 // 인터럽트 시 대화형 옵션 설정 활성화
303optFile1 <<"interactive 1"<< endl;
304 // 인터럽트 시 읽을 새 옵션 파일 정의
305optFile1 <<"iafile cplex.op2"<< endl;
306}
307
308 // 새 Cplex 옵션 파일 작성
309 문자열optFile2Path = 파일 시스템::path(ws.workingDirectory().append("/cplex.op2")).string();
310{
311ofstream optFile2(filesystem::path(ws.workingDirectory().append("/cplex.op2")));
312optFile2.open(optFile2Path);
313optFile2 <<"epgap 0.1"<< endl;
314optFile2.close();
315}
316
317opt = ws.addOptions();
318
319선택.setMIP("복합체");
320선택.setOptFile(1);
322
323cout <<"실행 6"<< endl;
324
325 문자열logPath = 파일 시스템::path(ws.workingDirectory().append("/ej.log")).string();
326{
327ofstream 로그파일(logPath);
328스레드 optThread(&GAMSJob::runEngine, &jc,engineConf, &opt,nullptr, &로그파일,
329벡터<GAMSDatabase>(), set<string> optFile1Path, optFile2Path,"claddat.gdx"},
330순서가 지정되지 않은_맵<문자열, 문자열>(),, 사실);
331
332 그동안(filesystem::exists(logPath) && filesystem::is_empty(logPath))
333this_thread::sleep_for(500ms);
334
335jc.인터럽트();
336cout <<"새 옵션을 계속하기 위해 Cplex가 중단되었습니다."<< endl;
337
338 if(optThread.joinable())
339optThread.join();
340}
341
342{
343 문자열라인;
344ifstream inLog(logPath);
345 그동안(getline(inLog, line))
346 if(line.find("중단됨") != 문자열::npos)
347cout <<"성공적으로 중단되었습니다"<< endl;
348 반환0;
349}
350}
351cout <<"솔버가 적어도 한 번은 중단될 것으로 예상됩니다."<< endl;
352 반환1;
353}
354
355cout <<"성공적으로 중단되었습니다"<< endl;
356
357 반환0;
358}
void doExport(const std::string &filePath="")
GAMSParameter getParameter(const std::string &name)
GAMSVariable getVariable(const std::string &name)
void runEngine(const GAMSEngineConfiguration &engineConfiguration, GAMSOptions *gamsOptions, 피망 슬롯::GAMSCheckpoint *checkpoint, std::ostream *output=nullptr, const std::Vector< 피망 슬롯::GAMSDatabase > &databases=, const std::set< std::string > &extraModelFiles=, const std::unordered_map< std::string, std::string > &engineOptions=, bool createOutDB=true, bool RemoveResults=true)
피망 슬롯데이터베이스 outDB()
void setAllModelTypes(const std::string &solver)
void setMIP(const std::string &value)
void setDefine(const std::string &key, const std::string &value)
void setSolveLink(const GAMSOptions::ESolveLink::ESolveLinkEnum value)
void setOptFile(const int value)
GAMSParameterRecord firstRecord(const std::벡터< std::string > &slice)
GAMSVariableRecord firstRecord(const std::벡터< std::string > &slice)
void setSystemDirectory(const std::string &systemDir)
std::string getDataText()
string getModelText()
int main(int argc, char *argv[])