Posted By

ulisses on 06/17/14


Tagged

code


Versions (?)

code


 / Published in: C++
 

code

  1. #include<ilcplex\ilocplex.h>
  2. #include<iostream>
  3. #include<fstream>
  4. #include<cmath>
  5.  
  6. using namespace std;
  7.  
  8. typedef IloArray<IloNumVarArray> NumVarMatrix;
  9. typedef IloArray<NumVarMatrix> NumVar3DMatrix;
  10. typedef IloArray<NumVar3DMatrix> NumVar4DMatrix;
  11.  
  12. typedef IloArray<IloNumArray> FloatMatrix;
  13. typedef IloArray<FloatMatrix> Float3DMatrix;
  14.  
  15. int main()
  16. {
  17. IloEnv env; //cria o ambiente
  18. IloModel model(env); //cria o modelo
  19. IloExpr obj(env); //cria a expressao referente a f. obj.
  20. IloRangeArray constraints(env); //cria array de restricoes
  21. IloInt t = 2; //regiao pickup/delivery
  22.  
  23. ifstream file("data.txt"); //le do arquivo data.txt
  24.  
  25.  
  26. IloInt n; //le no. de clients
  27. file >> n;
  28. n++;
  29.  
  30. IloInt k; //le no. de caminhoes
  31. file >> k;
  32.  
  33. IloNumArray r(env, k); //pilhas
  34. IloNumArray l(env, k); //comprimentos
  35.  
  36. for(int i=0;i<k;i++) {
  37. file >> r[i] >> l[i];
  38. }
  39.  
  40. // -------------- ## Calculo das coordenadas e matriz de custos ## ---------------------- //
  41.  
  42. float *xcoordpickup = new float [n]; //cria array para coordenadas
  43. float *ycoordpickup = new float [n]; //""
  44. file >> xcoordpickup[0] >> ycoordpickup[0];
  45. for(int i=1;i<n;i++)
  46. file >> xcoordpickup[i] >> ycoordpickup[i]; //le as coordenadas dos pontos
  47. float *xcoorddelivery = new float [n]; //cria array para coordenadas
  48. float *ycoorddelivery = new float [n]; //""
  49. file >> xcoorddelivery[0] >> ycoorddelivery[0];
  50. for(int i=1;i<n;i++)
  51. file >> xcoorddelivery[i] >> ycoorddelivery[i];
  52.  
  53. float **cp = new float*[n];
  54. float **cd = new float*[n];
  55. for(int i=0;i<n;i++) {
  56. cp[i] = new float[n];
  57. cd[i] = new float[n];
  58. }
  59. for(int i=0;i<n;i++) {
  60. for(int j=0;j<n;j++) {
  61. cp[i][j] = sqrt(pow((xcoordpickup[i]-xcoordpickup[j]),2)+pow(ycoordpickup[i]-ycoordpickup[j],2));
  62. cd[i][j] = sqrt(pow((xcoorddelivery[i]-xcoorddelivery[j]),2)+pow(ycoorddelivery[i]-ycoorddelivery[j],2));
  63. }
  64. }
  65.  
  66.  
  67. int sub = pow(2.0,n);
  68.  
  69. int **s = new int*[sub];
  70. for(int i=0;i<sub;i++) {
  71. s[i] = new int[n];
  72. }
  73. for (int i=0; i< sub; i++)
  74. for(int j=0; j<n; j++)
  75. s[i][j]=0;
  76.  
  77. for(int i=0;i< sub;i++) {
  78. for(int j=0;j<n;j++) {
  79. if(i & 1<<j) {
  80. s[i][j]=1;
  81. }
  82. }
  83. }
  84.  
  85.  
  86. //-------------- ## Calculo das coordenadas e matriz de custos ## -------------------- //
  87.  
  88.  
  89. // -------------- ## Inicializacao das variaveis do problema ## ---------------------- //
  90.  
  91. Float3DMatrix custo(env, t);
  92. for(int T = 0; T < t; T++) {
  93. custo[T] = FloatMatrix(env, n);
  94. for(int i=0 ; i < n; i++) {
  95. custo[T][i] = IloNumArray(env, n);
  96. }
  97. }
  98.  
  99. for(int i=0;i<n;i++) {
  100. for(int j=0;j<n;j++) {
  101. custo[0][i][j] = cp[i][j];
  102. }
  103. }
  104. for(int i=0;i<n;i++) {
  105. for(int j=0;j<n;j++) {
  106. custo[1][i][j] = cd[i][j];
  107. }
  108. }
  109.  
  110.  
  111. NumVar4DMatrix x(env,t); //x em 4d
  112. for(int i = 0; i < t; i++) {
  113. x[i] = NumVar3DMatrix(env, k);
  114. for(int j = 0; j < k; j++) {
  115. x[i][j] = NumVarMatrix(env, n);
  116. for(int a = 0; a < n; a++) {
  117. x[i][j][a] = IloNumVarArray(env, n, 0, 1, ILOINT);
  118. }
  119. }
  120. }
  121.  
  122.  
  123. NumVar3DMatrix y(env,t);
  124. for(int i = 0; i < 2; i++) {
  125. y[i] = NumVarMatrix(env, k);
  126. for(int j = 0; j < k; j++) {
  127. y[i][j] = IloNumVarArray(env, n, 0, 1, ILOINT);
  128. }
  129. }
  130.  
  131. // -------------- ## Inicializacao das variaveis do problema ## ---------------------- //
  132.  
  133. for(int i=0;i<n;i++){
  134. delete[] cp[i];
  135. delete[] cd[i];
  136. }
  137. delete[] cp;
  138. delete[] cd;
  139.  
  140. delete[] xcoordpickup;
  141. delete[] ycoorddelivery;
  142.  
  143.  
  144. // --------------------------------- ## MODELO ## ----------------------------------- //
  145. IloExpr obj_part(env);
  146. int i = 0, j = 0;
  147. for(int T = 0 ; T < 2; T++) {
  148. for(i = 0 ; i < n; i++) {
  149. for(j = 0 ; j < n; j++) {
  150. for(int K = 0 ; K < k; K++) {
  151. obj_part += custo[T][i][j]*x[T][k][i][j];
  152. }
  153. }
  154. obj += obj_part;
  155. }
  156. }
  157.  
  158. model.add(IloMinimize(env,obj)); //minimizar para encontrar melhor caminho
  159.  
  160.  
  161. for(int T = 0 ; T < t; T++) {
  162. IloExpr soma(env);
  163. for(int K = 0 ; K < k; K++) {
  164. for(int i = 1 ; i < n; i++) {
  165. for(int j = 0 ; j < n; j++) {
  166. soma += x[T][k][i][j];
  167. }
  168. constraints.add(soma - y[T][k][i] == 0);
  169. }
  170. }
  171. }
  172.  
  173. for(int T = 0 ; T < t; T++) {
  174. IloExpr soma1(env);
  175. for(int K = 0 ; K < k; K++) {
  176. for(int i = 1 ; i < n; i++) {
  177. for(int j = 0 ; j < n; j++) {
  178. soma1 += x[T][k][j][i];
  179. }
  180. constraints.add(IloSum(x[T][k][i]) - soma1 == 0);
  181. }
  182. }
  183. }
  184.  
  185.  
  186. for(int T = 0 ; T < t; T++) {
  187. IloExpr soma2(env);
  188. for(int K = 0 ; K < k; K++) {
  189. for(int i = 0 ; i < n; i++) {
  190. soma2 += x[T][k][0][i];
  191. }
  192. constraints.add(soma2 == 1);
  193. }
  194. }
  195.  
  196.  
  197. for(int T = 0 ; T < t; T++) {
  198. IloExpr soma3(env);
  199. for(int K = 0 ; K < k; K++) {
  200. for(int i = 0 ; i < n; i++) {
  201. soma3 += y[T][k][i];
  202. }
  203. constraints.add(soma3 - l[k]*r[k] <= 0);
  204. }
  205. }
  206.  
  207. for(int K = 0 ; K < k; K++)
  208. for(int i = 0 ; i < n; i++)
  209. constraints.add(y[0][k][i] - y[1][k][i] == 0);
  210.  
  211.  
  212. for(int T = 0 ; T < t; T++) {
  213. IloExpr soma4(env);
  214. for(int i = 0 ; i < n; i++) {
  215. for(int K = 0 ; K < k; K++) {
  216. soma4 += y[T][k][i];
  217. }
  218. constraints.add(soma4 == 1);
  219. }
  220. }
  221.  
  222. for(int K = 0 ; K < k; K++) {
  223. IloExpr expr1(env);
  224. for(int T = 0 ; T < t; T++) {
  225. for (int conj = 0; conj < sub; conj++) {
  226. for(int yl =0; yl < n; yl++) {
  227. if (s[conj][yl] == 1) {
  228. expr1 -= y[T][k][yl];
  229. for(int i = 0 ; i < n; i++) {
  230. expr1 += x[T][k][i][0];
  231. for(int j = 0 ; j < n; j++) {
  232. if (s[conj][i] == 1 && s[conj][j] == 0)
  233. expr1 += x[T][k][i][j];
  234. }
  235.  
  236. }
  237. }
  238. constraints.add(expr1 >= 0);
  239. }
  240. }
  241. }
  242. }
  243.  
  244.  
  245.  
  246. model.add(constraints); //adiciona as restricoes ao modelo
  247.  
  248. // ------------------------- ## MODELO ## ---------------------- //
  249.  
  250. IloCplex cplex(model); //inicializa o modelo no cplex
  251. cplex.setParam(IloCplex::TiLim, 3600);
  252.  
  253. if(!cplex.solve()){ //caso nao haja solucao retorna erro
  254. cerr << "Erro" << endl;
  255. system("pause");
  256. return 1;
  257. }
  258.  
  259. //cout << "\n\n Solucao Otima" << endl;
  260. //cout << "\tValor da obj: " << cplex.getObjValue() << endl; //exibe valor da funcao objetivo
  261. //cout << "\tTabela de caminho: \n";
  262. //cout << "deposito \t{ ";
  263. //for(int j=0 ; j < n; j++)
  264. // cout << cplex.getValue(x[0][j]) << " ";
  265. //cout << " }\n";
  266. //for(int i=1 ; i < n; i++) {
  267. // cout << "cliente " << i << " \t{ ";
  268. // for(int j=0 ; j < n; j++)
  269. // cout << cplex.getValue(x[i][j]) << " "; //exibe as variaveis de decisao em forma de tabela de caminho
  270. //cout << " }";
  271. //cout << endl;
  272. //}
  273.  
  274. for(int i=0;i<sub;i++){
  275. delete[] s[i];
  276. }
  277. delete[] s;
  278.  
  279. system("pause");
  280. return 0;
  281. }

Report this snippet  

You need to login to post a comment.