Este projeto contém três scripts principais: sot, run e pre_process.
O script sot é responsável por resolver um problema de fluxo máximo com custo mínimo e um problema de mochila. A seguir, explico como o grafo é montado, o objetivo do fluxo máximo e a utilização do problema da mochila.
O grafo é criado na função create_graph(matrix_corridors, matrix_orders). Ele é um grafo direcionado (nx.DiGraph) e é composto pelos seguintes elementos:
- Nó de origem (source): Representa a origem do fluxo.
- Nós de pedidos (pedido_X): Cada pedido é representado por um nó, onde X é o índice do pedido.
- Nós de itens (item_X): Cada item é representado por um nó, onde X é o índice do item.
- Nós de corredores (corridor_X): Cada corredor é representado por um nó, onde X é o índice do corredor.
- Nó de destino (sink): Representa o destino final do fluxo.
As arestas do grafo são adicionadas da seguinte forma:
- Arestas da origem para os pedidos: Cada pedido tem uma aresta que vai do nó
sourcepara o nópedido_X, com capacidade igual à quantidade total do pedido. - Arestas dos pedidos para os itens: Cada pedido tem uma aresta que vai do nó
pedido_Xpara o nóitem_X, com capacidade igual à quantidade do item no pedido. - Arestas dos itens para os corredores: Cada item em um corredor tem uma aresta que vai do nó
item_Xpara o nócorridor_X, com capacidade igual à quantidade do item no corredor. - Arestas dos corredores para o destino: Cada corredor tem uma aresta que vai do nó
corridor_Xpara o nósink, com capacidade infinita.
O objetivo do fluxo máximo com custo mínimo é encontrar a quantidade máxima de fluxo que pode ser enviada do nó source para o nó sink com o menor custo possível. O custo é determinado pelo peso das arestas. No contexto deste script, o fluxo representa a quantidade de itens que podem ser transportados através dos corredores, e o custo mínimo garante que o número de corredores utilizados seja minimizado.
- Latência (LATENCY): A função possui um esquema de latência definido como
LATENCY = max(int(0.05 * o * a), 20), ondeoé o número de pedidos eaé o número de itens. Esse valor indica a quantidade de interações emmax_flow_min_costapós as quais a prioridade dos vértices deve ser atualizada. Esse esquema de latência é uma tentativa de reduzir o custo de tempo, já que não esperamos uma resposta ótima imediata.
TODO: Definir melhor os valores de
oeapara diferentes cenários de uso, considerando a variação no número de pedidos e itens.
-
Critérios de Prioridade: Os critérios podem incluir a quantidade de itens em um corredor, a urgência de um pedido ou a capacidade disponível de um item.
-
Implementação: A função percorre o grafo em busca de caminhos que aumentem o fluxo total, priorizando os elementos de acordo com os critérios definidos.
-
Critérios de Prioridade: Os critérios podem incluir a quantidade de itens em um corredor, a urgência de um pedido ou a capacidade disponível de um item.
-
Implementação: A função percorre o grafo em busca de caminhos que aumentem o fluxo total, priorizando os elementos de acordo com os critérios definidos.
Essa abordagem permite uma flexibilidade maior na otimização do fluxo, adaptando-se às necessidades específicas do problema e melhorando a eficiência do transporte de itens através dos corredores.
Para executar o script, você deve fornecer o caminho para um arquivo de entrada que contém os dados dos pedidos e corredores. O comando para executar o script é:
python sot.py caminho/para/arquivo_de_entrada
O script lê os dados do arquivo, monta o grafo, calcula o fluxo máximo com custo mínimo, resolve o problema da mochila e imprime os resultados.
O script run lida com a automação da chamada de outros códigos Python. Ele permite executar testes em um conjunto de arquivos com uma opção para limitar o número de arquivos processados.
Para executar o script, forneça o caminho para o diretório de dados e, opcionalmente, o número de arquivos a serem processados. Exemplo:
python run.py -n 5Neste exemplo, o script processará até 5 arquivos do diretório de dados. Se o argumento -n não for fornecido, todos os arquivos no diretório serão processados.
python main.py [FLAGS]--run-only-sot: Executa apenas o scriptsot.pypara gerar soluções, sem rodarchecker.py.--no-new-test: Impede a execução automática de novos testes caso a solução correspondente não seja encontrada.
- O script percorre os arquivos de entrada e verifica se há uma solução correspondente na pasta
possible_solution. - Se
--run-only-sotfor passado, apenassot.pyserá executado e seus logs serão salvos. - Caso contrário, se a solução existir,
checker.pyvalidará a solução. - Se a solução não existir e
--no-new-testnão for passado, o usuário pode optar por gerar e validar a solução executandosot.pymanualmente.