Backend

parents
No preview for this file type
No preview for this file type
import subprocess
import sys
# Función para instalar paquetes usando pip
def instalar_paquetes():
paquetes = [
"flask",
"flask-cors",
"networkx"
]
for paquete in paquetes:
subprocess.check_call([sys.executable, "-m", "pip", "install", "--upgrade", paquete])
# Instalar paquetes antes de iniciar el resto del script
instalar_paquetes()
from flask import Flask, request, jsonify
from flask_cors import CORS
from utils import Controlador
controlador = Controlador()
app = Flask("api test")
CORS(app)
@app.route('/')
def home():
return "home"
# FUNCIÓN 1: PROCESAR EL MAPA
@app.route('/procesarmapa', methods=['GET'])
def procesar_mapa():
mapa = request.args.get('mapa')
controlador.procesar_mapa(mapa)
return jsonify("ok")
# FUNCIÓN 2: OBTENER LOS CAMINOS DE [ROBOT->PAQUETE] Y [PAQUETE->DESTINO]
@app.route('/getcaminos', methods=['GET'])
def get_caminos():
actual = int(request.args.get('actual'))
paquete = int(request.args.get('paquete'))
destino = int(request.args.get('destino'))
print(actual, paquete, destino)
return (controlador.generar_caminos(actual=actual, paquete=paquete, destino=destino)) # devuelve 2 listas
if __name__ == '__main__':
app.run(port=5000, debug=True)
{
"parametros": {
"mapa": "0202000105030705000200041109060110031000000200080101100110000106010701",
"relaciones": {"5": "arriba", "-1": "derecha", "-5": "abajo", "1": "izquierda"},
"direcciones": {"arriba": 1, "derecha": 2, "abajo": 3, "izquierda": 4}
},
"casillas": {
"00": {"nombre": "Edificio", "arriba": false, "derecha": false, "abajo": false, "izquierda": false},
"01": {"nombre": "CalleHorizontal", "arriba": false, "derecha": true, "abajo": false, "izquierda": true},
"02": {"nombre": "CalleVertical", "arriba": true, "derecha": false, "abajo": true, "izquierda": false},
"03": {"nombre": "EsquinaArrDer", "arriba": true, "derecha": true, "abajo": false, "izquierda": false},
"04": {"nombre": "EsquinaAbaDer", "arriba": false, "derecha": true, "abajo": true, "izquierda": false},
"05": {"nombre": "EsquinaAbaIzq", "arriba": false, "derecha": false, "abajo": true, "izquierda": true},
"06": {"nombre": "EsquinaArrIzq", "arriba": true, "derecha": false, "abajo": false, "izquierda": true},
"07": {"nombre": "T-Arriba", "arriba": true, "derecha": true, "abajo": false, "izquierda": true},
"08": {"nombre": "T-Derecha", "arriba": true, "derecha": true, "abajo": true, "izquierda": false},
"09": {"nombre": "T-Abajo", "arriba": false, "derecha": true, "abajo": true, "izquierda": true},
"10": {"nombre": "T-Izquierda", "arriba": true, "derecha": false, "abajo": true, "izquierda": true},
"11": {"nombre": "Cruz", "arriba": true, "derecha": true, "abajo": true, "izquierda": true}
}
}
\ No newline at end of file
# imports
import os
import json
import sys
import time
import networkx as nwx
# "mapa": 02 02 00 01 05 - 03 07 05 00 02 - 00 04 11 09 06 - 01 10 03 10 00 - 00 02 00 08 01 - 01 10 01 10 00 - 01 06 01 07 01
# ----------------------------------------------------------------------------------------------------------------------------------------------------
class Celda:
id = 0
tipo = ""
nombre = ""
arriba = False
derecha = False
abajo = False
izquierda = False
def __init__(self, id, tipo, datos):
self.id = id
self.tipo = tipo
self.nombre = datos["nombre"]
self.arriba = datos["arriba"]
self.derecha = datos["derecha"]
self.abajo = datos["abajo"]
self.izquierda = datos["izquierda"]
def __str__(self):
return f"[{self.id}] {self.nombre} -> arriba-{self.arriba} ; derecha-{self.derecha} ; abajo-{self.abajo} ; izquierda-{self.izquierda}"
class Casilla:
id = ""
row = 0
col = 0
def __init__(self, id, row, col):
self.id = id
self.row = row
self.col = col
class Pedido:
id = ""
inicio = Casilla("", 0, 0)
destino = Casilla("", 0, 0)
def __init__(self, id, inicio, destino):
self.id = id
self.inicio = inicio
self.destino = destino
# ----------------------------------------------------------------------------------------------------------------------------------------------------
class Controlador:
# Configurador: parámetros...
CONFIG = None
# Mapa
mapa_sin_procesar = None # mapa formato string
mapa = None # mapa formato grafo networkx
celdas = None # mapa formato list de Celda()
filas = 7
columnas = 5
def __init__(self):
# Cargar el archivo de configuración
with open('config.json', 'r') as f:
self.CONFIG = json.load(f)
# Funciones de self.mapa
# Procesar el mapa: string -> grafo, lista de Celdas
def procesar_mapa(self, _mapa):
# self.mapa_sin_procesar = self.CONFIG["parametros"]["mapa"]
self.mapa_sin_procesar = _mapa
# Sacar las celdas
# 1. Dividir el string en elementos de 2 dígitos: 02 02 00 01 05 - 03 07 05 00 02 - 00 04 11 09 06 - 01 10 03 10 00 - 00 02 00 08 01 - 01 10 01 10 00 - 01 06 01 07 01
mapa_dividido = [self.mapa_sin_procesar[i:i+2] for i in range(0, len(self.mapa_sin_procesar), 2)]
# 2. Crear las celdas
self.celdas = []
nodos = []
for i, tipo in enumerate(mapa_dividido):
# nodos = [0, 1, 2, 3, ...]
nodos.append(i)
# celdas = [celda(0, "00", "edificio", ...), ...]
self.celdas.append(Celda(i, tipo, self.CONFIG["casillas"][tipo]))
# Grafo
# Crear el objeto grafo
self.mapa = nwx.Graph()
# NODOS: Asignar los nodos
self.mapa.add_nodes_from(nodos)
# ARISTAS:
aristas = []
for f in range(self.filas):
for c in range(self.columnas):
index = f * self.columnas + c
""" 1.1 Comprobar arriba
1. la celda es accesible por 'arriba'
2. existe celda de 'arriba'
3. la celda de 'arriba' es accesible por 'abajo'
4. se añade una arista: (celda actual, celda de 'arriba')
"""
if f > 0 and self.celdas[index].arriba and self.celdas[index - self.columnas].abajo:
aristas.append((index, index - self.columnas))
""" 1.2 Comprobar derecha
1. la celda es accesible por 'derecha'
2. existe celda de 'derecha'
3. la celda de 'derecha' es accesible por 'izquierda'
4. se añade una arista: (celda actual, celda de 'derecha')
"""
if c < self.columnas - 1 and self.celdas[index].derecha and self.celdas[index + 1].izquierda:
aristas.append((index, index + 1))
""" 1.3 Comprobar abajo
1. la celda es accesible por 'abajo'
2. existe celda de 'abajo'
3. la celda de arriba es accesible por 'arriba'
4. se añade una arista: (celda actual, celda de 'abajo')
"""
if f < self.filas - 1 and self.celdas[index].abajo and self.celdas[index + self.columnas].arriba:
aristas.append((index, index + self.columnas))
""" 1.4 Comprobar izquierda
1. la celda es accesible por 'izquierda'
2. existe celda de 'izquierda'
3. la celda de arriba es accesible por 'derecha'
4. se añade una arista: (celda actual, celda de 'izquierda')
"""
if c > 0 and self.celdas[index].izquierda and self.celdas[index - 1].derecha:
aristas.append((index, index - 1))
# 2. Añadir aristas al grafo
self.mapa.add_edges_from(aristas)
# Funciones del robot
def generar_caminos(self, actual, paquete, destino):
# Generar camino entre la casilla actual y donde está el paquete
camino_inicial = nwx.shortest_path(self.mapa, actual, paquete)
camino_inicial.pop(0)
# Generar camino entre la casilla del paquete y la de destino
camino_final = nwx.shortest_path(self.mapa, paquete, destino)
camino_final.pop(0)
return [camino_inicial, camino_final]
# ----------------------------------------------------------------------------------------------------------------------------------------------------
# controlador = Controlador()
# controlador.procesar_mapa("0202000105030705000200041109060110031000000200080101100110000106010701")
# print(nwx.shortest_path(controlador.mapa, int("30"), int("34")))
# ----------------------------------------------------------------------------------------------------------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment