fork download
  1. #include <iostream>
  2. #include "gurobi_c++.h"
  3. #include <cmath>
  4. #include <cstdlib>
  5. using namespace std;
  6.  
  7. //參數定義
  8.  
  9. const int N = 3;
  10. const int V = 1;
  11. double t[N][N];
  12. double x[V][N][N];
  13. const int TMAX=10000;
  14. double rc[V][N];
  15. double lc[N];
  16. double q[V];
  17. double y[V][N];
  18. double c[V];
  19. double r=5;
  20. double ra[V][N];
  21. double Bmin[V];
  22. double battery[V];
  23. double a=1, b=1, f=1, d=1;
  24. double e[N];
  25. double l[N];
  26. double leave[V][N];
  27. double enter[V][N];
  28. double service[N];
  29.  
  30.  
  31. void readfile();
  32.  
  33. int main()
  34. {
  35. try
  36. {
  37. //Gurobi環境設定
  38. GRBEnv test = GRBEnv();
  39. GRBModel model = GRBModel(test);
  40. readfile();
  41. //決策變數定義
  42. GRBVar x[V][N][N];
  43. for (int k = 0;k < V;k++)
  44. {
  45. for (int i = 0;i < N;i++)
  46. {
  47. for (int j = 0;j < N;j++)
  48. {
  49. x[k][i][j]=model.addVar(0, 1, 0, GRB_BINARY);
  50. }
  51. }
  52. }
  53. GRBVar leave[V][N];
  54. for (int k = 0;k < V;k++)
  55. {
  56. for (int i = 0;i < N;i++)
  57. {
  58. leave[k][i]=model.addVar(0,GRB_INFINITY,0,GRB_CONTINUOUS);
  59. }
  60. }
  61. GRBVar enter[V][N];
  62. for (int k = 0;k < V;k++)
  63. {
  64. for (int i = 0;i < N;i++)
  65. {
  66. enter[k][i]=model.addVar(0, GRB_INFINITY, 0, GRB_CONTINUOUS);
  67. }
  68. }
  69. GRBVar ra[V][N];
  70. for (int k = 0;k < V;k++)
  71. {
  72. for (int i = 0;i < N;i++)
  73. {
  74. ra[k][i] = model.addVar(0, GRB_INFINITY, 0, GRB_CONTINUOUS);
  75. }
  76. }
  77. GRBVar y[V][N];
  78. for (int k = 0;k < V;k++)
  79. {
  80. for (int i = 0;i < N;i++)
  81. {
  82. y[k][i] = model.addVar(0, GRB_INFINITY, 0, GRB_CONTINUOUS);
  83. }
  84. }
  85. //整合變數與參數進模型
  86. model.update();
  87.  
  88. //模型限制式撰寫
  89. for (int k = 0;k < V;k++)
  90. {
  91. for (int i = 0;i < N;i++)
  92. {
  93. for (int j = 0;j < N;j++)
  94. {
  95. if (i == j)
  96. {
  97. model.addConstr(x[k][i][j] == 0);
  98. }
  99. }
  100. for(int i=0;i<N;i++)
  101. {
  102. GRBLinExpr LHS = 0;
  103. for (int j = 0;j < N;j++)
  104. {
  105. LHS += x[k][i][j];
  106. }
  107. model.addConstr(LHS == 1);
  108. }
  109. for (int j = 0;j < N;j++)
  110. {
  111. GRBLinExpr LHS1 = 0;
  112. for (int i = 0;i < N;i++)
  113. {
  114. LHS1 += x[k][j][i];
  115. }
  116. model.addConstr(LHS1 == 1);
  117. }
  118. for (int i = 0;i < N;i++)
  119. {
  120. GRBLinExpr LHS1 = 0;
  121. GRBLinExpr LHS2 = 0;
  122. for (int j = 0;j < N;j++)
  123. {
  124. LHS1 += x[k][i][j];
  125. LHS2 += x[k][j][i];
  126. }
  127. model.addConstr(LHS1 - LHS2 == 0);
  128. }
  129. }
  130. }
  131.  
  132.  
  133. for (int k = 0;k < V;k++)
  134. {
  135. for (int i = 0;i < N;i++)
  136. {
  137. for (int j = 0;j < N;j++)
  138. {
  139. model.addConstr(leave[k][i] + t[i][j] - enter[k][j] <= TMAX*(1 - x[k][i][j]));
  140. }
  141. }
  142. }
  143.  
  144. for (int k = 0;k < V;k++)
  145. {
  146. for (int i = 0;i < N;i++)
  147. {
  148. model.addConstr(leave[k][i] >= enter[k][i] + service[i]);
  149. }
  150. }
  151.  
  152. for (int k = 0;k < V;k++)
  153. {
  154. for (int i = 0;i < N;i++)
  155. {
  156. model.addConstr(leave[k][i] >= e[i] + service[i]);
  157. }
  158. }
  159.  
  160. for (int k = 0;k < V;k++)
  161. {
  162. for (int i = 0;i < N;i++)
  163. {
  164. model.addConstr(leave[k][i] <= l[i]);
  165. }
  166. }
  167.  
  168. for (int k = 0;k < V;k++)
  169. {
  170. for (int i = 0;i < N;i++)
  171. {
  172. model.addConstr(leave[k][i] + t[i][0] <= TMAX);
  173. }
  174. }
  175.  
  176. for (int k = 0;k < V;k++)
  177. {
  178. for (int i = 0;i < N;i++)
  179. {
  180. for (int j = 0;j < N;j++)
  181. {
  182. model.addConstr(rc[k][j] <= rc[k][i] - (lc[i] * x[k][i][j]) + (q[k] * (1 - x[k][i][j])));
  183. }
  184. }
  185. }
  186.  
  187. for (int k = 0;k < V;k++)
  188. {
  189. for (int i = 0;i < N;i++)
  190. {
  191. model.addConstrs(rc[k][i] <= q[k]);
  192. }
  193. }
  194.  
  195. for (int k = 0;k < V;k++)
  196. {
  197. for (int i = 0;i < N;i++)
  198. {
  199. for (int j = 0;j < N;j++)
  200. {
  201. model.addConstr(y[k][i] - (c[k] * t[i][j] * x[k][i][j]) + (battery[k] * (1 - x[k][i][j])) >= y[k][j]);
  202. }
  203. }
  204.  
  205.  
  206. for (int k = 0;k < V;k++)
  207. {
  208. for (int i = 0;i < N;i++)
  209. {
  210. for (int j = 0;j < N;j++)
  211. {
  212. model.addConstr(y[k][i] + ra[k][i] + (battery[k] * (1 - x[k][i][j])) >= y[k][j]);
  213. }
  214. }
  215. }
  216.  
  217. for (int k = 0;k < V;k++)
  218. {
  219. for (int i = 0;i < N;i++)
  220. {
  221. model.addConstr(battery[k] - y[k][i] >= ra[k][i]);
  222. }
  223. }
  224.  
  225. for (int k = 0;k < V;k++)
  226. {
  227. for (int i = 0;i < N;i++)
  228. {
  229. for (int j = 0;j < N;j++)
  230. {
  231. model.addConstr(enter[k][i] + (r*ra[k][i]) + (t[i][j] * x[k][i][j]) >= enter[k][j] - (TMAX*(1 - x[k][i][j])));
  232. }
  233. }
  234. }
  235.  
  236. for (int k = 0;k < V;k++)
  237. {
  238. for (int i = 0;i < N;i++)
  239. {
  240. for (int j = 0;j < N;j++)
  241. {
  242. model.addConstr(Bmin[k] <= leave[k][i] - (c[k] * t[i][j] * x[k][i][j]));
  243. }
  244. }
  245. }
  246.  
  247. for (int k = 0;k < V;k++)
  248. {
  249. for (int i = 0;i < N;i++)
  250. {
  251. model.addConstr(y[k][i] <= battery[k]);
  252. }
  253. }
  254.  
  255. model.set(GRB_IntAttr_ModelSense, 1);
  256. GRBQuadExpr Obj = 0;
  257. for (int k = 0;k < V;k++)
  258. {
  259. for (int i = 0;i < N;i++)
  260. {
  261. for (int j = 0;j < N;j++)
  262. {
  263. Obj += (a*t[i][j] * x[k][i][j])+(b*(e[i]-enter[k][i])*x[k][i][j])+(f*(r*ra[k][i])*x[k][i][j])+x[k][0][j];
  264. }
  265. }
  266. }
  267. model.setObjective(Obj);
  268. //最佳化模型
  269. model.optimize();
  270.  
  271. //檢查是否達成最佳化
  272. int status = model.get(GRB_IntAttr_Status);
  273. if (status == GRB_OPTIMAL)
  274. {
  275. //輸出目標式函數以及其值
  276. double ObjValue = model.get(GRB_DoubleAttr_ObjVal);
  277. cout << "目標總成本=" << ObjValue << endl;
  278. }
  279. else if (status == GRB_INF_OR_UNBD) {
  280. cout << "Infeasible or unbounded" << endl;
  281. }
  282. else if (status == GRB_INFEASIBLE) {
  283. cout << "Infeasible" << endl;
  284. }
  285. else if (status == GRB_UNBOUNDED) {
  286. cout << "Uunbounded" << endl;
  287. }
  288. else {
  289. cout << "Optimization was stopped with status" << status << endl;
  290. }
  291.  
  292. double ObjValue = model.get(GRB_DoubleAttr_ObjVal);
  293. cout << "total cost= " << ObjValue << endl;
  294. double LBound = model.get(GRB_DoubleAttr_ObjBound);
  295. cout << "lower bound= " << LBound << endl;
  296.  
  297. }
  298. catch (GRBException e) {
  299. cout << "Error code = " << e.getErrorCode() << endl;
  300. cout << e.getMessage() << endl;
  301. }
  302. catch (...) {
  303. cout << "Exception during optimization" << endl;
  304. }
  305.  
  306. system("PAUSE");
  307. }
  308. void readfile()
  309. {
  310. ifstream fin("traveltime.txt");
  311. ifstream fin1("customerdemand.txt");
  312. ifstream fin2("carloading.txt");
  313. ifstream fin3("carbattery.txt");
  314. ifstream fin4("servicetime.txt");
  315. ifstream fin5("carbatterymin.txt");
  316. ifstream fin6("windowsopen.txt");
  317. ifstream fin7("windowsclose.txt");
  318. ifstream fin8("vehiclecon.txt");
  319.  
  320.  
  321. for (int i = 0;i < N;i++)
  322. {
  323. for (int j = 0;j < N;j++)
  324. {
  325. fin >> t[i][j];
  326. //cout << t[i][j]<<" ";
  327. }
  328. //cout<<endl;
  329. }
  330. for (int i = 0;i < V;i++)
  331. {
  332. fin1 >> lc[i];
  333. fin2 >> q[i];
  334. fin3 >> battery[i];
  335. fin4 >> service[i];
  336. fin5 >> Bmin[i];
  337. fin6 >> e[i];
  338. fin7 >> l[i];
  339. fin8 >> c[i];
  340.  
  341. }
  342.  
  343. }
  344.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp:2:24: fatal error: gurobi_c++.h: No such file or directory
compilation terminated.
stdout
Standard output is empty