def run(ts: TrafficStorage, tb: TrafficBalancer, tls_name: str, shutdowntime=None): # iniciando la simulacion traci.start(['sumo-gui', "-c", config.sumo_data_path + 'osm.sumocfg']) t = 0 wait = 0 estado_anterior = '' estado_actual = '' activenet = pn.generateDinamycNet(tls_name, [15, 25]) def onSaveCallback(data): nonlocal activenet # declarando que esta variable se va a usar del scope de afuera de esta funcion interna (es un closure) result = tb.balance(data) # cambiando los tiempos de la red activa dinamicamente time_we = result['from_west']['time'] + result['from_east'][ 'time'] # [0] controla la duracion del tiempo de green en las calles que vienen del este y oeste time_n = result['from_north'][ 'time'] # [1] controla la duracion del tiempo de green en las calles que vienes del norte time_we = int( round(time_we) ) # redondeando, porque los tiempos deben ser enteros, si no la red de Petri se buguea time_n = int( round(time_n) ) # redondeando, porque los tiempos deben ser enteros, si no la red de Petri se buguea activenet = pn.generateDinamycNet(tls_name, [time_we, time_n]) ts.onSave = onSaveCallback # Ejecuta el bucle de control de TraCI while traci.simulation.getMinExpectedNumber() > 0 and ( t <= shutdowntime if shutdowntime else True): estado_anterior = traci.trafficlight.getRedYellowGreenState(tls_name) # recorriendo todas las calles y generando el estado de cada una ts.collect(simulation_time=t, state_label=pn.getStateLabel(state=estado_actual), active_net_name=activenet.name) # avanzando la simulacion traci.simulationStep() activenet.nextStep(t) t += 1 wait += 1 estado_actual = traci.trafficlight.getRedYellowGreenState(tls_name) if estado_actual != estado_anterior: # guardar en la bd en cada inicio de ciclo del semaforo, de tal manera que los datos sean por ciclo if pn.isStartOfCycle(state=estado_actual): ts.save(t) pn.stateChangeMsg(t, wait, estado_actual, estado_anterior, activenet.name) wait = 0 traci.close() return t
if (100 < t < 200): if programaActual != "manual": traci.trafficlight.setProgram("semaforo_principal", "manual") print("[Cambiado a modo manual con redes de Petri]") net.nextStep() else: if programaActual != "principal": traci.trafficlight.setProgram("semaforo_principal", "principal") print("[Cambiado a modo automatico de SUMO]") estado_actual = traci.trafficlight.getRedYellowGreenState( "semaforo_principal") if estado_actual != estado_anterior: print("Estado cambiado: {}->{}".format(estado_anterior, estado_actual)) t += 1 traci.close() # este es el punto de entrada al script if __name__ == "__main__": #? genera el archivo de configuracion que controla las rutas, tipos y flujo de los vehiculos config.generar_archivo_vehiculos() #? Generando la red de Petri net = generatePetriNet() #? este es el modo normal de usar traci. sumo es iniciado como un subproceso y entonces el script de python se conecta y ejecuta traci.start(['sumo-gui', "-c", config.sumo_data_path + 'demo.sumocfg']) #? ejecutando la funcion que controla a la simulacion run(net)