Automatização de Sistema Logístico

Job ID: 39501761

Budget: $10 – $30 USD

1. Descrição do Problema
O objetivo central é automatizar o sistema logístico dos Armazéns Hanoi, que lida com o transporte e armazenamento de pacotes entre seus diversos armazéns. A rede de armazéns é representada como um grafo não direcionado e conhecido previamente.


Funcionamento do Sistema:

Recebimento e Rota: Um pacote chega a um armazém de origem e é destinado a outro armazém na rede. Ao chegar, ele recebe um número de identificação único e tem sua rota calculada. A rota é uma lista encadeada de armazéns a percorrer.


Armazenamento: Dentro de um armazém, os pacotes são organizados em seções, onde cada seção corresponde a um armazém diretamente conectado. A particularidade do sistema é que cada seção funciona com uma lógica LIFO (Last-In, First-Out), similar a uma pilha. Para retirar um pacote que não está no topo, todos os pacotes que foram colocados depois dele devem ser removidos primeiro.

Transporte: Uma vez por dia, os pacotes são transportados entre os armazéns conforme suas rotas. Existe uma capacidade máxima de pacotes que podem ser transportados diariamente entre dois armazéns. A prioridade de transporte é dada aos pacotes que estão em trânsito há mais tempo.

Análise de Gargalos: O sistema deve ser capaz de identificar pacotes que ficaram retidos em um armazém por mais tempo que o necessário, considerando os tempos de transporte e de manipulação interna.
Entrada e Saída:

Entrada: Um arquivo contendo informações dos pacotes: data e hora da postagem, nome do remetente, nome do destinatário, tipo, armazém de origem e armazém de destino.
Saída: Para cada pacote, o sistema deve gerar relatórios com o tempo esperado de estadia, o tempo total armazenado e o tempo total em trânsito.
2. Modelo de Simulação
O projeto deve ser implementado utilizando o modelo de Simulação de Eventos Discretos (SED). Este modelo representa a operação do sistema como uma sequência de eventos que ocorrem em instantes discretos no tempo, alterando o estado do sistema. A simulação avança "saltando" de um evento para o próximo, o que a torna, em geral, mais rápida que uma simulação contínua.




Os componentes principais da simulação são:

Estado: Variáveis que representam as propriedades do sistema em um dado momento.
Relógio: Controla o tempo da simulação, avançando para o instante do próximo evento a ser executado.
Lista de Eventos: Uma estrutura, geralmente uma fila de prioridade, que armazena os eventos pendentes em ordem cronológica.
Eventos: Ocorrem em um instante de tempo e possuem um tipo que define a ação a ser executada. Os principais eventos do sistema são a chegada de um pacote a um armazém e o transporte de pacotes entre armazéns.


3. Requisitos de Implementação
É necessário projetar e implementar quatro Tipos Abstratos de Dados (TADs) principais, utilizando a linguagem C ou C++. O uso de estruturas de dados pré-implementadas das bibliotecas padrão (como vector, stack, queue, etc.) é estritamente proibido.




Tipos Abstratos de Dados (TADs):

Pacote: Armazena os dados lidos do arquivo de entrada, a rota a ser seguida, o estado atual (ex: armazenado, em transporte, entregue) e as estatísticas de tempo.
Armazém: Contém uma pilha para cada seção (destino) para gerenciar os pacotes armazenados com a lógica LIFO. Deve implementar operações de armazenar e recuperar pacotes, contabilizando o tempo de manipulação.

Transporte: Gerencia os pacotes em trânsito. Na prática, como o tempo de transporte é constante, sua implementação se dá pelo escalonamento do evento de chegada do pacote no armazém de destino.
Escalonador: Componente central da simulação, implementado como uma fila de prioridade (sugere-se um min-heap) que gerencia a lista de eventos, sempre retornando o evento com o menor tempo de ocorrência.
4. Entregáveis
O trabalho consiste em duas entregas, ambas com prazo final para 16 de junho, às 23:59. Submissões atrasadas sofrerão penalidades.





Código Fonte (VPL TP2): O código deve ser submetido via VPL e seguir uma estrutura de diretórios específica (TP/src, TP/include, TP/bin, TP/obj). Um Makefile deve ser fornecido para compilar o projeto, gerando um executável chamado tp3.out no diretório bin.


Relatório (Relatório TP2): Um documento em formato PDF, com no máximo 10 páginas, contendo as seguintes seções na ordem especificada:

Capa
Introdução
Método (detalhes da implementação, TADs, estruturas de dados)
Análise de Complexidade (tempo e espaço)
Estratégias de Robustez
Análise Experimental
Conclusões
Bibliografia
5. Critérios de Avaliação
A nota final será distribuída da seguinte forma:

Análise Experimental: 25%
Conteúdo e estrutura do Relatório: 20%
Corretude nos Casos de Teste: 20%
Definição e Implementação das Estruturas de Dados: 10%
Análise de Complexidade: 10%
Qualidade do Código (indentação, comentários): 10%
Aderência às Instruções de Entrega: 5%

Atenção: Se o programa submetido não compilar em um ambiente Linux, o trabalho não será avaliado e a nota será zero.


6. Regras e Perguntas Frequentes (FAQ)
Plágio: É proibido e resultará na anulação do trabalho para todos os envolvidos. Discussões teóricas entre colegas são permitidas, mas o compartilhamento de código não é.
Trabalho em Grupo: O trabalho é estritamente individual.
Linguagem: C ou C++ (versão C++11 é utilizada para a correção).

Bibliotecas Proibidas: Estruturas de dados da biblioteca padrão (ex: std::vector, std::stack) e smart pointers são vetadas.
Bibliotecas Permitidas: É permitido o uso do tipo String e de bibliotecas para gerenciamento de memória e tratamento de exceções.

Ambiente de Correção: A correção será feita em ambiente Linux, portanto, é crucial garantir a compatibilidade