VinBR

PO - 30/10/2012

May 28th, 2013
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.24 KB | None | 0 0
  1. # # # # # # # # # # # # #
  2. # Pesquisa Operacional #
  3. # Prof. Alexandre Cunha #
  4. # notasdogarcia.blog.com #
  5. # # # # # # # # # # # # #
  6.  
  7. Problema do transporte.
  8.  
  9. É um caso particular do problema do transbordo onde
  10. todo vertice ou é demandante, ou é ofertante.
  11. Não há meio termo.
  12.  
  13. Definição do problema:
  14.  
  15. É um problema onde nenhum vertice é ofertante e demandante ao mesmo tempo.
  16.  
  17. Então eu tenho um conjunto "of" de vertices que fornecem material para
  18. um conjunto "dm" de vertices demandantes.
  19.  
  20. Cada vertice fornecedor é equilibrado e portanto ele oferece tudo o que ele tem mesmo que exceda a demanda.
  21.  
  22. Nosso objetivo então é:
  23.  
  24. //
  25. // Notação:
  26. // Oi = oferta de i
  27. // Dj = demanda de j
  28. // xij = fluxo pelo vertice ij
  29. //
  30.  
  31. min sum (i€of, j€dm) cij xij
  32.  
  33. sum(j=1,n) xij = Oi, para todo i€of
  34. sum(i=1,m) xij = Dj, para todo j€dm
  35.  
  36. xij >= 0
  37.  
  38. // Em outras palavras:
  39. // Minimizar o somatorio de "fluxo × custo" das arestas.
  40. // Garantindo que todo vertice ceda exatamente o tanto que oferta.
  41. // e que todo vertice receba exatamente o tanto que demanda.
  42.  
  43. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  44.  
  45. Vamos começar um exemplo:
  46.  
  47. O grafo exemplo possuí 3 ofertantes e 4 demandantes.
  48. Existem arestas entre todos eles com os seguintes custos:
  49.  
  50. of/dm | 1 | 2 | 3 | 4 |
  51. 1 | 2 | 3 | 11 | 7 |
  52. 2 | 1 | 0 | 6 | 1 |
  53. 3 | 5 | 8 | 15 | 9 |
  54.  
  55. Ofertas: Demandas:
  56. (of1) oferece 6 (dm1) demanda 7
  57. (of2) oferece 1 (dm2) demanda 5
  58. (of3) oferece 10 (dm3) demanda 3
  59. (dm4) demanda 2
  60.  
  61. Note que "sum ofertas = sum demandas"
  62.  
  63. A sol. viável inicial proposta pelo professor foi:
  64.  
  65. (of1)---6---->(dm1)
  66.  
  67. (of2)---1---->(dm2)
  68.  
  69. (of3)---1---->(dm1)
  70. 4---->(dm2)
  71. 3---->(dm3)
  72. 2---->(dm4)
  73.  
  74. Expressando isso em forma de tabela temos:
  75.  
  76. of/dm | 1 | 2 | 3 | 4 |
  77. 1 |2) 6 |3) |11) |7) |
  78. 2 |1) |0) 1 |6) |1) |
  79. 3 |5) 1 |8) 4 |15) 3 |9) 2 |
  80.  
  81. Onde o valor entre parentesis é o custo, e o outro valor é o fluxo.
  82.  
  83. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  84.  
  85. Vamos especializar o Simplex para o problema do transporte.
  86.  
  87. Vamos assumir que Dispomos de uma sol. Viável Inicial para o problema.
  88.  
  89. Passos básicos:
  90.  
  91. 1) Det. Custos Reduzidos das variáveis não básicas.
  92. 2) Pivoteamento.
  93.  
  94. Lembrando o prob. Original era:
  95.  
  96. min sum (i€of, j€dm) cij xij
  97.  
  98. sum(j=1,n) xij = Oi, para todo i€of
  99. sum(i=1,m) xij = Dj, para todo j€dm
  100.  
  101. Vamos escrever o dual desse problema nas variáveis Vi e Wj (i€of, j€dm):
  102.  
  103. max sum(i=1,m) Oi Vi + sum(j=1,n) Dj Wj
  104.  
  105. Vi + Wj <= cij, onde (i,j) € A ( ou seja (i,j) com "i € of" e "j € dm" )
  106.  
  107. Vi e Wj são variáveis ilimitadas (negativas ou positivas tanto faiz)
  108.  
  109. Seja B o conjunto de arcos que formam a solução básica atual.
  110.  
  111. (1) cij - Vi - Wj = 0, (i,j) € B
  112. // A equação acima é uma versão justa das restrições do dual.
  113. // Ela vai ser verdadeira para toda variável básica.
  114. // (Ela vale para as variáveis básicas por causa do Teorema das Folgas Complementares)
  115. // (a restrição ser justa implica que Fij = 0 logo, a variável primal associada deve ser básica)
  116. // (Lembrando o Teorema das F. C. diz que: Fij * xij = 0, ou seja um deles deve ser 0 sempre)
  117. _
  118. (2) Cij = cij - Vi - Wj, (i,j) € N
  119. // Para as não básicas, ela não vai dar 0, _
  120. // o resultado dela será nosso custo reduzido Cij.
  121.  
  122. Note que a equação (1) nos dá m+n variáveis (Vi e Wj)
  123. porém apenas n+m-1 restrições, se zerarmos arbitrariamente uma variável (coloca-la como não-básica),
  124. teremos um sistema viável com uma única solução.
  125. Usaremos (1) para descobrir o valor de Vi e Wi, zerando um deles arbitrariamente.
  126.  
  127. Note que a equação (2) dá != de 0 para todos os (i,j) não básicos.
  128. Esse é nosso custo reduzido.
  129. A restrição original era da forma:
  130.  
  131. Vi + Wj <= cij ou cij - Vi - Wj >= 0
  132. _
  133. Logo se Cij for negativo, temos uma restrição infringida no dual.
  134. Isso como falamos na aula passada significa que a variável associada no primal
  135. deveria entrar na base para se aproximar da solução ótima.
  136.  
  137. Portanto será dessa forma que iremos calcular o custo reduzido no exemplo abaixo,
  138. utilizando as variáveis duais.
  139.  
  140. Com isso já sabemos obter os V`s e W`s que são variáveis duais.
  141. E com eles:
  142.  
  143. 2) Calculamos o custo reduzido e
  144.  
  145. 3) Escolhemos a variável que vai sair.
  146.  
  147. Quando vamos escolher qual arco deverá ter seu fluxo acrescido (a partir de 0) temos que escolher um para sair.
  148. Ou seja essa é a troca de variáveis.
  149.  
  150. O professor desenhou um quadro para expressar o problema:
  151.  
  152. Matriz de custos abaixo:
  153. | | | | | Oi | Vi | of |
  154. |2) 6 |3) |11) |7) | 6 | | 1 |
  155. |1) |0) 1 |6) |1) | 1 | | 2 |
  156. |5) 1 |8) 4 |15) 3 |9) 2 | 10 | | 3 |
  157.  
  158. Dj | 7 | 5 | 3 | 2 | | | |
  159. Wj | | | | | | | |
  160. dm | 1 | 2 | 3 | 4 | | | |
  161.  
  162. Notem que na tabela acima, eu coloquei valor de fluxo em 6 celulas da tabela de custos.
  163. Logo as demais celulas (arestas) tem fluxo zero.
  164.  
  165. Isso significa que tenho 6 variáveis básicas.
  166.  
  167. As variáveis duais indicam o fluxo nos arcos.
  168.  
  169. Calculando a dual:
  170.  
  171. B: {(1,1) (3,1), (2,2), (3,2), (3,3), (3,4)}
  172. _
  173. cij = cij - vi - wj = 0 para todo i,j € B
  174.  
  175. (1,1): 2 - v1 - w1 = 0
  176. (2,2): 0 - v2 - w2 = 0
  177. (3,1): 5 - v3 - w1 = 0
  178. (3,2): 8 - v3 - w2 = 0
  179. (3,3): 15 - v3 - w3 = 0
  180. (3,4): 9 - v3 - w4 = 0
  181.  
  182. O professor decidiu zerar v3.
  183. Assim v1 = -3
  184. v2 = -8
  185. v3 = 0 (arbitráriamente)
  186. w1 = 5
  187. w2 = 8
  188. w3 = 15
  189. w4 = 9
  190.  
  191. Vamos escrever:
  192.  
  193. | | | | | Oi | Vi | of |
  194. |2) 6 |3) |11) |7) | 6 | -3 | 1 |
  195. |1) |0) 1 |6) |1) | 1 | -8 | 2 |
  196. |5) 1 |8) 4 |15) 3 |9) 2 | 10 | 0 | 3 |
  197.  
  198. Dj | 7 | 5 | 3 | 2 | | | |
  199. Wj | 5 | 8 | 15 | 9 | | | |
  200. dm | 1 | 2 | 3 | 4 | | | |
  201.  
  202. Agora podemos calcular o custo reduzido das não-básicas com o método falado acima:
  203.  
  204. ~c12 = c12 - v1 - w2 = -2
  205. ~c13 = c13 - v1 - w3 = -1
  206. ~c14 = c14 - v1 - w4 = 1
  207. ~c21 = c21 - v2 - w1 = 4
  208. ~c23 = c23 - v2 - w3 = -1
  209. ~c24 = c24 - v2 - w4 = 0
  210. // (Nota: eu testei o que aconteceria se zerassemos W2 ao invez de V3
  211. // os calculos acima teriam os mesmos resultados para todos os ~cij)
  212. // (isso prova que não faz diferença qual das variáveis duais nós escolhemos para zerar)
  213.  
  214. Vamos então escreve-los em uma tabela
  215. (o professor escreveu na tabela original)
  216. (mas isso significa 3 numeros por quadrado da tabela O.O)
  217. (aqui no computador ia ficar um caos, vou fazer outra tabela)
  218.  
  219. (CRed)
  220. of\dm | 1 | 2 | 3 | 4 |
  221. 1 | 0 | -2 | -1 | 1 |
  222. 2 | 4 | 0 | -1 | 0 |
  223. 3 | 0 | 0 | 0 | 0 |
  224.  
  225. Notem que os candidatos à entrar na base tem custo reduzido negativo.
  226. As variáveis de base tem custo = 0.
  227. E as demais tem custo não-negativo (aquelas que não iam contribuir em nada com o objetivo).
  228.  
  229. Nossa escolha será sempre feita com base na variável não básica de menor indice (Critério de Blonde)
  230. no caso: (1,2)
  231.  
  232. Com esse pivoteamento teremos algumas consequencias:
  233. Vamos ter que diminuir o fluxo em (1,1), aumentar em (3,1) e diminuir em (3,2)
  234.  
  235. Esse pivoteamento está sujeito à algumas equações limitantes:
  236.  
  237. Seja teta o tanto que (1,2) vai aumentar de fluxo.
  238.  
  239. Aumentanto o teta em (1,2) implica em menos fluxo em (1,1)
  240. Como (1,1) não pode ter fluxo negativo:
  241. (1) 6-teta >= 0
  242.  
  243. O mesmo se aplica ao (3,2) como ele não pode ter fluxo negativo:
  244. (2) 4-teta >= 0
  245.  
  246. Obviamente o maior aumento que teta pode fazer é 4, pois
  247. a equação (2) é a que mais o limita.
  248.  
  249. logo:
  250.  
  251. teta* <= 4
  252. // O asterisco denota "solução"
  253.  
  254. Então o valor máximo de fluxo que (1,2) pode assumir é 4 (antes ele era 0).
  255.  
  256. Assim a posição (3,2) agora fica com fluxo 0, ou seja ele saiu da base! =].
  257.  
  258. Vamos atualizar a tabela:
  259.  
  260. | | | | | Oi | Vi | of |
  261. |2) 2 |3) 4 |11) |7) | 6 | -3 | 1 |
  262. |1) |0) 1 |6) |1) | 1 | -8 | 2 |
  263. |5) 5 |8) |15) 3 |9) 2 | 10 | 0 | 3 |
  264.  
  265. Dj | 7 | 5 | 3 | 2 | | | |
  266. Wj | 5 | 8 | 15 | 9 | | | |
  267. dm | 1 | 2 | 3 | 4 | | | |
  268.  
  269. Agora podemos apagar os calculos que fizemos na tabela (CRed)
  270. E os outros valores duais que calculamos:
  271.  
  272. | | | | | Oi | Vi | of |
  273. |2) 2 |3) 4 |11) |7) | 6 | | 1 |
  274. |1) |0) 1 |6) |1) | 1 | | 2 |
  275. |5) 5 |8) |15) 3 |9) 2 | 10 | | 3 |
  276.  
  277. Dj | 7 | 5 | 3 | 2 | | | |
  278. Wj | | | | | | | |
  279. dm | 1 | 2 | 3 | 4 | | | |
  280.  
  281. Zerando v3 e calculando os valores das demais variaveis duais temos:
  282.  
  283. cij - vi - wj = 0 para todo i,j € B
  284.  
  285. (1,1): 2 - v1 - w1 = 0
  286. (1,2): 3 - v1 - w2 = 0
  287. (2,2): 0 - v2 - w2 = 0
  288. (3,1): 5 - v3 - w1 = 0
  289. (3,3): 15 - v3 - w3 = 0
  290. (3,4): 9 - v3 - w4 = 0
  291.  
  292. O professor decidiu zerar v3 de novo.
  293. Assim v1 = -3 w1 = 5
  294. v2 = -6 w2 = 6
  295. v3 = 0 (arbitrário) w3 = 15
  296. w4 = 9
  297.  
  298. Tabela atualizada:
  299. | | | | | Oi | Vi | of |
  300. |2) 2 |3) 4 |11) |7) | 6 | -3 | 1 |
  301. |1) |0) 1 |6) |1) | 1 | -6 | 2 |
  302. |5) 5 |8) |15) 3 |9) 2 | 10 | 0 | 3 |
  303.  
  304. Dj | 7 | 5 | 3 | 2 | | | |
  305. wj | 5 | 6 | 15 | 9 | | | |
  306. dm | 1 | 2 | 3 | 4 | | | |
  307.  
  308. Calculando o custo reduzido:
  309. _
  310. cij = cij - vi - wj
  311.  
  312. ~c13 = c13 - v1 - w3 = -1
  313. ~c14 = c14 - v1 - w4 = 1
  314. ~c21 = c21 - v2 - w1 = 2
  315. ~c23 = c23 - v2 - w3 = -3
  316. ~c24 = c24 - v2 - w4 = -2
  317. ~c32 = c32 - v3 - w2 = 2
  318.  
  319. (CRed)
  320. of\dm | 1 | 2 | 3 | 4 |
  321. 1 | 0 | 0 | -1 | 1 |
  322. 2 | 2 | 0 | -3 | -2 |
  323. 3 | 0 | 2 | 0 | 0 |
  324.  
  325.  
  326. Vamos escolher alguém para sair da base e alguém para entrar.
  327.  
  328. (1,3) vai entrar, pois é a variável com custo negativo de menor indice.
  329.  
  330. Assim os candidatos a sair são: (1,1), (3,3)
  331. E os fluxos que irão ser afetados são: (1,1), (3,3) e (3,1)
  332.  
  333. Mais especificamente o que menos permitir o crescimento de (1,3)
  334.  
  335. fluxo de (1,1) >= 0
  336. 2-teta >= 0
  337.  
  338. fluxo de (3,3) >= 0
  339. 3-teta >= 0
  340.  
  341. Logo o valor máximo de crescimento de teta é:
  342.  
  343. teta* = 2
  344.  
  345. A próxima iteração ficou de para casa.
  346. Mas deu para pegar a idéia certo?
  347.  
  348. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  349.  
  350. Só uma última coisa antes da aula terminar:
  351.  
  352. Qual a diferença do problema do Transbordo para o problema do Transporte?
  353.  
  354. Transbordo tem vertices intermediarios (que recebem e ofertam 0)
  355. Transporte tem um método bonitinho de solução (a tabela)
  356.  
  357. É possível resolver o problema do transbordo por meio de um algoritmo para o prob. do transporte?
  358.  
  359. Sim, basta substituir os vertices intermediários por arestas ligando seus arcos incidentes nos arcos de saída.
  360.  
  361. Assim teriamos os ofertantes, os demandantes e os intermediarios seriam convertidos em arcos.
  362.  
  363. Assim voce pode resolver o problema do Transbordo através do problema do Transporte.
  364.  
  365. Só resta uma dúvida, precisamos encontrar o caminho minímo entre um ofertante e um demandante para saber
  366. quais serão as arestas que substituirão os vertices intermediários.
  367.  
  368. Afinal fazer arestas com custo maior do que o mínimo obviamente não é ótimo.
  369.  
  370. E Pronto Dessa forma aprendemos a resolver dois problemas com um único algoritmo.
  371. (+ o algoritmo do caminho mínimo para transformar um no outro =P)
  372.  
  373. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  374.  
  375. // Fim da aula!
Advertisement
Add Comment
Please, Sign In to add comment