VinBR

PO - 06/11/2012

May 28th, 2013
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.17 KB | None | 0 0
  1. # # # # # # # # # # # # #
  2. # Pesquisa Operacional #
  3. # Prof. Alexandre Cunha #
  4. # notasdogarcia.blog.com #
  5. # # # # # # # # # # # # #
  6.  
  7. O professor começou um exercicio para exemplificar o caminho mínimo:
  8.  
  9. Seja o grafo:
  10.  
  11. Arcos: (2,1), (3,1), (4,1), (5,1), (2,3), (3,2), (3,4), (4,3), (4,5), (5,4), (2,7), (7,2), (7,3), (7,6) (6,4), (6,5), (8,7), (8,6), (8,5).
  12. Pesos: 7 4 2 4 3 3 1 1 1 1 1 1 5 3 5 3 1 4 6
  13.  
  14. O professor mostrou a iteração.
  15.  
  16. Queremos o caminho mínimo de 8 à 1.
  17.  
  18. para toda aresta (i,j): di-dj <= cij
  19. (ou seja: dj <= di + cij)
  20. (caso contrário dj não é o menor caminho existente, e precisa ser atualizado)
  21.  
  22. Iniciando:
  23. (vamos caminhar de tras para frente)
  24. d8 = 0;
  25. di = inf, para todo i!=8
  26.  
  27. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  28. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  29. 1 | | |
  30.  
  31. Uma distancia dj qualquer em uma iteração deve ser sempre:
  32.  
  33. No dual:
  34. dj <= di + cij
  35.  
  36. No primal:
  37. yi <= cij + yj
  38.  
  39. Na primeira iteração vamos verificar os vertices associados à i = 8:
  40.  
  41. (8,7), (8,6), (8,5)
  42.  
  43. Vamos atualizar a distancia dos vertices 7, 6 e 5 com base nos pesos destas arestas.
  44. E adiciona-los à L, imediatamente após remover o 8.
  45.  
  46. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  47. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  48. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  49.  
  50. agora vamos avaliar as arestas:
  51.  
  52. (7,2), (7,3), (7,6)
  53.  
  54. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  55. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  56. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  57. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  58.  
  59. Agora as arestas:
  60.  
  61. (6,4), (6,5)
  62.  
  63. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  64. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  65. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  66. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  67. 3 | {5,2,3,4} | inf 2 6 9 6 4 1 0 | 5
  68.  
  69. Agora as arestas:
  70.  
  71. (5,4), (5,1)
  72. 1 4
  73.  
  74. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  75. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  76. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  77. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  78. 3 | {5,2,3,4} | inf 2 6 9 6 4 1 0 | 5
  79. 4 | {2,3,4,1} | 10 2 6 7 6 4 1 0 | 2
  80. // Notem que esse método realiza uma busca em largura, porque os novos vertices são adicionados à direita
  81. // e o próximo vertice investigado é o primeiro da esquerda no conjunto L.
  82. // Se o vertice selecionado fosse o primeiro da direita teríamos uma busca em profundidade.
  83.  
  84. Agora note que não é necessário colocar o vertice 1 na lista L, já que nenhuma solução ótima irá passar duas vezes pelo 1.
  85. Logo:
  86.  
  87. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  88. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  89. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  90. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  91. 3 | {5,2,3,4} | inf 2 6 9 6 4 1 0 | 5
  92. 4 | {2,3,4} | 10 2 6 7 6 4 1 0 | 2
  93.  
  94. // Nota: A diferença desse método pra dikstra é a busca em profundidade.
  95. // Nesse algoritmo, há a possibilidade de se recalcular um mesmo vertice mais de uma vez.
  96.  
  97. Agora vamos ver as arestas:
  98.  
  99. (2,7), (2,3), (2,1)
  100.  
  101. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  102. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  103. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  104. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  105. 3 | {5,2,3,4} | inf 2 6 9 6 4 1 0 | 5
  106. 4 | {2,3,4} | 10 2 6 7 6 4 1 0 | 2
  107. 5 | {3,4} | 9 2 5 7 6 4 1 0 | 3
  108.  
  109. Agora as arestas:
  110.  
  111. (3,1), (3,2), (3,4)
  112.  
  113. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i
  114. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  115. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  116. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  117. 3 | {5,2,3,4} | inf 2 6 9 6 4 1 0 | 5
  118. 4 | {2,3,4} | 10 2 6 7 6 4 1 0 | 2
  119. 5 | {3,4} | 9 2 5 7 6 4 1 0 | 3
  120. 6 | {4} | 9 2 5 6 6 4 1 0 | 4
  121.  
  122. Vertices:
  123.  
  124. (4,5), (4,3), (4,1)
  125.  
  126. Iteração | L | d1 d2 d3 d4 d5 d6 d7 d8 | i(nó investigado nessa iteração)
  127. 0 | {8} | inf inf inf inf inf inf inf 0 | 8
  128. 1 | {7,6,5} | inf inf inf inf 6 4 1 0 | 7
  129. 2 | {6,5,2,3} | inf 2 6 inf 6 4 1 0 | 6
  130. 3 | {5,2,3,4} | inf 2 6 9 6 4 1 0 | 5
  131. 4 | {2,3,4} | 10 2 6 7 6 4 1 0 | 2
  132. 5 | {3,4} | 9 2 5 7 6 4 1 0 | 3
  133. 6 | {4} | 9 2 5 6 6 4 1 0 | 4
  134. 7 | {} | 8 2 5 6 6 4 1 0 |
  135.  
  136. Com a lista L vazia o algoritmo pára e nossa solução ótima é d1 = 8.
  137.  
  138. Simples e interessante né?
  139.  
  140. Esse método se difere do Dikstra pela forma como se caminha pela lista L e
  141. Pela possibilidade de se re-calcular um vertice mais de uma vez.
  142.  
  143. y = distancia da origem ao destino.
  144. d = distancia do vertice à origem.
  145.  
  146. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  147.  
  148. Vamos agora aprender a lidar com problemas em grafos aciclicos direcionados.
  149.  
  150. Seja o grafo:
  151.  
  152. (1,2), (1,3), (1,4), (2,5), (3,5), (3,6), (4,5), (4,6), (5,7), (6,7)
  153. 7 8 5 12 8 9 7 13 9 6
  154.  
  155. Programação Dinâmica:
  156.  
  157. Vamos reutilizar valores que já são confiáveis.
  158.  
  159. Algoritmos dinâmicos podem ser implementados recursivamente.
  160.  
  161. ð* partem de i.
  162. ð° chegam em i.
  163.  
  164. Caso base: d1 = 0.
  165.  
  166. Caso genérico: min {dj + cji | (j,i) € ð°(i)} para todo i != origem.
  167.  
  168. // Isso é o suficiente para descrever o algoritmo de distancia mínima para redes aciclicas.
  169.  
  170. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  171.  
  172. i = 2, ..., n
  173.  
  174. d2 = min {d1 + c12} = 7
  175. d3 = min {d1 + c13} = 8
  176. d4 = min {d1 + c14} = 5
  177. d5 = min {d2 + c25, d3 + c35, d4 + c45} = 12
  178. d6 = min {d3 + c36, d4 + c46} = 17
  179. d7 = min {d5 + c57, d6 + c67} = 21
  180.  
  181. Vamos descobrir o caminho a partir das distancias, ou seja o problema dual:
  182.  
  183. Os vertices que desejamos são tais que:
  184.  
  185. (i,j): dj <= di + cij
  186.  
  187. ou
  188.  
  189. (dj-di-cij)=0 (Quando dois caminhos tem a mesma distancia, queremos incluir os 2)
  190.  
  191. Quais os vertices que desejamos?
  192.  
  193. De trás para frente:
  194.  
  195. o vertice (5,7) é o único dos vertices que chegam em 7 cujo custo somado à c57 é igual à 21.
  196.  
  197. Depois adicionamos a aresta (4,5) que é a unica das arestas que chegam nos novos vertices (no caso apenas 5) que tem folga 0.
  198.  
  199. por fim encontramos a aresta (1,4) que é a única com folga 0 que chega em 4.
  200.  
  201. No caso encontramos um único caminho.
  202.  
  203. Poderiamos encontrar dois caminhos de igual distancia.
  204. Ou poderiamos encontrar um caminho cuja distancia até o vertice 7 seja 21, porém ele não comece no vertice 1.
  205. Esse caminho não seria um caminho ótimo.
  206.  
  207. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  208.  
  209. Novo problema:
  210.  
  211. (1,2), (1,3), (1,4), (2,3), (2,5), (3,5), (3,6), (4,3), (4,5), (4,6), (5,7), (6,5), (6,7)
  212. 7 8 5 2 12 8 9 1 7 13 9 4 6
  213.  
  214. A rede é ainda não-ciclica.
  215.  
  216. Como iremos utilizar programação dinâmica, vamos guardar os valores de distancia com base
  217. no numero k de arcos entre o vertice i e o vertice de origem.
  218.  
  219. Ou seja:
  220.  
  221. d(i,k) = distancia mínima da origem até o vertice i com até (não mais que) k arcos.
  222.  
  223. Nota: k > n-1 sendo n o número de vertices não é necessário pois, isso implicaria em ciclo.
  224.  
  225. Definições Iniciais:
  226. d(origem, k) = 0, para todo valor de k entre 0 e n-1.
  227. d(i , 0) = inf. para todo i!=origem.
  228.  
  229. d(i,k) = min { d(i,k-1), d(j,k-1) + cji para todo (j,i) € ð-(i))
  230.  
  231. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  232. 0 | 0 | inf | inf | inf | inf | inf | inf |
  233. 1 | | | | | | | |
  234.  
  235. O algoritimo precisa iterar de forma crescente em relação ao valor de k.
  236.  
  237. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  238. 0 | 0 | inf | inf | inf | inf | inf | inf |
  239. 1 | | 7 | 8 | 5 | inf | inf | inf |
  240.  
  241. Prox. iteração:
  242.  
  243. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  244. 0 | 0 | inf | inf | inf | inf | inf | inf |
  245. 1 | | 7 | 8 | 5 | inf | inf | inf |
  246. 2 | | 7 | 6 | 5 | inf | inf | inf |
  247.  
  248. Prox:
  249. Notem que no cálculo de d(6,2)
  250. consideramos o arco (6,5) e nesse instancia d(5,2) = inf.
  251. portanto na próxima iteração ele pode vir a ser atualizado, pois agora d(5,2) != inf.
  252.  
  253. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  254. 0 | 0 | inf | inf | inf | inf | inf | inf |
  255. 1 | | 7 | 8 | 5 | inf | inf | inf |
  256. 2 | | 7 | 6 | 5 | 12 | 17 | inf |
  257.  
  258. Prox:
  259.  
  260. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  261. 0 | 0 | inf | inf | inf | inf | inf | inf |
  262. 1 | | 7 | 8 | 5 | inf | inf | inf |
  263. 2 | | 7 | 6 | 5 | 12 | 17 | inf |
  264. 3 | | 7 | 6 | 5 | 12 | 15 | 21 |
  265.  
  266. Pen-ultima iteração:
  267.  
  268. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  269. 0 | 0 | inf | inf | inf | inf | inf | inf |
  270. 1 | | 7 | 8 | 5 | inf | inf | inf |
  271. 2 | | 7 | 6 | 5 | 12 | 17 | inf |
  272. 3 | | 7 | 6 | 5 | 12 | 15 | 21 |
  273. 4 | | 7 | 6 | 5 | 12 | 15 | 21 |
  274.  
  275. Se prolongassemos o algoritmo por mais uma iteração aí sim teríamos nosso critério de parada.
  276. Que é uma iteração sem atualizações em nenhum vertice.
  277.  
  278. Bem vamos fazer a última iteração de uma vez:
  279.  
  280. k\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
  281. 0 | 0 | inf | inf | inf | inf | inf | inf |
  282. 1 | | 7 | 8 | 5 | inf | inf | inf |
  283. 2 | | 7 | 6 | 5 | 12 | 17 | inf |
  284. 3 | | 7 | 6 | 5 | 12 | 15 | 21 |
  285. 4 | | 7 | 6 | 5 | 12 | 15 | 21 |
  286.  
  287. Por fim temos nossa última iteração.
  288. E o algoritmo se encerra com duas soluções ótimas.
  289. Se voce observar as iterações temos dois caminhos que chegam ao 7 em peso 21.
  290.  
  291. // Nota: a vantagem desse algoritmo para o dikstra é que voce tem como solução o número de arcos.
  292. // assim voce pode escolher por exemplo o melhor caminho com n arcos, e etc, pode ser útil em um caso especifico.
  293.  
  294. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  295.  
  296. // Fim da aula!
Advertisement
Add Comment
Please, Sign In to add comment