VinBR

PO - 20/11/2012

May 28th, 2013
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.47 KB | None | 0 0
  1. # # # # # # # # # # # # #
  2. # Pesquisa Operacional #
  3. # Prof. Alexandre Cunha #
  4. # notasdogarcia.blog.com #
  5. # # # # # # # # # # # # #
  6.  
  7. Sobre a documentação do tp:
  8.  
  9. O que salvar de cada instancia do TP:
  10.  
  11. Instancias | Solução ótima | NCols | tempo(s) | tempo de precificação em percentual do total.
  12.  
  13. Rode várias instancias e gere uma tabela.
  14.  
  15. Isso basta como documentação.
  16.  
  17. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  18.  
  19. Vamos voltar a falar do
  20.  
  21. Fluxo Máximo de Ford e Fulkerson
  22.  
  23. a) Dado um vetor de fluxo X, determine a rede residual associada à X
  24. e procure um caminho (direcionado) entre a origem s e o destino de fluxo t.
  25.  
  26. Possibilidades:
  27.  
  28. 1 ) Não existe caminho na rede residual que resolve o problema do fluxo máximo.
  29. Pare, o problema está resolvido.
  30.  
  31. 2 ) Existe um caminho então:
  32. Determine a capacidade máxima do caminho (o MIN das capacidades residuais deste caminho),
  33. chamemos ela de Ð
  34.  
  35. Agora aumente o fluxo ao longo do caminho em Ð unidades de fluxo.
  36. Obtendo um novo X que é o vetor de fluxo.
  37. Atualize a Rede Residual.
  38.  
  39. Repita tudo.
  40.  
  41. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  42.  
  43. Vamos focar nossa aula especificamente na etapa A.
  44. Na parte onde procuramos um caminho entre s e t.
  45.  
  46. Existem diversas formas de pesquisar por estes caminhos e cada forma acaba implicando em um algortimo com características diferentes.
  47.  
  48. Vamos estudar o algoritmo de Dinic que é um dos mais eficientes.
  49.  
  50. REVISÃO:
  51. O professor desenhou no quadro o que significa as capacidades residuais com base em um vetor de fluxo.
  52.  
  53. Dado o grafo:
  54.  
  55. Arestas: (s,1), (c,2), (2,1), (1,t), (2,t)
  56. Capacid: C C 1 C C
  57.  
  58. O professor mostrou um caso em que nós acabamos explorando um número de caminhos muito maior do que o necessário.
  59.  
  60. O Algoritmo de Dinic evetaria esse excesso de exploração de caminhos.
  61.  
  62. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  63.  
  64. Algoritmo de Fluxo Máximo de Dinic (cuja única diferença é a etapa de busca de caminhos):
  65.  
  66. - É um algoritmo de caminhos de aumento.
  67. - Opera também sobre um vetor de fluxo, construindo a rede residual.
  68. - Difere de FF (Ford Fuckerson) pelo modo como os caminhos de aumento são encontrados.
  69. Gera caminhos de aumento de fluxo que empreguem número mínimo de arcos na rede residual.
  70.  
  71. Em outras palavras esse algoritmo faz uma busca em largura.
  72. E detecta vários caminhos com o número de arcos igual à iteração por vez.
  73.  
  74. Assim teremos vários caminhos de aumento.
  75.  
  76. Usaremos "labels" associados aos vertices:
  77. - k(t) = 0
  78. - k(i): Representa o número mínimo de arcos em algum caminho de i a t.
  79. // Repare que vamos caminhar de t para s, ou seja do destino para a origem.
  80.  
  81. Assim a cada iteração o que acontece é o seguinte:
  82. Voce faz uma busca em profundidade (num era em largura?) até encontrar os menores caminhos possíveis.
  83. (menores em número de arcos)
  84.  
  85. Usa eles para atualizar seu vetor X e sua rede residual.
  86.  
  87. Repita o algoritimo agora a distancia mínima em número de arcos deverá ser maior que a anterior.
  88.  
  89. Repetindo esse processo chegara um ponto onde a distancia é infinita indicando o critério de parada do algoritmo.
  90.  
  91. - - - - -
  92.  
  93. Determinar os labels K(i) : i € V
  94. determinamos os arcos que podem participar de caminhos de aumento:
  95.  
  96. | K(i) | K(j) | | K=0 |
  97. | | | | |
  98. | | | | |
  99. | | | | |
  100.  
  101. Consideramos dois tipos de arco:
  102.  
  103. // Os fluxos "reais" por assim dizer
  104. (i,j): k(i) = k(j) + 1 xij < cij
  105.  
  106. // Os fluxos mais "residuais" por assim dizer, gerados ao reduzir o fluxo por um caminho.
  107. (i,j): k(i) + 1 = k(j) xij > 0
  108.  
  109. // Nota FF não funciona com valores não-reais. (pode não convergir, mas até que funciona)
  110. // Esse funciona.
  111. // Esse também é mais eficiente.
  112.  
  113. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  114.  
  115. Exemplo:
  116.  
  117. Seja o grafo:
  118.  
  119. // Notação para os Arcos:
  120. // AB#: A - vertice de origem do arco
  121. // B - Vertice de destino do arco
  122. // # - Capacidade do arco)
  123.  
  124. oa5, ob7, oc4,
  125. ab1, ad3,
  126. bd4, be5,
  127. cb2, ce4,
  128. dt9,
  129. ed1, et6
  130.  
  131. Inicialmente temos o vetor de fluxo 0.
  132.  
  133. Rede residual inicial:
  134.  
  135. ... é identico ao grafo original:
  136.  
  137. oa5 , ob7 , oc4 ,
  138. ab1 , ad3 ,
  139. bd4 , be5 ,
  140. cb2 , ce4 ,
  141. dt9 ,
  142. ed1 , et6 ,
  143.  
  144. (para indicar caminhos de volta vou usar uma barra ex: oa4/1)
  145.  
  146. // Lembrando estamos caminhando de t para o
  147. | k=3 | k=2 | k=1 | k=0 |
  148. | o | a b c | d e | t |
  149.  
  150. Pronto, encontramos os caminhos mínimos (em numero de arcos) até O.
  151.  
  152. Vamos desenhar os arcos minimais:
  153.  
  154. | | | | |
  155. | oa5 | ad3 | dt9 | |
  156. | ob7 | bd4 | et6 | |
  157. | oc4 | be5 | | |
  158. | | ce4 | | |
  159. | | | | |
  160.  
  161. Então notem que chegamos em O por vários caminhos:
  162.  
  163. oa5 - ad3 - dt9 -> oadt
  164. ob7 - bd4 - dt9 -> obdt
  165. ob7 - be5 - et6 -> obet
  166. oc4 - ce4 - et6 -> ocet
  167.  
  168. Ou seja encontramos todos os caminhos que chegam de t à o em 3 arcos.
  169. Por isso chamamos de "arcos minimais" os arcos que fazem parte de um caminho mínimo em numero de arcos.
  170.  
  171. Vamos pegar um caminho destes:
  172.  
  173. oadt Ð=3 (Lembrando que Ð é o fluxo máximo que se pode passar por esse caminho)
  174.  
  175. Aumento o fluxo pelo caminho.
  176.  
  177. obdt Ð=4
  178.  
  179. Aumento o fluxo pelo caminho (lembre de considerar os fluxos anteriores)
  180.  
  181. ocet Ð=4
  182.  
  183. Aumento o fluxo pelo caminho (senão voce pode ultrapassar a capacidade de algum arco)
  184.  
  185. obet Ð=2
  186.  
  187. Aumento o fluxo pelo caminho
  188.  
  189. Fim de uma iteração do método.
  190.  
  191. Agora atualizo meu vetor de fluxo.
  192. E atualizo minha rede residual:
  193.  
  194. oa2/3 ob1/6 oc0/4
  195. ab1 ad0/3
  196. bd0/4 be3/2
  197. cb2 ce0/4
  198. dt2/7
  199. ed1 et0/6
  200.  
  201. // Note que as capacidades diminuiram, algumas chegaram à 0.
  202. // E ao mesmo tempo surgiram numeros após a barra que indicam a capacidade de desfazer o fluxo naquela direção.
  203. // E que podem ser pensados como arestas no sentido oposto, ou esja et0/6 é igual à: et0 e te6
  204.  
  205. Nova busca em largura:
  206.  
  207. | k=4 | k=3 | k=2 | k=1 | k=0 |
  208. | o | b | e | d | t |
  209.  
  210. Agora os arcos mínimos:
  211.  
  212. | ob | be | ed | dt | |
  213.  
  214. Achamos só um camiho com k=4:
  215.  
  216. ob - be - ed - dt -> obedt
  217.  
  218. Caminho:
  219.  
  220. obedt Ð=1
  221.  
  222. Atualiza rede mínima.
  223.  
  224. Fim da segunda iteração.
  225. Atualiza vetor de fluxo e rede residual:
  226.  
  227. oa2/3 ob0/7 oc0/4
  228. ab1 ad0/3
  229. bd0/4 be2/3
  230. cb2 ce0/4
  231. dt1/8
  232. ed0/1 et0/6
  233.  
  234. Vamos buscar os arcos mínimos:
  235.  
  236. | k=1 | k=0 |
  237. | d | t |
  238.  
  239. E só.
  240. Logo não é mais possível alcançar a origem a partir do destino.
  241. E assim nosso algoritmo alcançou o estado ótimo.
  242.  
  243. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  244.  
  245. Agora vamos fazer uma brincadeira.
  246. Vamos pegar todos os arcos do nosso vetor de fluxo que chegam em d ou t.
  247.  
  248. et0/6
  249. ed0/1
  250. ad0/3
  251. bd0/4
  252.  
  253. Vamos somar seus fluxos: 6+1+3+4 = 14
  254.  
  255. Esse é o fluxo máximo.
  256.  
  257. E o conjunto d t é o nosso conjunto de corte mínimo.
  258.  
  259. Esse é um resultado muito importante.
  260. Pois conhecendo o corte mínimo fica fácil calcular um limite máximo de fluxo aceitável para a rede.
  261.  
  262. E outra coisa interessante é que esta conclusão é gerada pelo problema dual.
  263. Ou seja: o dual do fluxo máximo = corte mínimo.
  264.  
  265. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  266.  
  267. // Fim da aula!
Advertisement
Add Comment
Please, Sign In to add comment