Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/saulosilva/logistics-network
Malha logística - Algoritmo de Dijkstra
https://github.com/saulosilva/logistics-network
Last synced: 19 days ago
JSON representation
Malha logística - Algoritmo de Dijkstra
- Host: GitHub
- URL: https://github.com/saulosilva/logistics-network
- Owner: SauloSilva
- License: mit
- Created: 2015-06-16T02:41:43.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2015-06-20T16:26:40.000Z (over 9 years ago)
- Last Synced: 2024-10-31T10:27:58.169Z (2 months ago)
- Language: Ruby
- Homepage:
- Size: 238 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Cálculo do caminho mais curto - Entregando mercadorias
## Problema
A Companhia LevaEtraz está desenvolvendo um novo sistema de logistica e sua ajuda é muito importante neste momento. Sua tarefa será desenvolver o novo sistema de entregas visando sempre o menor custo. Para popular sua base de dados o sistema precisa expor um Webservices que aceite o formato de malha logística (exemplo abaixo), nesta mesma requisição o requisitante deverá informar um nome para este mapa. É importante que os mapas sejam persistidos para evitar que a cada novo deploy todas as informações desapareçam. O formato de malha logística é bastante simples, cada linha mostra uma rota: ponto de origem, ponto de destino e distância entre os pontos em quilômetros.
| From | To | Distance |
| ------------- |:-------------:| ----------:|
| A | B | 10 |
| B | D | 15 |
| A | C | 20 |
| C | D | 30 |
| B | E | 50 |
| D | E | 30 |Com os mapas carregados o requisitante irá procurar o menor valor de entrega e seu caminho, para isso ele passará o mapa, nome do ponto de origem, nome do ponto de destino, autonomia do caminhão **(km/l)** e o valor do litro do combustivel, agora sua tarefa é criar este Webservices. Um exemplo de entrada seria, mapa SP, origem A, destino D, autonomia **10**, valor do litro **2,50**; a resposta seria a rota `A B D` com custo de **6,25**.
## Solução
**Logistic network** é uma REST API feita em Rails responsável por guardar mapas, cidades, rotas e calcular o caminho mais curto entre dois pontos distintos.
Apliquei o algorítimo de Dijkstra para solucionar o problema do caminho mais curto num grafo dirigido com arestas.
Todas as respostas são entregues em formato `JSON`.## Preparando o ambiente
````bash
gem install bundler && bundle
rake db:setup
rails s
````## Tratamento de erros
Todos erros gerados por alguma requisição `POST`, `PUT` ou `DELETE`, estará nomeado com uma chave chamada `errors` em um formato de `JSON`. Exemplo:
```json
{
"errors": {
"attribute1": ["message1", "message2"],
"attribute2": ["message1"]
}
}
```## Endpoints
#### Caminho mais curto
- **GET** http://localhost:3000/routes/shortest/:from/:to/:autonomy/:fuel_price
- curl http://localhost:3000/routes/shortest/a/e/10/2,5
- **Response:**
```json
{
"nodes": [
"A",
"B",
"D"
],
"distance": 25,
"price": 6.25
}
```---
#### Mapa
**Lista de mapas**
- **GET** http://localhost:3000/maps/
- curl http://localhost:3000/maps/
- **Response:**
```json
[{
"name": "SP"
}, {
"name": "RJ"
}, {
"name": "RS"
}]
```**Criar mapa**
- **POST** http://localhost:3000/maps/
- curl -X POST --data "map[name]=foo" http://localhost:3000/maps/
- **Response:** `{ "name": "FOO" }`**Atualizar mapa**
- **PUT** http://localhost:3000/maps/:id/
- curl -X PUT --data "map[name]=baz" http://localhost:3000/maps/1/
- **Response:** `{ "name": "BAZ" }`**Remover mapa**
- **DELETE** http://localhost:3000/maps/:id/
- curl -X DELETE http://localhost:3000/maps/1/
- **Response:** `true|false`---
#### Cidade
**Lista de cidades**
- **GET** http://localhost:3000/cities/
- curl http://localhost:3000/cities/
- **Response:**
```json
[
{
"name": "A",
"routes": [
{ "to": "B", "distance": 10 },
{ "to": "C", "distance": 20 }
],
"map_name": "SP"
}
]
```**Lista de destinos**
- **GET** http://localhost:3000/cities/destinations/
- curl http://localhost:3000/cities/destinations/
- **Response:**
```json
{
"destinations": [
["A", "B", 10],
["A", "C", 20],
["B", "D", 15],
["B", "E", 50],
["C", "D", 30],
["D", "E", 30]
]
}
```**Criar cidade**
- **POST** http://localhost:3000/cities/
- curl -X POST --data "city[name]=foo&city[routes][][to]=baz&city[routes][][distance]=12&city[map_name]=bar" http://localhost:3000/cities/
- **Response:**
```json
{
"name": "A",
"routes": [
{ "to": "B", "distance": 10 },
{ "to": "C", "distance": 20 }
],
"map_name": "SP"
}
```**Atualizar cidade**
- **PUT** http://localhost:3000/cities/:id/
- curl -X POST --data "city[name]=foo2&city[routes][][to]=baz&city[routes][][distance]=12&city[map_name]=bar" http://localhost:3000/cities/
- **Response:**```json
{
"name": "A",
"routes": [
{ "to": "B", "distance": 10 },
{ "to": "C", "distance": 20 }
],
"map_name": "SP"
}
```**Remover cidade**
- **DELETE** http://localhost:3000/cities/:id/
- curl -X DELETE http://localhost:3000/cities/1/
- **Response:** `true|false`