VinBR

PO - 08/11/2012

May 28th, 2013
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.78 KB | None | 0 0
  1. # # # # # # # # # # # # #
  2. # Pesquisa Operacional #
  3. # Prof. Alexandre Cunha #
  4. # notasdogarcia.blog.com #
  5. # # # # # # # # # # # # #
  6.  
  7. Na próxima aula estaremos falando da biblioteca que utilizaremos no tp.
  8. // A biblioteca se chama GLPK e é escrita na linguagem C.
  9.  
  10. O tp terá como foco a materia de "decomposição de Dantzig Wolf".
  11.  
  12. (nota Dantzig Wolf, cai na segunda prova)
  13.  
  14. // Estude essa materia até a prox aula 13/11, pois ajudará a compreender o tp
  15.  
  16. O TP é portanto resolver o problema de corte de chapas (otimização inteira)
  17. utilizando a biblioteca GLPK em C.
  18.  
  19. (nota solta: o professor segue mais ou menos o livro do Dimitris Bertsimas)
  20.  
  21. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  22.  
  23. Problema do Fluxo Máximo. (maxFlow)
  24.  
  25. A entrada é uma rede D formada com vertices V e arcos A
  26.  
  27. Existem dois vertices especiais de V: s - flux Source(origem), e t - flux Target(destino).
  28.  
  29. Os arcos são limitados pela capacidade cij que é o limite de fluxo que pode passar por eles.
  30. // Note que isso é a capacidade e não o custo.
  31.  
  32. Objetivo:
  33. Encontrar o máximo fluxo que pode ser enviado da origem s à t respeitando as capacidades dos arcos.
  34.  
  35. Variáveis de decisão:
  36.  
  37. xij = quantidade de fluxo que efetivamente passa pelo arco (i,j).
  38.  
  39. Restrições:
  40.  
  41. (I) xij >= 0 e xij <= cij
  42.  
  43. A última restrição é a de balanço de fluxo.
  44.  
  45. Cada nó intermediario (todos exceto s e t) tem de dar saída a tudo que recebem de entrada:
  46.  
  47. // Lembrando:
  48. // ð*(i) = conjunto de arcos que partem de i.
  49. // ð°(i) = conjunto de arcos que chegam em i.
  50.  
  51. Então:
  52.  
  53. (II) sum (j,i)€ð°(i) xji - sum (i,j)€ð*(i) = 0 para todo i
  54. // Somatório do que entra - o que saí = 0.
  55.  
  56. Agora vamos supor um arco artificial (t,s) indo do destino para origem.
  57.  
  58. Vamos portanto assumir que tudo que chega em t, volta para s por este arco.
  59. Logo o fluxo nesse arco é o fluxo em todo o sistema.
  60.  
  61. A capacidade desse arco deve ser a maior possível.
  62. Consideremos a maior possível a soma de todas as capacidades dos demais arcos.
  63.  
  64. Dessa forma fica fácil definir nosso objetivo.
  65.  
  66. max xts = min -xts
  67.  
  68. // onde xts é o fluxo de t para s.
  69.  
  70. Com isso nosso problema se torna um problema de fluxo de custo mínimo.
  71.  
  72. Outra vantagem muito interessante desse arco é que a lei de balanço se aplica também para s e t.
  73. Já que eles também estão passando pra frente tudo que recebem.
  74.  
  75. CONCEITOS:
  76. Vetor de fluxo x:
  77.  
  78. É uma solução viável que satisfaz as duas restrições (I) e (II)
  79.  
  80. CONCEITO:
  81. Capacidade residual é a capacidade que um arco tem de desfazer um fluxo.
  82. Representa-se isso com um arco artificial no sentido oposto, para indicar isso.
  83.  
  84. Ex: há fluxo em (i,j) de 3 unidades.
  85. A capacidade residual de (i,j) diminui em 3 unidades.
  86. A capacidade residual de (j,i) aumenta em 3 unidades, se o arco j,i não existia antes, cria-se um.
  87.  
  88. CONCEITO:
  89. Um caminho residual é o caminho construído somente com os arcos cuja capacidade residual != 0.
  90. (ou seja arcos onde ainda pode-se passar fluxo, ou deixar de passar fluxo contrário)
  91. (inicialmente, o grafo de caminhos residuais é igual ao grafo original)
  92.  
  93. Se existe um caminho residual entre s e t logo voce não está na solução ótima.
  94.  
  95. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  96.  
  97. Agora que já definimos o problema de fluxo máximo, vamos explicar um algoritmo para resolve-lo:
  98.  
  99. Algoritmo de Ford Fuckerson - Algoritmo de Caminhos Aumentados:
  100.  
  101. a) Dado um vetor de fluxo x, construa a rede residual associada a x.
  102.  
  103. b) Encontre um caminho na rede residual que conecte origem s ao destino t.
  104.  
  105. Caso 1:
  106. Existe um caminho.
  107. Então: Ð (delta maiusculo) = capacidade do arco de menor capacidade residual neste caminho.
  108.  
  109. Aumente essa capacidade alongo de todos os arcos deste caminho. Obtendo um novo vetor de fluxo.
  110.  
  111. Isso significa que o fluxo máximo agora cresceu em Ð unidades.
  112.  
  113. Caso 2:
  114. Não existe um caminho.
  115. Então voce já está no fluxo máximo.
  116.  
  117. Teorema: Se não há caminho de aumento para o vetor de fluxo x. Então o vetor atual é ótimo.
  118.  
  119. O algoritmo é portanto simples (o dificil é entender a tal da rede residual =P).
  120.  
  121. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  122.  
  123. Exemplo:
  124.  
  125. Grafo Original:
  126. Arestas: (O,A), (O,B), (O,C), (A,B), (A,D), (B,C), (B,D), (B,E), (C,E), (D,T), (E,D), (E,T)
  127. Capacidades: 5 7 4 1 3 2 4 5 4 9 1 6
  128.  
  129. Vamos partir do vetor de fluxo zerado, onde não há fluxo algum.
  130.  
  131. O primeiro passo é encontrar um caminho entre O e T, e então aumentar o fluxo por ele tanto quando possível.
  132.  
  133. Vamos achar esse caminho com Busca em largura:
  134. Lista L = {O}
  135. (O = origem, mudamos o nome de s para O =P)
  136.  
  137. Vamos investigar recursivamente:
  138.  
  139. O lado esquerdo contém os vertices sendo explorados,
  140. o direito contém os vertices inexplorados que já são alcançados pelos vertices explorados.
  141.  
  142. | {O}
  143. O | {A,B,C}
  144. A | {B,C,D}
  145. B | {C,D,E}
  146. C | {D,E}
  147. D | {E,T}
  148. T
  149. // Note que o vertice E nem chegou a ser investigado.
  150. // Pois já encontramos um caminho investigando D.
  151.  
  152. Pronto encontramos o nosso primeiro caminho até T.
  153. O caminho passa por: {O,A,D,T}
  154.  
  155. Observando nosso caminho o menor arco residual tem capacidade 3 (fica mais fácil entender desenhando).
  156.  
  157. logo:
  158.  
  159. Na primeira busca encontramos um Ð de 3.
  160.  
  161. Vamos incrementar todos os elementos nesse caminho de 3 unidades.
  162.  
  163. Note que agora a nossa rede residual, que mostra só as capacidades residuais, perdeu o arco (A,D)
  164. E ganhou 3 arcos no sentidos: (T,D), (D,A), (A,O).
  165. Todos os 3 tem capacidade 3.
  166.  
  167. Grafo Residual:
  168. Arestas: (O,A), (O,B), (O,C), (A,O), (A,B), (B,C), (B,D), (B,E), (C,E), (D,A), (D,T), (E,D), (E,T), (T,D)
  169. Capacidades: 5 7 4 3 1 2 4 5 4 3 9 1 6 3
  170.  
  171. Note que é importante isso de que sempre existe um caminho residual contrário ao sentido de qualquer fluxo.
  172.  
  173. Isso permite que sempre exista um caminho entre O e T mesmo depois de exaurirmos a maior parte dos arcos, pois podemos desfazer um arco.
  174.  
  175. Segunda iteração: vamos investigar um novo caminho:
  176.  
  177. | {O}
  178. O | {A,B,C}
  179. A | {B,C}
  180. B | {C,D,E}
  181. C | {D,E}
  182. D | {E,T}
  183. T
  184.  
  185. Segundo caminho encontrado: {O,B,D,T) onde a menor capacidade residual é Ð=4.
  186.  
  187. Vamos atualizar nossa rede residual com um novo fluxo de 4 unidades no sentido desse caminho.
  188. Isso gera uma rede contrária
  189.  
  190. // Note que o segundo caminho surgiu devido a inexitencia do arco residual (A,D)
  191.  
  192. | {O}
  193. O | {A,B,C}
  194. A | {B,C}
  195. B | {C,E}
  196. C | {E}
  197. E | {D,T}
  198. T
  199.  
  200. Novo caminho: {O,B,E,T}
  201. A menor capacidade residual é do arco: (O,B) com Ð=3
  202.  
  203. Incrementamos o fluxo em todo nosso caminho em 3 unidades.
  204.  
  205. Nova iteração:
  206.  
  207. | {O}
  208. O | {A,C}
  209. A | {B,C}
  210. B | {C,E}
  211. C | {B,E}
  212. B | {E,C}
  213. E | {C,D,T}
  214. T
  215.  
  216. Novo caminho: {O,C,E,T} com Ð = 3 em (E,T)
  217.  
  218. Nova iteração:
  219.  
  220. | {O}
  221. O | {A,C}
  222. A | {B,C}
  223. C | {B,E}
  224. B | {E}
  225. E | {D}
  226. D | {T}
  227. T
  228.  
  229. Novo caminho: {O,C,E,D,T}
  230.  
  231. Ð = 1 em 3 arcos: (O,C), (C,E), (E,D)
  232.  
  233. Aumentamos o fluxo nestes 3 arcos.
  234.  
  235. | {O}
  236. O | {A}
  237. A | {B}
  238. B | {C,E}
  239. C | {E}
  240. E |
  241.  
  242. Não encontramos mais um caminho pela rede residual.
  243. Logo estamos no ótimo e o nosso vetor de fluxo está no estado ótimo.
  244.  
  245. O último caminho que encontramos foi o {O,A,B,C,E}
  246. Os que não encontramos foram: {D,T}
  247.  
  248. Os arcos que estão no corte entre o primeiro grupo e o segundo somados dão 14.
  249.  
  250. Esse é o valor do nosso corte mínimo (que é um outro problema).
  251.  
  252. O problema do corte mínimo portanto pode ser obtido como solução extra do problema do fluxo máximo.
  253. Interessante não?
  254. Um é o dual do outro =].
  255.  
  256. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  257.  
  258. // E o dual desse problema é outro problema interessante:
  259. Problema do Corte Mínimo em Rede
  260.  
  261. Mas vamos falar de tudo isso nas próximas aulas.
  262.  
  263. // fim da aula!
Advertisement
Add Comment
Please, Sign In to add comment