VinBR

PO - 13/11/2012

May 28th, 2013
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.75 KB | None | 0 0
  1. # # # # # # # # # # # # #
  2. # Pesquisa Operacional #
  3. # Prof. Alexandre Cunha #
  4. # notasdogarcia.blog.com #
  5. # # # # # # # # # # # # #
  6.  
  7. GLPK - Gnu Linear Programin Kit
  8.  
  9. Linguagem: C
  10.  
  11. // Prompt glpsol. nao vamos falar hoje
  12.  
  13. Instalação GLPK:
  14.  
  15. www.gnu.org/software/glpk/
  16.  
  17. www.cs.unb.ca/~bremner/docs/glpk/glpk.pdf (documentação)
  18.  
  19. montagem:
  20.  
  21. baixe o tar.gz de ftp.gnu.org/gnu/glpk
  22. va na pasta com o tar digite:
  23. tar -xvzf nome tar.gz
  24. ./configure
  25. make
  26. sudo make install
  27.  
  28. export LD_LIBRARY_PATH="/usr/local/lib"
  29.  
  30. Compilação em C puro:
  31.  
  32. gcc -o nomesaida problema.c -I /home/user_name/prog/glpk_install/glpk-4.47/src/ -lglpk
  33.  
  34. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  35.  
  36. max z = 10 x1 + 6x2 + 4x3
  37. suj a
  38. p = x1 + x2 + x3
  39. q = 10 x1 + 4x2 + 5x3
  40.  
  41. #include <glpk.h>
  42.  
  43. glp_prob *lp;
  44.  
  45. lp = glp_create_prob();
  46.  
  47. // Nome do problema:
  48. glp_set_prob_name(lp, "sample");
  49. // problema de máximização:
  50. glp_set_obj_dir(lp, GLP_MAX);
  51.  
  52. // Agora vamos criar as restrições e dar nomes à ela
  53. glp_add_rows(lp, 3);
  54. // Colocar nome é opcional mas é assim que se faz:
  55. glp_set_row_name(lp, 1, "p");
  56. // bnds = bounds (o lado direito do problema)
  57. // GLP_UP faz ele olhar o parametro 100; o 100 é o limite superior o 0 é o inferior
  58. glp_set_row_bnds(lp, 1, GLP_UP, 0.0, 100.0);
  59.  
  60. glp_add_cols(lp, 3);
  61. glp_set_col_name(lp, 1, "x1");
  62. glp_set_row_bnds(lp, 1, GLP_LO, 0.0, 0.0);
  63. // Seta o obj no coeficiente.
  64. glp_set_obj_coef(lp, 1, 10);
  65.  
  66. // Matriz A:
  67.  
  68. glp_load_matrix(lp, 9, ia, ja, ar);
  69. // ia ja são vetores inteiros e ar um vetor de double, todos pré-preenchidos.
  70.  
  71. // Resolve o problema:
  72. glp_simplex (lp,NULL);
  73.  
  74. // Mostra solução:
  75. total colunas = glp_get_num_cols(lp);
  76. for(i=1; i<= total colunas; i++)
  77. {
  78. printf("...", glp_get_col_prim(lp, i));
  79. }
  80.  
  81. // Variaveis duais:
  82. total linhas = glp_get_num_rows(lp);
  83. for...
  84. printf ... glp_get_row_dual(lp, i) ... ;
  85.  
  86. // variáveis inteiras? faça:
  87. glp_set_col_kind (lp, j, GLP_IV)
  88.  
  89. // variáveis binárias? faça:
  90. glp_set_col_kind (lp, j, GLP_BV)
  91.  
  92. // variáveis continuas? (ou seja o default) faça:
  93. glp_set_col_kind (lp, j, GLP_CV)
  94.  
  95. // antes de chamar o glp_simplex()
  96. // e depois chame o:
  97. glp_intopt(lp, NULL);
  98.  
  99. exibe os resultados:
  100. z = glp_mip_obj_val(lp);
  101. xj = glp_mip_col_val(lp, j)
  102.  
  103. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  104.  
  105. // Vamos falar agora de geração de colunas.
  106.  
  107. Incluir a coluna:
  108.  
  109. glp_add_cols(lp, 1);
  110.  
  111. j = glp_get_num_cols(lp);
  112.  
  113. glp_set_col_bnds(lp, j, GLP_LO, 0, 0);
  114. glp_set_obj_coef(lp, j, 1.0);
  115.  
  116. // A nova coluna tem os valores: 0,3,0,5,0 assim temos de fazer:
  117.  
  118. indice[1]=2;
  119. indice[2]=4;
  120. valor[1]=3;
  121. valor[2]=5;
  122.  
  123. glp_set_mat_col(lp, j, 2, indice, valor);
  124. // 2 é o len dos arrais indice e valor
  125. // j é o indice da coluna desejada.
  126.  
  127. // NOTA: Não trabalhe a partir do indice 0.
  128.  
  129. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  130.  
  131. // Adicionar uam restrição:
  132. É bom construir uma cópia do problema antes de adicionar restrições.
  133.  
  134. // NOTA SOLTA: problema do branch and bound voce copia seu problema adciona restricoes inteiras e escolhe a melhor delas.
  135.  
  136. glp_prob* L[MAX];
  137. L[tam+1] = glp_create_prob();
  138.  
  139. // agora cópia:
  140. glp_copy_prob(L[tam+1], P, GLP_OFF);
  141. // o monitor não sabe bem o que o GLP_OFF, ele sabe que existe o GLP_ON
  142.  
  143. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  144.  
  145. // Adiciona restrição:
  146. glp_add_rows(lp, 1);
  147. i = glp_get_num_rows(lp);
  148. xj = glp_get_col_prim(lp,j);
  149. glp_set_row_bnds(lp,i,GLP_LO, ceil(xj), 0);
  150.  
  151. indice[1] = j; valor[1] = 1;
  152. glp_set_mat_row(lp, i, 1, indice, valor);
  153. // indice indica a coluna j.
  154.  
  155. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  156.  
  157. Problema do Corte de Barras:
  158.  
  159. Comprar uma quantidade mínima de barras de aço, todas com comprimento W
  160.  
  161. Restrição:
  162. Produzir bi barras de comprimentos wi distintos. Assuma que wi<=W e wi inteiro para cada i = [0,m].
  163.  
  164. versões do problema:
  165. - Não Inteira
  166. Geração de Colunas
  167. - Inteira
  168. Compro quantidades inteiras de barras de tamanho W.
  169. Modelo de kantorovich
  170. branch-and-price
  171.  
  172. Objetivo:
  173. minimizar o número de barras utilizadas com um máximo de K.
  174.  
  175. Modelo de Kantorovich:
  176.  
  177. sum(k=1,K) x0k
  178.  
  179. sum(k=1,K) xik >= bi, i=[1,m]
  180.  
  181. sum(i=1,m) wi xik <= W x0k, k=[1,K]
  182.  
  183.  
  184.  
  185. xij = i=> qual das barras grandes será utilizada para o corte.
  186. j=> qual dos modelos de barra pequena será cortado.
  187.  
  188. exceto o x0, que é um binário (boleano) dizendo se a barra é usada ou não.
  189.  
  190. // Nota formato do arquivo de entrada:
  191.  
  192. W
  193. m
  194. w1 b1
  195. w2 b2
  196. ...
  197. wm bm
  198.  
  199. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  200.  
  201. Corte de Barras - Geração de Colunas
  202.  
  203. Problema:
  204.  
  205. min(j=1,n) xj
  206.  
  207. suj. sum sum(j=1,n) aij Xj = bi
  208.  
  209. xj >= 0, i = [1,m], j = [1,n]
  210.  
  211. tranformando:
  212. max (i=1,m) pi ai
  213. suj. sum(i=1,m) wi ai <= w
  214.  
  215. ai >= 0 e inteiro. i=[1,m]
  216.  
  217. Algoritmo:
  218.  
  219. construa uma versão restrita do problema com apenas m restrições e mvariáveis.
  220.  
  221. Gere colunas até que a coluna de menor custo reduzido tenha cj >=0
  222. - Resolva o problema restrito com o GLPK
  223. - colete os valores das variaveis duais no problema mestre.
  224. - Gere uma nova coluna j resolvendo o problema da mochinla inteira ( nao é mochila 0/1)
  225. - se o custo reduzdio cj <0 adicione o novo padrão de corte Aj na versão restrita do problema
  226.  
  227. Exiba a solução do problema
  228.  
  229. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  230.  
  231. Referencias:
  232. manual:
  233. www.cs.unb.ca/~bremner/docs/glpk/glpk.pdf (documentação)
  234.  
  235. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  236.  
  237. // Fim da aula!
Advertisement
Add Comment
Please, Sign In to add comment