scheduling do transporte de petróleo das plataformas...

194
Dissertação de Mestrado Scheduling do transporte de petróleo das plataformas marítimas e de atendimento a centros consumidores Adrian Esteban Muract [email protected] Orientadores: João Inacio Soletti. DSc Sandra Helena Vieira de Carvalho. DSc Maceió, outubro de 2008

Upload: others

Post on 26-Jan-2021

1 views

Category:

Documents


0 download

TRANSCRIPT

  • Dissertação de Mestrado

    Scheduling do transporte de petróleo dasplataformas marítimas e de atendimento

    a centros consumidores

    Adrian Esteban [email protected]

    Orientadores:João Inacio Soletti. DSc

    Sandra Helena Vieira de Carvalho. DSc

    Maceió, outubro de 2008

  • Livros Grátis

    http://www.livrosgratis.com.br

    Milhares de livros grátis para download.

  • Adrian Esteban Muract

    Scheduling do transporte de petróleo dasplataformas marítimas e de atendimento

    a centros consumidores

    Dissertação apresentada como requisito par-cial para obtenção do grau de Mestre peloCurso de Mestrado em Modelagem Computa-cional de Conhecimento do Instituto de Com-putação da Universidade Federal de Alagoas.

    Orientadores:

    João Inacio Soletti. DSc

    Sandra Helena Vieira de Carvalho. DSc

    Maceió, outubro de 2008

  • Dissertação apresentada como requisito parcial para obtenção do grau deMestre pelo Curso de Mestrado em Modelagem Computacional de Conhe-cimento do Instituto de Computação da Universidade Federal de Alagoas,aprovada pela comissão examinadora que abaixo assina.

    Maceió, outubro de 2008

  • Resumo

    Hoje em dia, as empresas petroleiras enfrentam o desafio de conhecer qual éa melhor forma de movimentar uma frota de navios cargueiros sem que issosignifique um aumento de custo, entre outras. Neste trabalho será apresen-tada uma solução para este, mediante o desenvolvimento de um sistema quepermita calcular as rotas para transporte de petróleo bruto de plataformasmarítimas a refinarias, bem como transporte dos derivados do petróleo de re-finarias a centros consumidores. Para a solução do sistema, foi realizado umscheduling no qual determina-se a rota que cada navio deve realizar para queo petróleo sea entregue, buscando a rota que conduza ao melhor caminho,sendo considerado o tempo de deslocamento, carga e descarga do produto,além do limite de armazenamento de produto em cada plataforma, entre ou-tros parâmetros.

    i

  • Resumen

    Hoy en día, las empresas petroleras enfrentan el desafío de conocer cual es lamejor manera de mover una flota de navíos cargueros sin que ello signifiqueuna pérdida de dinero, entre otras cosas. En este trabajo se pretende darsolución a este problema, mediante el desarrollo de un sistema que permitecalcular las rutas que debe seguir un navío para transportar el petróleo brutodesde las plataformas marítimas a las refinerías, así como el transporte dederivados de petróleo desde las refinerías a los centros consumidores. Parala solución del sistema se realizó un scheduling en el cual se determina laruta que cada navío debe hacer para cumplir con la entrega de petróleo; y, elruteamiento realizado para determinar el mejor camino a seguir, teniendo encuenta el tiempo de desplazamiento, la carga y descarga del producto, ademásdel límite de almacenamiento en cada plataforma, entre otros parámetros.

    ii

  • Abstract

    Now a day, petroleum companies are looking for a way to calculate the besteconomic and time consuming alternative to move a group of ships betweenplatforms, refineries and consuming centers. In the following research is intro-duced a solution to this problem through a system which optimize the mainvariables involved. Variables such as scheduling and road have been takeninto account. The variable scheduling defines the road that each ship mustfollow. Meanwhile, the optimization of the route is based on traveling timebetween each points, uploaded and downloaded time, storing capacity at eachpoint, etc. The following system has been tested in two real cases showing agood performance.

    iii

  • Agradecimentos

    A meus orientadores, Professor João Inácio Soletti e Professora Sandra HelenaVieira de Carvalho, pelos quais passei a ter uma grande admiração. Agradeçopela paciência, dedicação e profissionalismo.Ao grupo de pesquisa do LASSOP (Laboratório de Sistema de Separação eOtimização de Processos) pela ajuda na concretização deste trabalho.À CAPES (Coordenação de Aperfeiçoamento de Pessoal de Nível Superior) peloapoio financeiro.À Universidade Federal de Alagoas, ao Curso de Mestrado em ModelagemComputacional de Conhecimento, e ao Professor Alejandro C. Frery, pela opor-tunidade de realizar o curso.À minha querida esposa, Alejandra, pelo apoio, incentivo e cooperação.A meus pais, Beatriz e Norberto, e a meus sogros, Estela e Daniel, merece-dores de meu mais profundo agradecimento pelo apoio e incentivo.Às Professoras Elsa Moschetti e Susana Ferrero, pela paciência, dedicação eprofissionalismo na minha iniciação científica.A todas as demais pessoas, que não estão aqui mencionadas, mas que dealguma maneira auxiliaram na concretização deste trabalho.

    iv

  • SUMÁRIO v

    Sumário

    I Introdução 1

    1 Estado da arte 4

    II Scheduling de escoamento de petróleo bruto de platafor-mas marítimas 7

    2 Problema a resolver 92.1 Fundamentos de seleção do método utilizado . . . . . . . . . . . 112.2 Fundamentos de seleção de ferramenta utilizada . . . . . . . . . 11

    3 Conceitos prévios 123.1 Conceito de rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.2 Cálculo de todas as rotas possíveis . . . . . . . . . . . . . . . . . 133.3 Seqüências em uma rota . . . . . . . . . . . . . . . . . . . . . . . 173.4 Calcular todas as possíveis seqüências da rota . . . . . . . . . . 203.5 Conceito de caminho . . . . . . . . . . . . . . . . . . . . . . . . . 23

    4 Classes 24

    5 Diagrama de Classes 41

    6 Funções para a solução do problema 436.1 Função obtener_secuencia . . . . . . . . . . . . . . . . . . . . 436.2 Função ImprimirResultado . . . . . . . . . . . . . . . . . . . . 476.3 Função cargar_linha_matriz . . . . . . . . . . . . . . . . . . . 496.4 Função esPlataforma . . . . . . . . . . . . . . . . . . . . . . . . 506.5 Função esRefineria . . . . . . . . . . . . . . . . . . . . . . . . . 516.6 Função conflicto_navios . . . . . . . . . . . . . . . . . . . . . 526.7 Função plataforma_parada . . . . . . . . . . . . . . . . . . . . 536.8 Função atracarEnRefineria . . . . . . . . . . . . . . . . . . . 556.9 Função escojer_combinacion . . . . . . . . . . . . . . . . . . . 56

    7 Estudos de casos 607.1 Dados de entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

    7.1.1 Estado inicial das plataformas . . . . . . . . . . . . . . . . 607.1.2 Estado inicial das refinarias . . . . . . . . . . . . . . . . . 617.1.3 Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 617.1.4 Navios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637.1.5 Caminhos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

  • SUMÁRIO vi

    7.1.6 Distâncias entre as refinarias e plataformas . . . . . . . . 657.2 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

    7.2.1 Caminhos resultantes . . . . . . . . . . . . . . . . . . . . . 66

    8 Conclusão 70

    III Scheduling de atendimento a centros consumidores 71

    9 Problema a resolver 74

    10 Conceitos prévios 75

    11 Classes 76

    12 Diagrama de classes 83

    13 Funções para a solução do problema 8513.1 Função obtener_secuencia . . . . . . . . . . . . . . . . . . . . 8513.2 Função ImprimirResultado . . . . . . . . . . . . . . . . . . . . 8613.3 Função cargar_linha_matriz . . . . . . . . . . . . . . . . . . . 8613.4 Função esCConsumidor . . . . . . . . . . . . . . . . . . . . . . . 8713.5 Função esRefineria . . . . . . . . . . . . . . . . . . . . . . . . . 8713.6 Função conflicto_navios . . . . . . . . . . . . . . . . . . . . . 8813.7 Função cconsumidore_parado . . . . . . . . . . . . . . . . . . . 8813.8 Função atracarEnRefineria . . . . . . . . . . . . . . . . . . . 9013.9 Função escojer_combinacion . . . . . . . . . . . . . . . . . . . 90

    14 Estudo de casos 9214.1 Dados de Entrada . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

    14.1.1 Estado inicial dos Centros Consumidores . . . . . . . . . 9214.1.2 Estado inicial das refinarias . . . . . . . . . . . . . . . . . 9414.1.3 Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9414.1.4 Navios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9614.1.5 Caminhos . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9814.1.6 Distâncias entre as refinarias e centros consumidores . . 98

    14.2 Resultado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9914.2.1 Caminhos resultantes . . . . . . . . . . . . . . . . . . . . . 99

    15 Conclusão 103

    IV Conclusão geral do trabalho 104

    V Apêndice 106

    A Relatório de scheduling do escoamento de petróleo bruto de platafor-mas marítimas 107A.1 Estado inicial das plataformas . . . . . . . . . . . . . . . . . . . 107

  • LISTA DE FIGURAS vii

    A.2 Estado inicial das refinarias . . . . . . . . . . . . . . . . . . . . . 108A.3 Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108A.4 Estado inicial dos navios . . . . . . . . . . . . . . . . . . . . . . . 112A.5 Estado inicial dos caminhos . . . . . . . . . . . . . . . . . . . . . 114A.6 Distâncias entre as refinarias e plataformas . . . . . . . . . . . 118A.7 Scheduling resultante . . . . . . . . . . . . . . . . . . . . . . . . . 118A.8 Caminhos resultantes . . . . . . . . . . . . . . . . . . . . . . . . 126A.9 Estado final das plataformas . . . . . . . . . . . . . . . . . . . . 131A.10 Estado final das refinarias . . . . . . . . . . . . . . . . . . . . . . 134A.11 Estado final dos navios . . . . . . . . . . . . . . . . . . . . . . . . 135

    B Relatório de scheduling do atendimento a centros consumidores 137B.1 Estado inicial dos centros consumidores . . . . . . . . . . . . . 137B.2 Estado inicial das refinarias . . . . . . . . . . . . . . . . . . . . . 138B.3 Rotas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139B.4 Estado inicial dos navios . . . . . . . . . . . . . . . . . . . . . . . 143B.5 Estado inicial dos caminhos . . . . . . . . . . . . . . . . . . . . . 144B.6 Distâncias entre as refinarias e centros consumidores . . . . . 148B.7 Scheduling resultante . . . . . . . . . . . . . . . . . . . . . . . . . 149B.8 Caminhos resultantes . . . . . . . . . . . . . . . . . . . . . . . . 156B.9 Estado final dos centros consumidores . . . . . . . . . . . . . . 160B.10 Estado final das refinarias . . . . . . . . . . . . . . . . . . . . . . 164B.11 Estado final dos navios . . . . . . . . . . . . . . . . . . . . . . . . 165B.12 Gráficos dos tempos de atracação nos piers . . . . . . . . . . . . 167

    Lista de Figuras

    2.1 Scheduling dos navios . . . . . . . . . . . . . . . . . . . . . . . . . 10

    4.1 Classe Matriz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254.2 Classe Grafo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.3 Classe Compartimento . . . . . . . . . . . . . . . . . . . . . . . . 274.4 Classe Navio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.5 Classe Frota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.6 Classe Piers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314.7 Classe Porto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324.8 Classe Refinaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334.9 Classe Plataforma . . . . . . . . . . . . . . . . . . . . . . . . . . . 344.10 Classe Rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364.11 Classe Caminho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    5.1 Diagrama de Classes do Sistema . . . . . . . . . . . . . . . . . . . 42

  • LISTA DE TABELAS viii

    7.1 Diagrama do scheduling de escoamento de petróleo bruto de platafor-mas marítimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    11.1 Classe Refinaria . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7711.2 Classe CConsumidor . . . . . . . . . . . . . . . . . . . . . . . . . 7811.3 Classe Rota . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8011.4 Classe Caminho . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    12.1 Diagrama de Classes do Sistema . . . . . . . . . . . . . . . . . . . 84

    14.1 Diagrama do scheduling do atendimento a centros consumidores . 100

    A.1 Diagrama do scheduling do escoamento de petróleo bruto de platafor-mas marítimas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127

    A.2 Quantidade de petróleo por tempo na plataforma 1 . . . . . . . . . 132A.3 Quantidade de petróleo por tempo na plataforma 2 . . . . . . . . . 133A.4 Quantidade de petróleo por tempo na plataforma 3 . . . . . . . . . 133A.5 Quantidade de petróleo por tempo na plataforma 4 . . . . . . . . . 134

    B.1 Diagrama do scheduling do atendimento a centro consumidor . . . 161B.2 Volume de produto estocado no centro consumidor 10 . . . . . . . 162B.3 Volume de produto estocado no centro consumidor 20 . . . . . . . 162B.4 Volume de produto estocado no centro consumidor 30 . . . . . . . 163B.5 Volume de produto estocado no centro consumidor 40 . . . . . . . 164B.6 Gráficos dos tempos que os navios podem atracar no pier 11 . . . . 167B.7 Gráficos dos tempos que os navios podem atracar no pier 12 . . . . 168B.8 Gráficos dos tempos que os navios podem atracar no pier 13 . . . . 168B.9 Gráficos dos tempos que os navios podem atracar no pier 14 . . . . 169B.10 Gráficos dos tempos que os navios podem atracar no pier 1 . . . . 170B.11 Gráficos dos tempos que os navios podem atracar no pier 2 . . . . 170B.12 Gráficos dos tempos que os navios podem atracar no pier 3 . . . . 171B.13 Gráficos dos tempos que os navios podem atracar no pier 4 . . . . 171B.14 Gráficos dos tempos que os navios podem atracar no pier 5 . . . . 172B.15 Gráficos dos tempos que os navios podem atracar no pier 6 . . . . 172B.16 Gráficos dos tempos que os navios podem atracar no pier 7 . . . . 173B.17 Gráficos dos tempos que os navios podem atracar no pier 8 . . . . 173

    Lista de Tabelas

    2.1 Combinações das possíveis rotas, considerando três plataformas . 10

    3.1 Matriz de todas as rotas . . . . . . . . . . . . . . . . . . . . . . . 123.2 Caso base de 1 refinaria e 2 plataformas . . . . . . . . . . . . . . . 133.3 Caso base de 2 refinarias e 2 plataformas . . . . . . . . . . . . . . 143.4 Caso base de 3 refinarias e 2 plataformas . . . . . . . . . . . . . . 15

  • LISTA DE TABELAS ix

    3.5 Combinações possíveis de três plataformas . . . . . . . . . . . . . 163.6 Aplicação do conceito de elementos e div . . . . . . . . . . . . . . . 173.7 Segunda possível solução . . . . . . . . . . . . . . . . . . . . . . . 193.8 Soluções combinadas . . . . . . . . . . . . . . . . . . . . . . . . . 193.9 Terceira solução . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.10 Permutações sem repetição de 4 plataformas . . . . . . . . . . . . 21

    6.1 Matriz de adjacência (G) . . . . . . . . . . . . . . . . . . . . . . . 456.2 Possíveis seqüências da rota 1 . . . . . . . . . . . . . . . . . . . . 456.3 Possíveis seqüências da rota 2 . . . . . . . . . . . . . . . . . . . . 466.4 Ordem do conjunto de caminhos . . . . . . . . . . . . . . . . . . . 586.5 Nível de rota 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596.6 Nível de rota 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596.7 Nível de rota 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    7.1 Quantidades carregadas nas plataformas na rota 1 . . . . . . . . . 627.2 Quantidades carregadas nas plataformas na rota 2 . . . . . . . . . 627.3 Quantidades carregadas nas plataformas na rota 3 . . . . . . . . . 627.4 Quantidades carregadas nas plataformas na rota 4 . . . . . . . . . 637.5 Quantidades carregadas nas plataformas na rota 5 . . . . . . . . . 637.6 Tempo de atracamento do navio 1 . . . . . . . . . . . . . . . . . . 637.7 Tempo de desatracamento do navio 1 . . . . . . . . . . . . . . . . 637.8 Tempo de atracamento do navio 2 . . . . . . . . . . . . . . . . . . 647.9 Tempo de desatracamento do navio 2 . . . . . . . . . . . . . . . . 647.10 Tempo de atracamento do navio 3 . . . . . . . . . . . . . . . . . . 647.11 Tempo de desatracamento do navio 3 . . . . . . . . . . . . . . . . 657.12 Matriz de adjacência (G) . . . . . . . . . . . . . . . . . . . . . . . 667.13 Seqüência de plataformas e refinarias que segue o navio 1 do cami-

    nho 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 667.14 Seqüência de plataformas e refinarias que segue o navio 2 do cami-

    nho 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 677.15 Seqüência de plataformas e refinarias que segue o navio 3 do cami-

    nho 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    14.1 Descargas nos centros consumidores na rota 1 . . . . . . . . . . . 9414.2 Descargas nos centros consumidores na rota 2 . . . . . . . . . . . 9514.3 Descargas nos centros consumidores na rota 3 . . . . . . . . . . . 9514.4 Descargas nos centros consumidores na rota 4 . . . . . . . . . . . 9514.5 Descargas nos centros consumidores na rota 5 . . . . . . . . . . . 9614.6 Tempo de atracamento do navio 1 . . . . . . . . . . . . . . . . . . 9614.7 Tempo de desatracamento do navio 1 . . . . . . . . . . . . . . . . 9614.8 Tempo de atracamento do navio 2 . . . . . . . . . . . . . . . . . . 9714.9 Tempo de desatracamento do navio 2 . . . . . . . . . . . . . . . . 9714.10 Tempo de atracamento do navio 3 . . . . . . . . . . . . . . . . . . 9714.11 Tempo de desatracamento do navio 3 . . . . . . . . . . . . . . . . 9714.12 Matriz de adjacência (G) . . . . . . . . . . . . . . . . . . . . . . . 9814.13 Seqüência de centros consumidores e refinarias que segue o navio 1

    do caminho 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

  • LISTA DE TABELAS x

    14.14 Seqüência de centros consumidores e refinarias que segue o navio 2do caminho 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

    14.15 Seqüência de centros consumidores e refinarias que segue o navio 3do caminho 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

    A.1 Combinações possíveis da rota 1 . . . . . . . . . . . . . . . . . . 109A.2 Quantidades carregadas nas plataformas na rota 1 . . . . . . . . 109A.3 Combinações possíveis da rota 2 . . . . . . . . . . . . . . . . . . 110A.4 Quantidades carregadas nas plataformas na rota 2 . . . . . . . . 110A.5 Combinações possíveis da rota 3 . . . . . . . . . . . . . . . . . . 110A.6 Quantidades carregadas nas plataformas na rota 3 . . . . . . . . 111A.7 Combinações possíveis da rota 4 . . . . . . . . . . . . . . . . . . 111A.8 Quantidades carregadas nas plataformas na rota 4 . . . . . . . . 111A.9 Combinações possíveis da rota 5 . . . . . . . . . . . . . . . . . . 111A.10 Quantidades carregadas nas plataformas na rota 1 . . . . . . . . 112A.11 Tempo de atracamento do navio 1 . . . . . . . . . . . . . . . . . . 112A.12 Tempo de desatracamento do navio 1 . . . . . . . . . . . . . . . . 112A.13 Tempo de atracamento do navio 2 . . . . . . . . . . . . . . . . . . 113A.14 Tempo de desatracamento do navio 2 . . . . . . . . . . . . . . . . 113A.15 Tempo de atracamento do navio 3 . . . . . . . . . . . . . . . . . . 113A.16 Tempo de desatracamento do navio 3 . . . . . . . . . . . . . . . . 113A.17 Possíveis seqüências das rotas que compõem o caminho 1 . . . . . 114A.18 Seqüência de plataformas e refinarias que segue o navio 1 do cami-

    nho 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114A.19 Possíveis seqüências das rotas que compõem o caminho 2 . . . . . 115A.20 Seqüência de plataformas e refinarias que segue o navio 2 do cami-

    nho 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115A.21 Possíveis seqüências das rotas que compõem o caminho 3 . . . . . 116A.22 Seqüência de plataformas e refinarias que segue o navio3 do caminho

    3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117A.23 Matriz de adjacência . . . . . . . . . . . . . . . . . . . . . . . . . 118A.25 Possíveis seqüências das rotas que compõem o caminho 1 . . . . . 128A.26 Seqüência de plataformas e refinarias que segue o navio 1 do cami-

    nho 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128A.27 Possíveis seqüências das rotas que compõem o caminho 2 . . . . . 129A.28 Seqüência de plataformas e refinarias que segue o navio 2 do cami-

    nho 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129A.29 Possíveis seqüências das rotas que compõem o caminho 3 . . . . . 130A.30 Seqüência de plataformas e refinarias que segue o navio 3 do cami-

    nho 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131A.31 Tempo de atracamento do navio 1 . . . . . . . . . . . . . . . . . . 135A.32 Tempo de desatracamento do navio 1 . . . . . . . . . . . . . . . . 135A.33 Tempo de atracamento do navio 2 . . . . . . . . . . . . . . . . . . 136A.34 Tempo de desatracamento do navio 2 . . . . . . . . . . . . . . . . 136A.35 Tempo de atracamento do navio 3 . . . . . . . . . . . . . . . . . . 136A.36 Tempo de desatracamento do navio 3 . . . . . . . . . . . . . . . . 136

    B.1 Combinações possíveis da rota 1 . . . . . . . . . . . . . . . . . . 139

  • LISTA DE TABELAS xi

    B.2 Descargas nos centros consumidores da rota 1 . . . . . . . . . . . 140B.3 Combinações possíveis da rota 2 . . . . . . . . . . . . . . . . . . 140B.4 Descargas nos centros consumidores da rota 2 . . . . . . . . . . . 141B.5 Possíveis combinações da rota 3 . . . . . . . . . . . . . . . . . . . 141B.6 Descargas nos centros consumidores na rota 3 . . . . . . . . . . . 141B.7 Possíveis combinações da rota 4 . . . . . . . . . . . . . . . . . . . 142B.8 Descargas nos centros consumidores da rota 4 . . . . . . . . . . . 142B.9 Possíveis combinações da rota 5 . . . . . . . . . . . . . . . . . . . 142B.10 Descargas nos centros consumidores da rota 5 . . . . . . . . . . . 142B.11 Tempo de atracamento do navio 1 . . . . . . . . . . . . . . . . . . 143B.12 tempo de desatracamento do navio 1 . . . . . . . . . . . . . . . . 143B.13 Tempo de atracamento do navio 2 . . . . . . . . . . . . . . . . . . 143B.14 Tempo de desatracamento do navio 2 . . . . . . . . . . . . . . . . 144B.15 Tempo de atracamento do navio 3 . . . . . . . . . . . . . . . . . . 144B.16 Tempo de desatracamento do navio 3 . . . . . . . . . . . . . . . . 144B.17 Possíveis seqüências de rotas que segue o navio 1 . . . . . . . . . 145B.18 Seqüência de centros consumidores e refinarias que segue o navio 1

    do caminho 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145B.19 Possíveis seqüências de rotas que segue o navio 2 . . . . . . . . . 146B.20 Seqüência de centros consumidores e refinarias que segue o navio 2

    do caminho 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146B.21 Possíveis seqüências de rotas que segue o navio 3 . . . . . . . . . 147B.22 Seqüência de centros consumidores e refinarias que segue o navio 3

    do caminho 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148B.23 Matriz de adjacência . . . . . . . . . . . . . . . . . . . . . . . . . 148B.25 Possíveis seqüências de rotas que segue o navio 1 . . . . . . . . . 156B.26 Seqüência de centros consumidores e refinarias que segue o navio 1

    do caminho 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156B.27 Possíveis seqüências de rotas que segue o navio 2 . . . . . . . . . 157B.28 Seqüência de centros consumidores e refinarias que segue o navio 2

    do caminho 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157B.29 Possíveis seqüências de rotas que segue o navio 3 . . . . . . . . . 158B.30 Sequencia de centros consumidores e refinarias que segue o navio 3

    do caminho 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159B.31 Tempo de atracamento do navio 1 . . . . . . . . . . . . . . . . . . 165B.32 Tempo de desatracamento do navio 1 . . . . . . . . . . . . . . . . 165B.33 Tempo de atracamento do navio 2 . . . . . . . . . . . . . . . . . . 166B.34 Tempo de desatracamento do navio 2 . . . . . . . . . . . . . . . . 166B.35 Tempo de atracamento do navio 3 . . . . . . . . . . . . . . . . . . 166B.36 Tempo de desatracamento do navio 3 . . . . . . . . . . . . . . . . 166

  • Parte I

    Introdução

    1

  • 2

    Hoje em dia a maioria das indústrias petroleiras encontra-se com um dilema

    de difícil resolução, este é, qual é a melhor forma de movimentar os navios das

    refinarias às plataformas petroleiras existentes no mar e, das refinarias aos

    centros consumidores, sem que signifique grande perda de dinheiro e tempo,

    além de cumprir com as demandas dos centros consumidores e outras restri-

    ções que serão vistas neste trabalho.

    Mediante o estudo do problema, analisando as restrições que estabelece

    o sistema e, aplicando algum método dos conhecidos para os problemas de

    otimização combinatória, pretende-se fazer o scheduling das seqüências de

    plataformas, refinarias e centros consumidores que cada navio no sistema

    deverá fazer.

    Neste problema tem-se muita informação a ser considerada, como por ex-

    emplo: o tempo de transporte de produto de uma refinaria até uma plataforma

    ou um centro consumidor; o tempo máximo de estocagem de petróleo em cada

    plataforma, uma vez caso atinja o limite de armazenagem do produto, haverá

    parada de exploração e, consequentemente prejuízo; a questão de que dois

    navios não podem estar na mesma plataforma ao mesmo tempo; necesidade

    de atendimento das demandas dos centros consumidores, uma vez que deve

    haver uma reserva do produto proveniente de refinaria; deve-se ter em conta

    que em cada compartimento de um navio não pode haver mistura de dife-

    rentes tipos de produtos; um navio só pode atracar em um porto se houver

    condições de atracação para este tipo de navio (profundidade e comprimento

    do pier); etc.

    Por tanto, é importante realizar um scheduling capaz de satisfazer todas es-

    sas necessidades, para obter um melhor desempenho no transporte de graneis

    líquidos: petróleo bruto no caso das plataformas-refinarias; e, derivados do

    petróleo no caso das refinarias-centro consumidores.

    O problema geral, considerando o scheduling de escoamento de petróleo

    bruto das plataformas marítimas e o scheduling de atendimento aos centros

    consumidores, resulta num problema muito grande. Da parte computacional,

    é praticamente impossível sua solução utilizando os métodos convencionais

    como por exemplo Backtracking, programação dinâmica, divide & conquer en-

    tre outras (melhor fundamentado na seção 6.9), dada sua grande quantidade

    de dados além de inúmeras restrições. Assim sendo, neste trabalho estuda-

    se soluções aos problemas separadamente, usando métodos metaheurísti-

    cos, obtendo-se soluções que satisfaçam às restrições de cada um dos casos:

    scheduling de escoamento; e o scheduling de atendimento da demanda.

    Este trabalho é divido em quatro partes:

  • 3

    Parte I Nesta, se introduz o problema dando uma idéia geral sobre o mesmo,

    além de fazer uma pesquisa bibliográfica identificando os trabalhos rea-

    lizados nesta área, ou áreas relacionadas;

    Parte II Nesta, se trabalha o problema de realizar o scheduling de escoa-

    mento de petróleo bruto das plataformas marítimas, definindo-o e pro-

    pondo uma metodologia de solução;

    Parte III Nesta, se trabalha o problema de realizar o scheduling de atendi-

    mento a centros consumidores, definindo-o e propondo uma metodologia

    de solução;

    Parte IV Apresenta a conclusão geral do trabalho e as propostas de trabalhos

    futuros.

  • Capítulo 1

    Estado da arte

    Ao longo da pesquisa bibliográfica realizada para a elaboração desta disser-

    tação, encontraram-se diversos artigos, teses e livros que fizeram possível um

    melhor entendimento dos conceitos que foram desenvolvidos nos capítulos

    posteriores. Estas bibliografias introduziram elementos importantes que aju-

    daram à eleição da melhor ferramenta possível para a resolução do problema

    proposto inicialmente.

    Exsitem varias formas de considerar o problema de scheduling e rotea-

    mento dos navios, tendo em conta as restrições aplicadas por cada autor,

    como o tamanho do navio, a carga que transporta, a velocidade, entre outras

    (Ronen 1983).

    Ao realizar a seleção da frota a utilizar para o transporte do petróleo, é

    importante ter em conta a estrutura dos navios. Alguns autores estudaram

    a possibilidade de usar um algoritmo não-linear para este tipo de problema

    (Augusto & Kawano 1998).

    Em muitos dos trabalhos encontrados, o estudo do problema da janela

    de tempo, considera a possibilidade de aumentar o tempo estipulado para

    a entrega do produto, e também que o navio carregue mais de um produto

    para realizar varias entregas sem perder mais tempo de viagem (Al-Yakoob

    1997), de forma a reduzir a penalização por demora. Por isso, Almeida Lima

    (2002) propôs como solução deste problema, realizar uma simulação do caso

    de venda, com todas as restrições que o conformam, para lograr estender o

    horizonte de tempo requerido para o envio do produto ao cliente sem sofrer

    penalização. Fagerholt (2001) idealizou a mudança da janela de tempo rígida,

    ou seja, que não permite uma margem de erro, a outra não rígida, ou seja,

    que tem uma margem de erro, permitindo um controle de erros, utilizando

    a especulação para otimizar o período de entrega do produto, sabendo que a

    avaliação da janela de tempo com respeito à carga do navio é parcialmente

    4

  • 5

    conhecida, e que o planejamento do problema é distribuído em um número de

    pessoas que fazem o mesmo (Schut 2005).

    Hoje em dia, no panorama mundial, a utilização de petróleo e seus deriva-

    dos é muito importante na economia. Assim sendo, pesquisadores, baseiam

    seus estudos na procura de uma melhor solução para o problema de trans-

    porte deste produto tão precioso. Além disso, é uma área pouco explorada. As

    considerações que se deve ter em conta no processo de exploração e produção

    de petróleo, são os custos diretos e indiretos do trabalho com este material.

    Soares de Medeiros (1999) utiliza uma metodologia de custeio baseado em

    atividades para a resolução do problema.

    Pereira Motta Franco (2003) propôs a utilização de sistemas inteligentes

    que ajudem na tomada de decisão para o planejamento de plataformas marí-

    timas, tendo em conta os aspectos econômicos, políticos e ambientais que

    trazem este tipo de assunto, assim como, conhecer qual frota é melhor para

    o transporte. Por outro lado, Boardman et al. (1997) propuseram a utilização

    de um Sistema de Suporte de Decisão (DSS).

    Durante o transporte de produtos é muito importante fazer uma revisão

    do equipamento usado, de modo a evitar problemas ambientais. No caso do

    transporte de petróleo, o vazamento implica em um impacto muito forte para

    muitos organismos que vivem no mar (Reis da Silva 2004).

    Fagerholt & Christiansen (2000) estudaram o problema do transporte fa-

    zendo uma analogia com o problema do caixeiro viajante com a incorporação

    da janela do tempo para otimizar o conjunto de portos visitados, em uma

    grande frota de barcos. Soletti (2006), em seu trabalho, considera o problema

    do transporte de petróleo e seus derivados como um problema de Programação

    Linear Inteira Mista (PLIM), atendendo as demandas dos centros consumido-

    res e das refinarias, para o qual propõe um modelo matemático capaz de iden-

    tificar dentre um conjunto de navios, o mais apropriado para o transporte do

    produto. Malandraki & Daskin (1992) estudaram a possibilidade de resolver

    o problema de veículos com uma heurística nearest-neighbor, considerando

    que o melhor é fazer o atendimento dos clientes que fiquem mais perto do

    ponto de partida do transporte, o que pode ser aplicado à carga de petróleo.

    Uma solução ao problema pode ser enviar um navio aos portos que ficam mais

    próximos ao ponto de partida e, assim, minimizar custos.

    A minimização de custos, é um dos condicionantes no planejamento e

    roteamento de navios de carga, considerando que menores custos não im-

    plicam menor qualidade do produto (Pinto Junior 2001). Kim & Barnhart

    (1997) desenvolveram um modelo que permite conhecer qual é o caminho, o

    custo e como minimizá-lo, baseado em um método de redução de problemas,

  • 6

    que implica em: consolidação de nó; de caminhos; derivação de programas; e,

    um procedimento de solução branch-and-price-and-cut. Também pode se ver

    este tema no trabalho de Shih (1997).

    Para realizar o envio de petróleo é preciso fazer o roteamento e scheduling,

    obtendo assim, uma melhor escolha dos navios. Paolucci et al. (2002) fizeram

    uma simulação do processo tendo em conta aspectos do plano de chegada dos

    petroleiros aos portos, e a seqüência de produção nas refinarias. No rotea-

    mento de navios, Terumichi Ono (2001), formulou um modelo matemático

    que permite dimensionar as frotas dedicadas ao serviço de transporte, as-

    sim como, estabelecer as rotas a percorrer segundo a demanda. Por outro

    lado, Iskendar et al. (2001) estudaram o problema do planejamento de navios,

    como um veiculo, considerando uma frota heterogênea e numerosas viagens,

    ou seja, um conjunto de navios e uma certa quantidade de viagens a realizar,

    sempre que a duração total de cada veiculo não supere o período de planeja-

    mento; Persson & Gothe-Lundgren (2004) integraram o planejamento de envio

    e o planejamento do processo na refinaria para dar solução ao problema do

    planejamento e scheduling.

    Quando se estuda a complexidade computacional do problema, Calégari

    (1999) baseia-se na utilização da paralelização com base em Algoritmos Evo-

    lutivos (AE), mas nem sempre as soluções teoricas dadas são possíveis na

    implementação computacional.

  • Parte II

    Scheduling de escoamento de

    petróleo bruto de plataformas

    marítimas

    7

  • 8

    Nesta parte do trabalho vai-se dar solução ao problema de fazer um schedul-

    ing para o escoamento de petróleo bruto de plataformas marítimas. Para este

    fim se tomou como ponto de partida o trabalho desenvolvido pelo grupo de

    pesquisa do “Laboratório de Sistema de Separação e Otimização de Processos”

    (LASSOP), onde mediante programação matemática resolveu-se o problema de

    dimensionamento de um conjunto de navios, um conjunto de plataformas e

    um conjunto de refinarias. Como resultado foi determinado que plataformas

    devem carregar o petróleo bruto, em que navio, e onde deve ser a descarga

    do petróleo coletado, obtendo a chamada rota, a qual parte de uma refinaria,

    passa por um conjunto de plataformas e chega à mesma ou outra refinaria.

    Então pode-se dizer que o resultado do problema define que rotas tem que

    fazer um determinado navio para minimizar o tempo, associado a custos, de

    forma a satisfazer uma determinada demanda.

    O problema tratado nesta parte do trabalho é fundamentado pelo motivo

    que o dimensionamento obtido, pelo grupo de pesquisa de LASSOP, não de-

    termina a seqüência em que o navio deve visitar as plataformas de cada rota,a

    ele associada, além de que, se houver mais de uma rota associada a um navio,

    não determina qual a seqüência de rotas a ser realizada. Por tanto, necessita-

    se inserir novas restrições que dependem destas seqüências e dos tempos em

    que são realizadas.

    A metodologia usada neste trabalho foi:

    • Definir o problema, explicando as restrições associadas ao mesmo;

    • Fundamentar o método a ser utilizado para a resolução do problema;

    • Fundamentar a seleção da ferramenta a ser utilizada;

    • Introduzir os conceitos de rota;

    • Introduzir os conceitos de caminho;

    • Apresentar as classes do sistema com seus métodos;

    • Apresentar o diagrama de classes do sistema;

    • Explicar como se resolveu o problema baseado no sistema das classes;

    • Esboçar um cenário para avaliar os resultados do software desenvolvido;

    • Fazer uma conclusão parcial do problema, ou seja, referente a este tra-

    balho.

  • Capítulo 2

    Problema a resolver

    Foi considerado o dimensionamento já existente, e que cada navio tem um

    conjunto de rotas associado, onde uma rota é aquela que começa em uma

    refinaria e termina na mesma ou outra refinaria, passando unicamente por

    plataformas. Na prática este conjunto de plataformas, não chega a um número

    muito elevado por rota. Então, o problema a resolver é encontrar a seqüên-

    cia de plataformas e refinarias, garantindo minimizar a distância percorrida,

    assegurando que esta seqüência cumpra com as seguintes restrições:

    • Dois navios não podem ficar ao mesmo tempo na mesma plataforma;

    • Uma plataforma não pode chegar ao máximo de sua capacidade de ar-

    mazenamento, sob pena de parada de produção. Por tanto, o atendi-

    mento à plataforma refere-se à retirada do petróleo, antes que chegue à

    capacidade máxima de armazenamento da plataforma;

    • Um navio só pode atracar em uma refinaria se houver piers disponível e,

    além disso, se a profundidade do pier acrescida da altura da maré (calcu-

    lada pelo método dos duodécimos URL: http://www.cibernautica.com.ar

    /mareas/duode.htm), no momento de atraco e desatraco, for maior que o

    calado do navio.

    Então, suponha-se que existam três navios, com velocidades n1v = 110nós,

    n2v = 120nós e n3v = 130nós e o scheduling apresentado na Figura 2.1. Pode-se

    observar que o navio n3 demora mais que o navio n1 para realizar a rota R_0.

    Isto parece ilógico, dado que o navio n3 é mais veloz que o navio n1, mas isto

    acontece uma vez que o tempo que um navio demora para fazer uma rota,

    não só depende da distância, mas também de muitos fatores, como por exem-

    plo o tempo que um determinado navio demora em atracar e desatracar, em

    uma determinada plataforma. Além disso, se houver dois navios com as mes-

    mas características (velocidade, capacidade, largura, comprimento, etc...), não

    9

  • 10

    Figura 2.1: Scheduling dos navios

    necessariamente vão demorar o mesmo tempo em realizar uma determinada

    rota, já que a rota só especifica as plataformas visitadas, e não a seqüência

    na qual são visitadas. Então, sejam nx e ny dois navios com as mesmas ca-

    racterísticas e seja R uma rota que parte da refinaria r1 e chega à refinaria r3passando pelas plataformas p1, p2 e p3, os navios nx e ny podem percorrer 6

    diferentes rotas considerando as combinações de seqüências das plataformas

    (ver a Tabela 2.1). Ou seja, pode-se atribuir, por exemplo, a nx a seqüência

    de r1 → p1 → p3 → p2 → r3 (combinação 2 na tabela) e, a ny ,a seqüência de

    r1 → p3 → p2 → p1 → r3 (combinação 6 na tabela).

    Tabela 2.1: Combinações das possíveis rotas, considerando três plataformasp1 p2 p3

    1 1 2 32 1 3 23 2 1 34 2 3 15 3 1 26 3 2 1

    Agora, qual é o critério, para selecionar a seqüência a ser atribuida a um

    navio? A idéia de atribuir uma seqüência a um navio se baseia em tomar a

    seqüência de distância mínima. A seção 3 explica como se obtêm esta distân-

    cia para cada rota; e, a seção 3.5 explica como se obtêm a distância total que

    o navio tem que percorrer.

    Antes de introduzir-se na solução do problema, é importante explicar e

    justificar o método usado para solução deste problema, além do por que da

    seleção da ferramenta usada para este fim.

  • 2.1. FUNDAMENTOS DE SELEÇÃO DO MÉTODO UTILIZADO 11

    2.1 Fundamentos de seleção do método utilizado

    Ainda que do ponto de vista teórico se pode enumerar todas as possíveis

    soluções e avaliar cada uma delas, com respeito ao valor da função objetivo,

    na prática, em um computador, é muitas vezes impossível analisar e avaliar

    todas as possíveis soluções, já que o número de combinações cresce expo-

    nencialmente com o tamanho do problema. É por este motivo que primeiro,

    foram criadas todas as possíveis seqüências de uma rota, para assim reduzir

    o universo de soluções.

    Uma vez terminado todo este processo conhecido como clusterização, me-

    diante um método GREEDY, também conhecido como método voraz, o qual

    se baseia na suposição que se tem todos os caminhos mínimos, é dizer dis-

    tâncias mínimas, a distância global é mínima, pode-se chegar a uma solução

    que se não é ótima, é muito próxima a ela. Esta solução é muito útil con-

    siderando que para chegar a uma solução ótima deve-se usar outros méto-

    dos como por exemplo backtracking, divide & conquer, programação dinámica,

    programação matemática, entre outras, que avaliam todas as possíveis com-

    binações, e isto, dependendo do tamanho do problema, pode ser impossível

    de calcular computacionalmente. Mais na frente, na seção 6.9, introduze-se

    mais nesta área, justificando a escolha baseando-se no problema especifico.

    Para quem esté interessado na teoria e práctica da computabilidade e com-

    plexidade, recomenda-se a leitura de Hartley (1987), Jones (1997) e Cutland

    (1997).

    2.2 Fundamentos de seleção de ferramenta uti-

    lizada

    Dada a característica do problema e o volume dos dados, escolheu-se utilizar

    uma linguagem de programação orientada a objetos que permitisse manipu-

    lar o tamanho dos dados, ou seja, o quanto cada dado ocupa na memória.

    Além disso, procurou-se uma linguagem de programação multiplataforma, ou

    seja, que possa ser compilada tanto em Windows, como em um sistema Unix,

    como por exemplo Linux. Dentre as linguagens de programação conhecidas,

    a que melhor se ajusta a estas necessidades é C++, dado que ela é orientada

    a objetos; permite definir o espaço de memória utilizado por cada dado; e, é

    multiplataforma.

  • Capítulo 3

    Conceitos prévios

    Para um melhor entendimento do problema e da metodologia a ser empregada

    neste trabalho, é fundamental o conhecimento e entendimento dos conceitos

    e fundamentos de como se representa uma rota e um caminho (este último

    apresentado na seção 3.5).

    3.1 Conceito de rota

    Definiu-se como uma rota aquela que começa com uma refinaria e termina

    na mesma, ou outra refinaria, passando por um conjunto de plataformas.

    Assim pode-se representar uma rota como uma cadeia binária de tamanho

    = CP + 2 ∗ CR, onde CP é a quantidade de plataformas em uma rota e CR a

    quantidade de refinarias. Um exemplo desta pode ser observada em cada linha

    da Tabela 3.1, a qual é uma matriz binária que contém o conjunto das rotas

    possíveis considerando o sistema com 3 plataformas e 3 refinarias. Cada linha

    desta matriz representa uma rota, por exemplo, a rota Rx parte da refinaria r1e chega à refinaria r2, passando pelas plataformas p1 e p3.

    Tabela 3.1: Matriz de todas as rotasRota r1 r2 r3 p1 p2 p3 r1 r2 r3...

    ......

    ......

    ......

    ......

    ...Rx 1 0 0 1 0 1 0 1 0...

    ......

    ......

    ......

    ......

    ...Ry 1 0 0 0 1 1 0 1 0...

    ......

    ......

    ......

    ......

    ...Rz 1 0 0 0 0 1 0 1 0...

    ......

    ......

    ......

    ......

    ...

    Uma pergunta que se pode fazer neste momento é, como calcular todas as

    12

  • 3.2. CÁLCULO DE TODAS AS ROTAS POSSÍVEIS 13

    rotas possíveis, conhecendo-se apenas a quantidade de refinarias e a quanti-

    dade de plataformas. A próxima seção está dedicada à explicação da metodolo-

    gia usada para responder a este questionamento.

    3.2 Cálculo de todas as rotas possíveis

    Nesta seção parte-se do principio que se conhece a quantidade de refinarias

    e plataformas que compõem o sistema, e diante desta informação pode-se de-

    terminar o número de combinações possíveis sem repetição. Para calcular

    o número de possíveis combinações de refinarias e plataformas que confor-

    mam as rotas, deve-se primeiro considerar alguns casos bases, para poder

    determinar, mediante indução, qual a equação que determina este número de

    combinações.

    Os casos bases considerados são apresentados nas Tabelas 3.2 e 3.3, onde

    a quantidade de linhas ou combinações (Tabela 3.2) é dado por 2CP = 22 = 4

    (onde CP é a quantidade de plataformas presentes no sistema completo). Na

    Tabela 3.3, a quantidade de linhas é 2CP ∗ CR2 = 22 ∗ 22 = 16 (onde CR é a

    quantidade de refinarias presentes no sistema completo).

    Tabela 3.2: Caso base de 1 refinaria e 2 plataformasr p1 p2 r1 1 1 11 1 0 11 0 1 11 0 0 1

    O caso base apresentado na Tabela 3.4 (na página 15) confirma a dedução

    nos dois primeiros casos: a quantidade de linhas é definida pela quantidade

    de refinarias; e, a quantidade de plataformas, mediante a Equação 3.1.

    Quantidade_Filas = 2CP ∗ CR2 (3.1)

    Aplicando esta equação ao caso base da Tabela 3.4 obtem-se:

    Quantidade_Filas = 2CP ∗ CR2 = 22 ∗ 32 = 36

    Por outro lado, a quantidade de colunas necessárias para representar esta

    matriz é igual ao tamanho da cadeia binária apresentada na seção anterior,

    baseada na quantidade de refinarias e na quantidade de plataformas, medi-

  • 3.2. CÁLCULO DE TODAS AS ROTAS POSSÍVEIS 14

    Tabela 3.3: Caso base de 2 refinarias e 2 plataformasr1 r2 p1 p2 r1 r21 0 1 1 1 01 0 1 0 1 01 0 0 1 1 01 0 0 1 1 0

    1 0 1 1 0 11 0 1 0 0 11 0 0 1 0 11 0 0 0 0 1

    0 1 1 1 1 00 1 1 0 1 00 1 0 1 1 00 1 0 0 1 0

    0 1 1 1 0 10 1 1 0 0 10 0 0 1 0 10 0 0 0 0 1

    ante a seguinte Equação 3.2.

    Quantidade_Colunas = CP + 2 ∗ CR (3.2)

    Para realizar automaticamente todas as combinações possíveis das platafor-

    mas, deve-se verificar quais os passos a serem seguidos. Usando-se o exemplo

    de 3 plataformas, tem-se 8 combinações (23 = 8) de zeros e um como mostrado

    na Tabela 3.5.

    Neste exemplo, observa-se que a quantidade de zeros e uns para cada co-

    luna é igual ao total de linhas dividido por 2, conforme Equações 3.3 e 3.4:

    C1 = 2CP−1 (3.3)

    C0 = 2CP−1 (3.4)

    Com respeito a cada coluna, tem-se um padrão para alocação dos números

    zero e um, por exemplo, na coluna 1 da Tabela 3.5 (na página 16), foram

    primeramente alocados todos os números um e depois todos os zeros. Na

    coluna 2, da mesma tabela, repete-se duas vezes o seguinte procedimento:

    situa-se primeramente C12

    quantidades do número um; depois C02

    zeros. Na

    coluna 3 observa-se que foram intercalados uns e zeros. Nesta coluna (coluna

  • 3.2. CÁLCULO DE TODAS AS ROTAS POSSÍVEIS 15

    Tabela 3.4: Caso base de 3 refinarias e 2 plataformasr1 r2 r3 p1 p2 r1 r2 r31 0 0 1 1 1 0 01 0 0 1 0 1 0 01 0 0 0 1 1 0 01 0 0 0 0 1 0 0

    1 0 0 1 1 0 1 01 0 0 1 0 0 1 01 0 0 0 1 0 1 01 0 0 0 0 0 1 0

    1 0 0 1 1 0 0 11 0 0 1 0 0 0 11 0 0 0 1 0 0 11 0 0 0 0 0 0 1

    0 1 0 1 1 1 0 00 1 0 1 0 1 0 00 1 0 0 1 1 0 00 1 0 0 0 1 0 0

    0 1 0 1 1 0 1 00 1 0 1 0 0 1 00 1 0 0 1 0 1 00 1 0 0 0 0 1 0

    0 1 0 1 1 0 0 10 1 0 1 0 0 0 10 1 0 0 1 0 0 10 1 0 0 0 0 0 1

    0 0 1 1 1 1 0 00 0 1 1 0 1 0 00 0 1 0 1 1 0 00 0 1 0 0 1 0 0

    0 0 1 1 1 0 1 00 0 1 1 0 0 1 00 0 1 0 1 0 1 00 0 1 0 0 0 1 0

    0 0 1 1 1 0 0 10 0 1 1 0 0 0 10 0 1 0 1 0 0 10 0 1 0 0 0 0 1

  • 3.2. CÁLCULO DE TODAS AS ROTAS POSSÍVEIS 16

    Tabela 3.5: Combinações possíveis de três plataformas1 2 31 1 11 1 01 0 11 0 00 1 10 1 00 0 10 0 0

    3) também foi seguido um padrão: primeiro C14

    quantidades de número um;

    depois C04

    quantidades de número zero; e, assim por diante, até o total de

    linhas (2CP = 8). Este padrão foi desenvolvido para o caso CP = 3, deve-se,

    agora generalizar para CP = n.

    Viu-se que para a coluna 1 tem-se 2 divisões; para a coluna 2 tem-se 4

    divisões; e, para a coluna 3 tem-se 8 divisões. Por tanto, pode-se escrever as

    seguintes equações:

    • coluna 1 → Div[1] = 2 = 23

    4= 23−2 = 2CP−(CP−1) = 21

    • coluna 2 → Div[2] = 4 = 23

    2= 23−1 = 2CP−(CP−2) = 22

    • coluna 3 → Div[3] = 8 = 23 = 23−0 = 2CP−(CP−3) = 23

    Desta forma a quantidade de divisões de cada coluna é dada pela Equação 3.5

    Div[NC] = 2CP−(CP−NC) = 2NC (3.5)

    onde NC é o número da coluna. A quantidade de elementos por cada divisão

    em uma coluna é dada pela Equação 3.6.

    Elementos[NC] =2CP

    Div[NC](3.6)

    Para um melhor entendimento, veja-se a Tabela 3.6 na qual a coluna 1

    (NC = 1) tem Div[1] = 2 e Elementos[1] = 4, ou seja, apresenta 2 intervalos e

    cada intervalo possui 4 elementos. Na coluna 2 (NC = 2) tem-se Div[2] = 4

    e Elementos[2] = 2. Ou seja, tem-se 4 intervalos de 2 elementos e, a coluna 3

    (NC = 3) apresenta Div[3] = 8 e Elementos[3] = 1, ou seja, apresenta 8 intervalos

    de 1 elemento cada um.

    A desvantagem do uso desta metodologia na determinação das rotas é a

    não definição da seqüência a seguir. Por exemplo, retomando a rota Rx da

  • 3.3. SEQÜÊNCIAS EM UMA ROTA 17

    Tabela 3.6: Aplicação do conceito de elementos e divLinha NC = 1 NC = 2 NC = 3

    0 1 1 11 1 1 02 1 0 13 1 0 04 0 1 15 0 1 06 0 0 17 0 0 0

    Tabela 3.1, não se sabe se da refinaria r1 vai à Plataforma p1 ou à p3. São apre-

    sentadas algumas soluções a este problema, baseadas na idéia das seqüências

    a serem seguidas, em uma rota.

    3.3 Seqüências em uma rota

    Como já mencionado existe um problema na definição de uma rota, uma vez

    informada qual é a refinaria de saída, a refinaria de chegada e as plataformas

    que se deve visitar, mas não se informou em que seqüência se visitam estas

    plataformas. Por exemplo, no caso da rota Rx pode-se definir 2 seqüências

    diferentes:

    1. r1 → p1 → p3 → r2

    2. r1 → p3 → p1 → r2

    Para este caso particular (rota Rx) tem-se, apenas, duas formas de ir da refi-

    naria r1 à refinaria r2 passando pelas plataformas p1 e p3. Porém, a quantidade

    de combinações vai depender da quantidade de plataformas.

    A seguir serão propostas algumas formas para resolução deste problema.

    Primeira solução

    Uma solução é definir uma matriz onde cada linha se corresponda com a linha

    na matriz de rotas possíveis (por exemplo a matriz apresentada na Tabela 3.1);

    e, cada coluna determine a distância da rota. A distância, refere-se à distância

    total da seqüência, ou seja a seqüência r1 → p1 → p3 → r2 apresenta uma

    distância de 500 km referente a soma da distância de r1 a p1, acrescida da

    distância de p1 a p3, e da distância de p3 a r2.

    Por exemplo, suponha-se uma rota com 2 refinarias e 2 plataformas, mais

    especificamente a rota Rx, apresentada na Tabela 3.1. Existem 16 possíveis

  • 3.3. SEQÜÊNCIAS EM UMA ROTA 18

    combinações de seqüências (Equação 3.1, página 13). Tome-se a seqüência

    r1 → p1 → p3 → r2 com distância de 500 km, supondo que se conhece as dis-

    tâncias entre as plataformas e refinarias; e, a seqüência r1 → p3 → p1 → r2com distância de 322 km. A Matriz de Distâncias irá armazenar a distância

    das seqüências, com um número de linhas igual da matriz de todas as ro-

    tas e número de colunas dado pela Equação 3.1. No caso de 3 refinarias e 3

    plataformas tem-se 72 colunas. A rota Rx tem 16 possíveis combinações e a

    matriz de distâncias tem 72. Deve-se ocupar as primeiras colunas da matriz e

    completar o restante com um valor negativo (dado que não existem distâncias

    negativas), para determinar que não há mais combinações. Então, a linha que

    corresponde à rota Rx na matriz de distâncias terá nas primeiras 16 posições

    as distâncias de todas as combinações possíveis da rota.

    Esta solução tem três desvantagens importantes. A primeira é que para

    saber a qual seqüência pertence a distância, necessita-se gerar as seqüências;

    calcular a distância; e verificar se é igual ao valor procurado, o que demanda

    bastante cálculo. Outra desvantagem é baseada na ambigüidade do problema,

    dado que, pode haver mais de uma seqüência com a mesma distância. Por

    ultimo o problema de espaço de memoria em um computador, dado que se

    uma matriz de 72 colunas só usa parte dela (no caso da linha da rota Rx, 16

    colunas, se está desperdiçando muito espaço.

    Segunda solução

    Outra possível solução é fazer uma matriz com o número de colunas = CP +1,

    onde a primeira coluna será o número de linha da rota à qual corresponde

    a seqüência que se encontra no resto das coluna na mesma linha, ou seja,

    retoma-se o exemplo da rota Rx da Tabela 3.1 e considera-se que esta rota

    está na linha 13 e além disso o código de p1 é = 1 e o de p3 é = 3 então,

    se obtería o resultado que pode ser observado na Tabela 3.7, onde o valor

    −1 é o elemento neutro (valor negativo mencionado com anterioridade), que

    determina que na rota só há duas plataformas para construir as seqüências.

    Esta solução elimina a ambigüidade da solução anterior, mas ainda se tem

    o problema do espaço de memória, dado que se o sistema fosse maior, por

    exemplo, se houvesse 30 plataformas e se consideranse as rotas que só pas-

    sam por algumas plataformas, está-se desperdiçando bastante espaço. Além

    disso, se tem que calcular a distância, o que demandaria mais tempo de ex-

    ecução. Para solucionar este problema se pode combinar a solução anterior

    com esta, agregando uma coluna mais à matriz na qual se situa a distância

    da seqüência, como se pode ver na Tabela 3.8.

  • 3.3. SEQÜÊNCIAS EM UMA ROTA 19

    Tabela 3.7: Segunda possível soluçãoLinha da Primeira Segunda Terceira

    rota plataforma plataforma plataforma...

    ......

    ...13 1 3 −113 3 1 −1...

    ......

    ...

    Tabela 3.8: Soluções combinadasLinha da Distância Primeira Segunda Terceira

    rota da rota(mn) plataforma plataforma plataforma...

    ......

    ......

    13 500 1 3 −113 322 3 1 −1...

    ......

    ......

    Terceira solução

    Outra solução, partindo-se da idéia das duas soluções anteriores visando

    otimizar o espaço de memória utilizado, é associar a cada rota uma matriz

    com a quantidade de linhas igual à quantidade de possíveis combinações (a

    qual se calcula com a Equação 3.1) e a quantidade de colunas igual à quan-

    tidade de plataformas da rota (já não mais a quantidade de plataformas do

    sistema) mais três, a primeira coluna com a distância, a segunda coluna com

    a refinaria de partida e a última coluna com a refinaria de chegada, e as co-

    lunas centrais estão destinadas para determinar a seqüência de plataformas,

    como pode ser observado na Tabela 3.9.

    Tabela 3.9: Terceira soluçãoDistância Refinaria Primeira Segunda Refianria

    da rota (mn) de saída plataforma plataforma de chegada450 10 1 3 20500 10 3 1 20

    Esta metodologia gera uma lista de matrizes, onde a posição da matriz

    na lista determina a linha da rota na matriz de rotas possiveis à qual faz

    referência. Esta solução otimiza o espaço de memória utilizado, dado que se

    definem as matrizes com as linhas e colunas que só se vão utilizar; além disso

    não se tem o problema de ambigüidade, uma vez que pode haver a condição

    de existir duas distâncias iguais, mas as seqüências que determinam essas

    distâncias não o sejam; e por último a distância é calculada uma única vez

  • 3.4. CALCULAR TODAS AS POSSÍVEIS SEQÜÊNCIAS DA ROTA 20

    quando se constroi a matriz das seqüências da rota, conseguindo assim não

    recalcular este dado cada vez que necessitemos da distância.

    Na próxima seção será apresentada a metodologia usada para o cálculo de

    todas as possíveis seqüências em uma rota.

    3.4 Calcular todas as possíveis seqüências da rota

    Para calcular todas as possíveis seqüências de uma rota, primeiro deve-se

    levar em consideração, que toda seqüência deve começar com a refinaria de

    partida e terminar com a refinaria de chegada, por isso as possíveis combi-

    nações são feitas com o conjunto de plataformas.

    Para calcular todas as possíveis combinações da rota, tem-se que gerar

    as Permutações ou Ordenações sem Repetição, que se definem da seguinte

    maneira:

    “As permutações sem repetição de n elementos se define como as distintas

    formas de ordenar todos os elementos distintos”, uma vez que a única dife-

    rença entre elas é a ordem de colocação de seus elementos. O número destas

    permutações é dada pela Equação 3.7:

    CPn = n! (3.7)

    Ou seja, para o caso de 3 plataformas tem-se CP3 = 3! = 6 e para 4, tem-se

    CP4 = 4! = 24.

    Agora, quais são os passos que se devem seguir para obter todas as pos-

    síveis combinações?.

    Primeiro deve-se encontrar uma metodologia a seguir, a que propõe-se

    neste trabalho é a que se apresenta na Tabela 3.10. A metodologia usada

    é: para cada coluna (NC) sabe-se a quantidade de vezes consecutivas (CV C)

    de um elemento do conjunto, determinada pela Equação 3.8:

    CV C[NC] = (n − NC)! (3.8)

    onde n é a quantidade de elementos que tem o conjunto, que neste caso é a

    quantidade de plataformas. Além disso sabe-se que se tem x vezes a repetição

    deste intervalo na coluna, onde x é calculada pela Equação 3.9:

    x = CRepit[NC] =

    n!CV C[NC]

    n=

    (n − 1)!

    CV C[NC](3.9)

  • 3.4. CALCULAR TODAS AS POSSÍVEIS SEQÜÊNCIAS DA ROTA 21

    Tabela 3.10: Permutações sem repetição de 4 plataformasp1 p2 p3 p4

    1 1 2 3 42 1 2 4 33 1 3 2 44 1 3 4 25 1 4 2 36 1 4 3 27 2 1 3 48 2 1 4 39 2 3 1 410 2 3 4 111 2 4 1 312 2 4 3 113 3 1 2 414 3 1 4 215 3 2 1 416 3 2 4 117 3 4 1 218 3 4 2 119 4 1 2 320 4 1 3 221 4 2 1 322 4 2 3 123 4 3 1 224 4 3 2 1

  • 3.4. CALCULAR TODAS AS POSSÍVEIS SEQÜÊNCIAS DA ROTA 22

    Observa-se na Tabela 3.10, na primeira coluna (p1), NC = 1 , tem-se

    CV C[1] = (4 − 1)! = 3! = 6

    CRepit[1] =(4 − 1)!

    6=

    3!

    6= 1

    Estas equações (já apresentadas nas Equações 3.8 e 3.9) apresentam os resul-

    tados que se podem observar na Tabela 3.10, já que tem 6 uns consecutivos

    uma só vez na coluna, seguido de 6 dois consecutivos e assim até terminar os

    elementos do conjunto.

    Para a coluna NC = 2, (p2):

    CV C[2] = (4 − 2)! = 2! = 2

    CRepit[2] =(4 − 1)!

    2=

    3!

    2=

    6

    2= 3

    Para a coluna NC = 3, (p3):

    CV C[3] = (4 − 3)! = 1! = 1

    CRepit[3] =(4 − 1)!

    1=

    3!

    1= 6

    E por último a coluna NC = 4, (p4):

    CV C[4] = (4 − 4)! = 0! = 1

    CRepit[4] =(4 − 1)!

    1=

    3!

    1= 6

    Então pode-se concluir que as equações de CV C e CRepit são corretas.

    Agora, para obter todas as possíveis seqüências em uma rota, só falta agre-

    gar uma coluna ao início com a refinaria de partida da rota e uma coluna ao

    final com a refinaria de chegada, e seguindo a terceira solução apresentada

    na seção 3.3 só faltaria agregar mais uma coluna ao começo da matriz, calcu-

    lar a distância de cada seqüência e armazená-la nesta coluna.

    Depois de ter pronta a matriz com toda a informação, já se pode ordenar

    esta de menor a maior com respeito à distância, isto irá facilitar a forma de

    busca na hora de procurar a seqüência de distância mínima seguinte na rota.

  • 3.5. CONCEITO DE CAMINHO 23

    3.5 Conceito de caminho

    Um caminho é um conjunto de rotas, o qual associa um navio a uma matriz

    que vai determinar a seqüência que o navio deve seguir nesse caminho, além

    disso, seguindo a idéia da terceira solução, discutida na seção 3.3. Esta

    matriz tem as seguintes dimensões: linhas = quantidade de possíveis combi-

    nações das rotas neste caminho; e, colunas = quantidade de rotas (CRutas)

    mais 1, sendo usada para armazenar a distância total da seqüência de rotas

    da linha. O cálculo da distância total, não é tão trivial como na seção anterior,

    e será apresentado na seção 6.1.

    Para obter as possíveis seqüências de rotas, foi utilizada a metodologia de-

    scrita na seção 3.4, onde foi considerado o conjunto de elementos, para gerar

    as permutações sem repetição, com as plataformas. Neste caso, o conjunto

    de elementos é o conjunto de rotas associadas ao caminho. Uma vez obtidas

    as combinações das CRutas! , é calculada a distância de cada combinação das

    rotas. Este cálculo, não é trivial, uma vez que depende de fatores como, a

    seqüência e a distância da seqüência de cada rota que compõe este caminho.

    Se em uma seqüência se teme, por exemplo, as rotas R1, R2 e R3 associadas

    às distâncias mínimas destas 1100mn, 1200mn e 1300mn, respectivamente, a

    distância do caminho não é necessariamente a soma de todas as distâncias

    das rotas, ou seja, 3600mn, função apenas das refinarias de chegada e saída

    de cada rota. Considerando o caso da refinaria de chegada da rota R1 ser

    diferente da refinaria de partida da rota R2, a principio, a distância total seria

    a soma das distâncias entre as duas refinarias, mas na prática, não tem sen-

    tido um navio atracar se não houver necessidade de carga ou descarga, já que

    isto implica custos adicionais. Portanto, a distância total deve ser calculada

    como a distância entre a refinaria de partida da segunda e a primeira plata-

    forma, na seqüência da mesma rota, acrescida da distância entre a refinaria

    de chegada da primeira rota e a primeira plataforma, na seqüência da segunda

    rota, conforme será apresentado na seção 6.1.

    Assim sendo, na coluna de distância da matriz do caminho, são calculadas

    as distância mínimas na seqüência de cada rota que compõem o caminho, o

    que não necessariamente é real, dado que se pode escolher uma seqüência

    de uma rota que não apresenta uma distância mínima, e, por conseguinte,

    vai diferir da distância da seqüência das rotas na matriz do caminho. Para

    contornar este problema é definida uma matriz chamada secuencia, associada

    ao caminho, a qual contém a seqüência de refinarias e plataformas que o navio

    deve percorrer.

  • Capítulo 4

    Classes

    Nesta seção são explicadas as classes que conformam o sistema, usando a

    Linguagem Unificada de Modelagem (UML) (para quem não tenha conheci-

    mento sobre UML recomenda-se a leitura de Larman (2003) ou Rumbaugh

    et al. (2004) para melhor compreensão desta seção).

    Uma classe é um elemento de UML, usado para especificar o padrão do qual

    se produzirão os objetos em tempo de execução. Portanto, uma classe é uma

    especificação e um objeto é uma instância de uma classe. As classes podem

    ter outras classes como atributos; podem delegar suas responsabilidades a

    outras classes; e, implementar interfaces abstratas. O modelo de classes está

    no núcleo do desenvolvimento e do desenho orientados a objetos; e, expressa

    o estado e o comportamento do sistema. Uma classe encapsula o estado (os

    atributos) e oferece os serviços (métodos) para sua manipulação. Um bom

    desenho orientado a objetos limita o acesso direto aos atributos da classe e

    oferece os serviços que manipulam o requerimento do solicitante. Este enco-

    brimento dos dados e exposição dos serviços assegura que as modificações dos

    dados realizam-se em um unico lugar e de acordo com regras específicas; para

    grandes sistemas a quantidade de código com acesso direto aos elementos de

    dados em muitos locais é extremadamente alto. Combinando-se um conjunto

    de objetos (instâncias das classes) e o modelo das classes, obtém-se o que se

    denomina cenário. Um cenário determina o que acontece na realidade num

    tempo especifico, como se alguem tira uma fotografia de um sistema e observa-

    se como estão as informações (atributos) das classes naquele instante.

    A seguir são explicadas as classes a serem utilizadas no sistema proposto.

    24

  • 25

    Matriz� MaxX : int� MaxY : int� pMatriz : int*+ Matriz()+ Matriz(X : int, Y : int)+ ReDim(X : int, Y : int)+ at(X : int, Y : int) : int+ at(X : int, Y : int, Valor : int)+ getX() : int+ getY() : int+ print_R_data_frame()+ print()+ print2()+ printSched()+ printSeq()+ printSchedLatex()+ print_R()

    Figura 4.1: Classe Matriz

    Classe Matriz

    Esta classe foi desenvolvida pelo fato de que em C++ não existe nos seus tipos

    primitivos, um tipo Matriz. Nesta linguagem define-se uma matriz com um

    ponteiro ao tipo de dados desta. A forma de armazenamento dos dados é

    é semelhante a um vetor, para se identificar uma posição da matriz deve-se

    utilizar o seguinte procedimento: M [i ∗ CC + j] onde CC é a quantidade de

    colunas contidas na matriz M . O problema de trabalhar com uma matriz

    desta forma, ou seja com um ponteiro, é que para passar como parâmetro a

    mesma, também tem-se que passar como parâmetro a quantidade de linhas

    e a quantidade de colunas da matriz, para, assim, saber qual a dimensão da

    mesma.

    Então definiu-se a classe Matriz, que se apresenta na Figura 4.1, onde

    tem-se três atributos, os quais determinam a quantidade de linhas (MaxX), a

    quantidade de colunas (MaxY) e o ponteiro para os dados (pMatriz). Como

    pode-se observar neste último atributo, esta classe só aceita dados de tipo

    inteiro dado que neste trabalho só se necessitam matrizes deste tipo. Esta

    classe tem dois construtores, Matriz() e Matriz(X,Y) onde o primeiro define

    uma matriz sem dimensões e o segundo gera a matriz já com dimensões (X*Y).

    Além dos construtores se implementou uma função ReDim(X,Y) que redimen-

    siona a instância da classe que invoca esta função. Para obter a informação da

    posição [i,j] definiu-se a função at(i,j), na qual usou-se um polimorfismo

    de sobrecarga (para quem não tem conhecimento de polimorfismo de sobre-

  • 26

    carga, recomenda-se a leitura da seção 2.6 de Lippman (2002)) para poder

    atribuir um valor na posição [i,j], é dizer a mesma função invocada com

    mais um parâmetro (por exemplo z), que é o valor a ser adicionado na posição.

    Então a função at(i,j,z) adiciona o valor z na posição [i,j] do objeto que

    a invoca. Outras funções implementadas foram getX() e getY() as quais dão

    a quantidade de linhas e colunas, respectivamente, que tem a instância que as

    invoca; e por último implementou-se várias formas de imprimir a matriz, das

    quais, entre as mais importantes, destaca-se a função print_R_data_frame

    a qual imprime em um arquivo os dados da matriz colocando estes com for-

    mato de um tipo de dados (data_frame) nativo de R (R-Project) a ser detalhado

    na seção 6.2, é um software que será utilizado neste trabalho para a geração

    dos gráficos do relatorio final do sistema.

    Classe Grafo

    Grafo� nodos : int*� aristas : Matriz� CN : int+ iniciar()+ addNodo(nodo_nuevo : int)+ remNodo(i : int)+ addArista(nodo_1 : int, nodo_2 : int, dist : int)+ remArista(nodo_1 : int, nodo_2 : int)+ getDistancia(nodo_1 : int, nodo_2 : int) : int+ print()+ printLatex()

    Figura 4.2: Classe Grafo

    Nesta classe foram definidos os dados referentes às platarmas e refinarias

    que podem ser vistas como nós e a distância entre estas podem ser vistas

    como as arestas que unem estes nós, desta forma o conjunto de plataformas e

    refinarias são representadas com um grafo.

    Nesta classe (ver Figura 4.2) tem-se 3 atributos, os quais determinam a

    quantidade de nós (CN), as etiquetas dos nós (nodos), que representam o código

    da plataforma ou refinaria à qual corresponda o nó, e a matriz de adjacência

    (aristas). Os métodos implementados para esta classe foram: o construtor

    (iniciar); agregar um novo nó (addNodo); remover um nó (remNodo); agregar o

    peso de uma aresta, que no nosso caso a distância entre os nós, (addArista);

    remover uma aresta (remArista); obter o peso da aresta

  • 27

    (getDistancia); e duas formas de imprimir a instância da classe.

    Classe Compartimento

    Compartimento� codigo : int� capacidade : float� tipoProduto : int� quantidadeProduto : float+ iniciar(codP : int, capP : float, tipoProdP : int, qProdP : float)+ getCodigo() : int+ getCapacidade() : float+ getTipoProduto() : int+ getQuantidadeProduto() : float+ setCodigo(cod : int)+ setCapacidade(cap : float)+ setTipoProduto(tp : int)+ setQuantidadeProduto(qp : float)+ print()

    Figura 4.3: Classe Compartimento

    A classe Compartimento, Figura 4.3, tem a finalidade de instanciar diferen-

    tes compartimentos que podem pertencer a um navio. Nesta classe os dados

    importantes a destacar, quer dizer, os atributos, são: o código (codigo), o qual

    vai diferencia-lo do resto dos compartimentos; a capacidade deste comparti-

    mento (capacidade); o tipo de produto (tipoProduto); e a quantidade de pro-

    duto. Os métodos implementados para esta classe são: o construtor (iniciar)

    o qual toma como parâmetro o código do compartimento (codP), a capacidade

    do compartimento (capP), o tipo de produto (tipoProdP) e a quantidade de

    produto armazenado (qProdP); e os que manipulam direitamente os atributos,

    os quais, seguindo a tradição, foram chamados com get+Nome_do_Atributo

    para os métodos que permitem obter a informação do atributo do objeto que

    invoca o método; e set+Nome_do_Atributo para os métodos que permitem

    atribuir um valor ao atributo do objeto que o invoca. Além destes métodos

    implementou-se um método para impressão dos dados desta classe.

    Classe Navio

    A classe Navio, Figura 4.4, tem a finalidade de instanciar diferentes navios que

    podem pertencer a uma frota (Figura 4.5 na pagina 30). Nesta classe os atribu-

  • 28

    Navio� codigo : int� descricao : string� calado : float� comprimento : float� velocidade : float� t_atraco : Matriz� t_desatraco : Matriz� v_descarrega : int� comp : Compartimento*� quantidadeComp : int+ iniciar(codP : int, descP : string, calP : float, compriP : float, velP : float)+ getCodigo() : int+ getDescricao() : string+ getCalado() : float+ getComprimento() : float+ getVelocidade() : float+ getComp(i : int) : Compartimento+ getCarrega() : float+ getCapacidade() : float+ getVelocidadeDescarrega() : int+ getTempoAtraco(cod : int) : int+ getTempoDesatraco(cod : int) : int+ setCodigo(cod : int)+ setDescricao(des : string)+ setCalado(cal : float)+ setComprimento(com : float)+ setVelocidade(velo : float)+ setVelocidadeDescarrega(LitrosPorUnidadDeTiempo : int)+ setTempoAtraco(cod : int, tempo : int)+ setTempoDesatraco(cod : int, tempo : int)+ addComp(compart : Compartimento)+ setCarregar(petro : float) : bool+ setDescarregar(petro : float) : bool+ Descarregar() : float+ print()+ printLatex()

    Figura 4.4: Classe Navio

  • 29

    tos mais importantes a se destacar, são: o código (codigo) que irá diferencia-

    lo do resto dos navios instanciados; uma descrição do mesmo (descricao);

    o calado (calado); o comprimento (comprimento); a velocidade (velocidade);

    o tempo de atracação (t_atraco), que é um objeto do tipo matriz, que na

    primeira linha terá as plataformas e refinarias presentes no sistema e na se-

    gunda linha o tempo que o navio instânciado, vai demorar para atracar na

    refinaria ou plataforma correspondente à coluna da primeira linha; o tempo

    de desatracação (t_desatraco) que é um objeto de tipo matriz que na primeira

    linha terá as plataformas e refinarias existentes no sistema e na segunda linha

    o tempo que, o navio instânciado, irá demorar para desatracar da refinaria

    ou plataforma correspondente à coluna na primeira linha; a velocidade de

    bombeio do produto armazenado nos compartimentos (v_descarrega), que

    é um atributo é de especial importância, uma vez que irá determinar qual o

    tempo mínimo que um navio pode ficar atracado em uma refinaria descarre-

    gando o petróleo coletado nas plataformas; um conjunto de objetos Compar-

    timento (comp) que irá determinar a capacidade do navio; e a quantidade de

    compartimentos (quantidadeComp) que se tem no conjunto comp.

    Os métodos implementados para esta classe são por um lado os que ma-

    nipulam diretamente os atributos, chamados com os nomes

    get+Nome_do_Atributo para os métodos que permitem obter a informação

    do atributo do objeto que o invoca; e set+Nome_do_Atributo para os méto-

    dos que permitem atribuir um valor ao atributo do objeto que o invoca. E por

    outro lado são: o construtor (iniciar) o qual toma como parâmetro o código

    do navio (codP), a descrição (descP), o calado (calP), o comprimento (compriP)

    e a velocidade (velP); o método getCapacidade que calcula a carga do navio;

    o método Descarregar o qual retorna a quantidade de petróleo total em to-

    dos os compartimentos e esvazia os mesmos, ou seja, além de descarregar,

    informa quanto descarregou; e dois métodos para impressão dos dados desta

    classe.

    Classe Frota

    Esta classe, Figura 4.5, foi definida para armazenar todas as possíveis instân-

    cias da classe Navio permitindo criar conjuntos de navios. Os atributos desta

    classe, são: um código (codigo); uma descrição (descricao); um conjunto

    de objetos Navio (navios); e a quantidade de objetos (CN) que tem o conjunto

    navios. Os métodos implementados para esta classe foram, além dos que

    permitem manipular os atributos, um método para imprimir a informação da

  • 30

    Frota� codigo : int� descricao : string� navios : Navio*� CN : int+ iniciar(codigoP : int, descricaoP : string)+ getCodigo() : int+ getDescricao() : string+ getNavio(pos : int) : Navio+ setCodigo(cod : int)+ setDescricao(des : string)+ addNavio(n : Navio)+ print()

    Figura 4.5: Classe Frota

    classe e o construtor, o qual toma como parâmetros a informação do código

    (codigoP) e a descrição (descricaoP).

    Classe Piers

    Esta classe, Figura 4.6, foi definida para poder instanciar diferentes piers,

    onde pudesse variar a profundidade (profundidade), a largura (largo) e o

    comprimento (cumprimento), diferenciando-os por um código (codigo). Além

    disso se agregou mais um atributo, que é o valor de verdade que deter-

    mina se essa instância do pier está ocupada ou não (ocupado). Nesta classe

    implementam-se os métodos que permitem manipular os atributos, além do

    método que permite imprimir os dados desta classe e o construtor da mesma,

    o qual toma como parâmetros o código (codP), a profundidade (profP), a

    largura (largoP) e o comprimento (compriP). Outro método que implementou-

    se é baseado na restrição que um navio só pode atracar em uma refinaria se

    existir um pier disponível e além disso a profundidade deste pier mais a al-

    tura da maré deve ser maior que o calado do navio. O comprimento do navio

    é menor que o do pier, então neste método (puedeAtracar) passa-se como

    parâmetro o calado do navio (calado), o comprimento do mesmo (n_compr) e

    a altura da maré, e retorna verdadeiro se e só se o pier está disponível e se o

    calado do navio for menor que a profundidade do piers mais a altura da maré;

    o comprimento do navio é menor que o comprimento do pier.

  • 31

    Piers� codigo : int� profundidade : float� largo : float� cumprimento : float� ocupado : bool+ iniciar(codP : int, profP : float, largoP : float, cumpriP : float)+ getCodigo() : int+ getProfundidade() : float+ getLargo() : float+ getCumprimento() : float+ getOcupado() : bool+ setCodigo(cod : int)+ setProfundidade(p : float)+ setLargo(l : float)+ setCumprimento(c : float)+ setOcupado(ocup : bool)+ puedeAtracar(calado : float, n_cumpr : float, alt_marea : float) : bool+ print()

    Figura 4.6: Classe Piers

    Classe Porto

    Um porto é composto por conjunto de piers onde os navios são atracados. Na

    classe Porto, Figura 4.7, tem-se como atributo os seguintes dados: o código

    (codigo) definido como único, permitindo diferencia-lo dos outros objetos do

    mesmo tipo, o nome (nome), a cidade na que está (cidade), o estado no que

    se encontra (estado), o país (pais), o conjunto de piers (piers), a quanti-

    dade de piers no conjunto piers (quantidadePiers), a amplitude da maré

    nesse porto (amplitud) e a hora exata da primeira maré morta (MM) a partir

    da hora 0 em que começa o scheduling. Os métodos implementados para esta

    classe, além dos que permitem manipular os atributos, agregando os métodos

    addPiers e remPiers que anexam e eliminam Piers do conjunto piers, e o

    que permite imprimir a informação da classe, são: o método que determina se

    um navio pode atracar ou não nesse porto, este método (puedeAtracar) toma

    como parâmetros o navio (n) e o tempo (t), que verifica se existe algum pier

    desocupado e assim verifica, com respeito à hora que irá determinar a altura

    da maré, se o navio pode atracar nesse piers ou não; e o construtor (iniciar)

    que toma como parâmetros o código (codP), o nome (nP), a cidade (cidP), o

    estado (estP), o país (paisP), a hora da primeira maré morta (PMM) a partir da

    hora 0 do scheduling e a amplitude da maré (ampli).

  • 32

    Porto� codigo : int� nome : string� cidade : string� estado : string� pais : string� piers : Piers*� quantidadePiers : int� amplitud : float� MM : float+ iniciar(codP : int, nP : string, cidP : string, estP : string, paisP : string, PMM : float, ampli : float)+ getCodigo() : int+ getNome() : string+ getCidade() : string+ getEstado() : string+ getPais() : string+ getAmplitud() : float+ getMM() : float+ setCodigo(cod : int)+ setNome(nomeP : string)+ setCidade(cidadeP : string)+ setEstado(estadoP : string)+ setPais(paisP : string)+ setAmplitud(ampli : float)+ setMM(time : float)+ addPiers(p : Piers)+ remPiers(codPiers : int)+ puedeAtracar(n : Navio, t : int) : bool+ print()

    Figura 4.7: Classe Porto

  • 33

    Classe Refinaria

    Refinaria� codigo : int� nome : string� cidade : string� estado : string� pais : string� descarregado : float� quantidadePortos : int� portos : Porto*+ iniciar(codP : int, nomeP : string, cidadeP : string, estP : string, paisP : string)+ getCodigo() : int+ getNome() : string+ getCidade() : string+ getEstado() : string+ getPais() : string+ getPorto(i : int) : Porto+ getDescarregado() : float+ getQuantidadePortos() : int+ setCodigo(cod : int)+ setNome(nomeP : string)+ setCidade(cidadeP : string)+ setEstado(estadoP : string)+ setPais(paisP : string)+ setDescarregado( : float)+ addPorto(port : Porto)+ puedeAtracar(n : Navio, t : int) : bool+ print()+ printLatex()

    Figura 4.8: Classe Refinaria

    Em uma refinaria existe um porto que é composto por vários piers. Neste

    trabalho considerou-se a possibilidade de existir várias refinarias, assim pode-

    se trabalhar com uma quantidade maior de cenários. É por esta razão que

    definiu-se a classe Refinaria, Figura 4.8, os atributos desta classe são: o

    código (codigo) o qual irá determinar a refinaria instanciada como única;

    o nome (nome), a cidade na qual ela está localizada (cidade), o estado em

    que se encontra (estado), o país (pais), o conjunto de portos (portos), a

    quantidade de portos no conjunto portos (quantidadePortos) e a quanti-

    dade de petróleo bruto descarregada na refinaria (descarregado), este último

    atributo tem como finalidade poder considerar que em um determinado plane-

    jamento apresenta a quantidade de petróleo existente em um período inicial,

    aproximando-se mais à realidade. Os métodos implementado para esta classe,

  • 34

    além dos que permitem manipular os atributos, e o que permite imprimir

    a informação da classe, são: o método getCantPiers o qual nos retorna a

    quantidade de Piers associados a esta Refinaria, ou seja é a soma dos Piers

    pertencentes aos Portos que a Refinaria tem; o método que determina se um

    navio pode atracar ou não nesta refinaria, este método (puedeAtracar) toma

    como parâmetros o navio (n) e o tempo (t), com a informação do navio e o

    tempo onde o método procura em todos os portos, do conjunto portos, e

    identifica se existe a disponibilidade para que um navio possa atracar; o cons-

    trutor (iniciar) que toma como parâmetros o código (codP), o nome (nomeP),

    a cidade (cidadeP), o estado (estP), o país (paisP).

    Classe Plataforma

    Plataforma� codigo : int� nome : string� producao : float� capacidadeMax : float� v_carrega : int� horaUD : int� resto : float+ iniciar(codP : int, nomeP : string, prodP : float, capMaxP : float, hUDP : int, resto : float)+ getCodigo() : int+ getNome() : string+ getProducao() : float+ getCapacidadeMax() : float+ getHoraUD() : int+ getResto() : float+ getTempoMax() : int+ getVelocidadeCarrega() : int+ setCodigo(cod : int)+ setNome(nome : string)+ setProducao(prod : float)+ setCapacidadeMax(cap : float)+ setVelocidadeCarrega(litrosPorUnidadeDeTempo : int)+ setHoraUD(hud : int)+ setResto(rest : float)+ print()+ printLatex()

    Figura 4.9: Classe Plataforma

    Uma plataforma marítima tem como propósito a extração de petróleo bruto

  • 35

    no mar. Existem muitos tipos de plataformas, mas neste trabalho só será

    considerada a informação caracterízada na Figura 4.9, onde se apresenta

    a classe Plataforma. Os atributos desta classe são: o código (codigo) que

    vai determinar a plataforma instânciada como única; o nome (nome); a pro-

    dução (producao) a qual determina a quantidade de petróleo que se extrai por

    unidade de tempo; a capacidade máxima (capacidadeMax) que é a quantidade

    máxima de petróleo bruto que a plataforma pode armazenar, fator importante

    para indicar se a sua capacidade máxima atinge um ponto que obrigaria a

    parada da produção; a velocidade de carga do bombeamento (v_carrega),

    responsavel por determinar a quantidade de tempo que um navio estará atra-

    cado à mesma para carregar o petróleo; a hora da última descarga (horaUD)

    ou seja, a hora em que o último navio esteve na plataforma carregando; e o

    volume da última descarga (resto) que é a quantidade de petróleo que ficou

    estocado após a última descarga. Os métodos implementados para esta classe,

    além dos que permitem manipular os atributos e os que permite imprimir a

    informação da classe, são: o método do tempo máximo (getTempoMax) que diz

    respeito ao limite, em tempo, que a plataforma pode ficar sem descarregar, é

    calculado com base na hora da última descarga, o volume estocado e a pro-

    dução da plataforma; e o construtor (iniciar) que toma como parâmetros

    o código (codP), o nome (nomeP), a produção (prodP), a capacidade máxima

    (capMaxP), a hora da última descarga (hUDP) e o estoque (resto).

    Classe Rota

    Uma rota, como se definiu na seção 3, é formada por uma refinaria de partida,

    uma de chegada, e um conjunto de plataformas. Com estas informações, mais

    a informação do grafo que contem as distâncias, gera-se uma matriz onde cada

    linha é uma seqüência possível que se pode seguir onde a primeira coluna ar-

    mazena a distância total da seqüência, determinada pela linha, da rota. Na

    segunda coluna armazena-se o código da refinaria de partida, na última co-

    luna a refinaria de chegada e nas colunas centrais as plataformas associadas

    á rota. Para armazenar estas informações e poder instanciar mais de uma

    rota no cenário, definiu-se a classe Rota que se apresenta na Figura 4.10. Na

    classe Rota estão presentes os seguintes atributos: o código (codigo) que vai

    determinar uma rota como única; a refinaria de partida (partida); a refinaria

    de chegada (llegada); o conjunto de plataformas (plataformas); a quanti-

    dade de plataformas no conjunto plataformas (CP); a matriz secuencias que

    contem todas as possíveis combinações de seqüências que podemse seguir na

  • 36

    Rota� codigo : int� partida : Refinaria� llegada : Refinaria� plataformas : Plataforma*� CP : int� secuencias : Matriz� retardo : int� carga : float*+ iniciar(cod : int)+ getCodigo() : int+ getRetardo() : int+ getPartida() : Refinaria+ getChegada() : Refinaria+ getPlataforma(i : int) : Plataforma+ getCarga(nodo : int) : float+ getSecuencias() : Matriz+ setRetardo(r : int)+ setPartida(RP : Refinaria)+ setChegada(RC : Refinaria)+ addPlataforma(p : Plataforma)+ setCarga(des : float, nodo : int)+ generar_secuencias(dist : Grafo) : Matriz+ getDistancia(i : int) : int+ getCantNodos() : int+ sePuedeIncrementar(inc : int) : bool+ esPlataforma(cod : int) : bool+ print()+ printLatex()

    Figura 4.10: Classe Rota

  • 37

    rota; o retardo (retardo) que identifica uma rota inicial, atributo usado como

    objetivo de aproximar mais o sistema à realidade, uma vez que um navio tem

    mais de duas rotas a ele associadas, pode ocorrer que entre as viagens, o

    navio, dentre outras possibilidades de retardo, deva ser limpado, ou trocar a

    tripulação, etc; e a carga (carga) que objetiva fazer com que as plataformas

    associadas às rotas, diante de um planejamento determinado, onde são es-

    pecificadas que plataformas deverão ser visitadas e quanto será carregado em

    cada uma delas.

    Os métodos implementados