Algoritmo de asignación de ascensores fuera de línea.
Dado un edificio (conjunto de ascensores con estadísticas como piso por segundo, tiempo para abrir/cerrar puertas, tiempo para empezar/parar de moverse) y un conjunto de llamadas (tiempo recibido, piso de origen, piso de destino), ¿cómo determinaría la forma óptima de asignar cada llamada a un ascensor para reducir el tiempo total de espera al mínimo?
Intenté asignar una sola llamada al ascensor “más rápido” y, después de asignar esa llamada, revisar las próximas llamadas que se “pueden” asignar junto con la primera llamada. Mi problema es que no sé qué llamadas se completaron (para eliminarlas) y cómo calcular la posición y estado actual de mi ascensor.
def Allocate(st1 , st2 , st3 ):
building = open_json_file(st1)
all_calls = open_csv_file(st2)
my_calls = MyCalls() #lista de llamadas
for x in all_calls:
temp_call = MyCall(x[1], x[2], x[3])
my_calls + temp_call
elv_list = building._elevlist
for call in my_calls.list_of_calls: #inicio de asignación
if call.allocatedto == -1:
t = 10000000000
elev_id = -1
for elevator in elv_list:
if len(elevator.get_calls()) == 0:
time_for_call = calctime(call.get_src(), call.get_dest(), elevator)
else:
time_for_call = calctime(call.get_src(), call.get_dest(), elevator) * len(elevator.get_calls())
if t > time_for_call:
t = time_for_call
elev_id = elevator._id
call.allocatedto = elev_id
curr_elev = elv_list[elev_id]
curr_elev + call
temp_call_index = my_calls.get_next_index(call)
if temp_call_index != -1 and temp_call_index < len(my_calls.list_of_calls):
temp_call = my_calls.list_of_calls[temp_call_index]
time = calctime(call.get_src(), call.get_dest(), curr_elev)
dir = call.get_dir()
while temp_call.time_recieved < call.time_recieved + time and temp_call_index < len(
my_calls.list_of_calls):
if dir == 1:
if temp_call.get_dir() == 1 and temp_call.allocatedto == -1:
if isinpath(call, temp_call, curr_elev):
temp_call.allocatedto = elev_id
curr_elev + temp_call
if dir == -1:
if temp_call.get_dir() == -1 and temp_call.allocatedto == -1:
if isinpath(call, temp_call, curr_elev):
temp_call.allocatedto = elev_id
curr_elev + temp_call
temp_call = my_calls.list_of_calls[temp_call_index]
temp_call_index += 1
davy.ai
Para determinar la mejor manera de asignar cada llamada a un ascensor con el fin de reducir al mínimo el tiempo de espera total, se puede utilizar el siguiente algoritmo: