Commit 40c4ed07 authored by 张晓彤's avatar 张晓彤

新增车辆空载及重载周期调度

parent 42011c50
...@@ -369,8 +369,7 @@ class DistributionRatio(object): ...@@ -369,8 +369,7 @@ class DistributionRatio(object):
@desc:计算分流配比模式下,卡车与卸载区的对应关系 @desc:计算分流配比模式下,卡车与卸载区的对应关系
""" """
# TODO: # TODO: 统一与预期等待时间的接口
# 统一与预期等待时间的接口
def __init__(self, exactor_id, truck): def __init__(self, exactor_id, truck):
self.truck = truck self.truck = truck
......
...@@ -490,8 +490,7 @@ class GroupDispatcher: ...@@ -490,8 +490,7 @@ class GroupDispatcher:
truck_dispatch[i] = [next_exactor_id, next_unload_area_id] truck_dispatch[i] = [next_exactor_id, next_unload_area_id]
def semi_dynamic_mode(self, i, s, truck_dispatch, truck_info, truck_task, truck_trip): def semi_dynamic_mode(self, i, s, truck_dispatch, truck_info, truck_task, truck_trip):
# TODO: # TODO:和全智能调度很像,是否可以合并合;
# 和全智能调度很像,是否可以合并合;
# 加入二次调度; # 加入二次调度;
if truck_task in [-2, 3, 4, 5]: if truck_task in [-2, 3, 4, 5]:
...@@ -526,135 +525,139 @@ class GroupDispatcher: ...@@ -526,135 +525,139 @@ class GroupDispatcher:
def full_dynamic_mode(self, i: str, s: AlgorithmBase, truck_dispatch: Mapping[str, List[str]], def full_dynamic_mode(self, i: str, s: AlgorithmBase, truck_dispatch: Mapping[str, List[str]],
truck_info: CurrentTruck, truck_task: int, truck_trip: List[int]): truck_info: CurrentTruck, truck_task: int, truck_trip: List[int]):
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区 # 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
if truck_task in [-2, 4, 5]: if truck_task in [-2, 3, 4, 5]:
try: if truck_task == 3 and self.group.truck.truck_current_state[i] == 2:
if i in self.group.truck.truck_excavator_bind: if self.group.topo is not None:
try: try:
if i not in self.group.truck.truck_excavator_bind: truck_locate = self.group.truck.get_truck_locate_dict()[i]
raise CoreException(102, f'truck.group_excavators bind 中不存在 {i}') except Exception as es:
except CoreException as es: self.logger.error("车辆位置信息丢失")
es.with_traceback_info()
self.logger.error(es) self.logger.error(es)
truck_dispatch[i] = [None, None]
return return
next_excavator_id = self.group.truck.truck_excavator_bind[i] try:
truck_is_temp = self.group.truck.truck_is_temp[i]
except Exception as es:
truck_is_temp = False
self.logger.error("车辆临时字段异常")
self.logger.error(es)
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
# 车辆当前位于交叉路口前,且排队等待
if (truck_locate in self.group.topo.cross_bf_lanes) and (
self.group.truck.truck_current_state[i] == 2) \
and (not truck_is_temp):
# self.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
self.redispatcher.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
else: else:
next_excavator_value = s.solve(truck_info) pass
self.logger.info(f'车辆排斥修正 {i}, {self.group.truck_excavator_exclude_modify[i]}') else:
min_index = np.argmin(next_excavator_value + self.group.truck_excavator_exclude_modify[i]) try:
# min_index = np.argmin(next_excavator_value) if i in self.group.truck.truck_excavator_bind:
next_excavator_id = self.group.excavator_uuid_index_dict.inverse[min_index] try:
if i not in self.group.truck.truck_excavator_bind:
raise CoreException(102, f'truck.group_excavators bind 中不存在 {i}')
except CoreException as es:
es.with_traceback_info()
self.logger.error(es)
return
next_excavator_id = self.group.truck.truck_excavator_bind[i]
else:
next_excavator_value = s.solve(truck_info)
self.logger.info(f'车辆排斥修正 {i}, {self.group.truck_excavator_exclude_modify[i]}')
min_index = np.argmin(next_excavator_value + self.group.truck_excavator_exclude_modify[i])
# min_index = np.argmin(next_excavator_value)
next_excavator_id = self.group.excavator_uuid_index_dict.inverse[min_index]
self.logger.info(f'目标挖机 {min_index} {next_excavator_id}') self.logger.info(f'目标挖机 {min_index} {next_excavator_id}')
if truck_task == -2: if truck_task == -2:
next_unload_area_id = "Park" next_unload_area_id = "Park"
else: else:
dump_id = get_value("dump_index_to_uuid_dict")[truck_trip[-1]] dump_id = get_value("dump_index_to_uuid_dict")[truck_trip[-1]]
next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id] next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id] truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
except Exception as es: except Exception as es:
self.logger.error("重载车辆全智能模式-计算异常") self.logger.error("重载车辆全智能模式-计算异常")
self.logger.error(es) self.logger.error(es)
# 车辆位于装载区内, 调度车辆前往卸载区 # 车辆位于装载区内, 调度车辆前往卸载区
elif truck_task in [1, 2]: elif truck_task in [0, 1, 2]:
try: if truck_task == 0 and self.group.truck.truck_current_state[i] == 2:
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]] if self.group.topo is not None:
next_unload_area_value = s.solve(truck_info) if i in self.group.truck.get_truck_locate_dict():
# self.logger.info(f'车辆 {truck_id}') truck_locate = self.group.truck.get_truck_locate_dict()[i]
# self.logger.info(f'group distance {self.to_unload_area_distance}') else:
# self.logger.info(f'walk available {self.group_walk_available}') self.logger.error(f'车辆 {i} 位置信息丢失')
# truck_dispatch[i] = [None, None]
# self.logger.info(self.unload_area_uuid_index_dict) return
# self.logger.info(self.excavator_uuid_index_dict)
if i in self.group.truck.truck_dump_bind: self.logger.info(self.group.truck.truck_is_temp)
dump_uuid_to_unload_area_uuid_dict = get_value("dump_uuid_to_unload_area_uuid_dict") try:
next_unload_area_id = dump_uuid_to_unload_area_uuid_dict[self.group.truck.truck_dump_bind[i]] truck_is_temp = self.group.truck.truck_is_temp[i]
except Exception as es:
truck_is_temp = False
self.logger.error("车辆临时字段异常")
self.logger.error(es)
# 车辆当前位于交叉路口前,且排队等待
self.logger.info("潜在二次调度车辆状态")
self.logger.info(f'车辆 {i}')
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
self.logger.info(self.group.topo.cross_bf_lanes)
self.logger.info(self.group.truck.truck_current_state)
self.logger.info(truck_is_temp)
# if (truck_locate in self.topo.cross_bf_lanes) and (self.truck.truck_current_state[truck_id] == 2) \
# and (not truck_is_temp):
if (truck_locate in self.group.topo.cross_bf_lanes) and (
self.group.truck.truck_current_state[i] == 2):
self.logger.info("触发二次调度")
# self.redispatch_to_excavator(i, truck_dispatch, truck_locate)
self.redispatcher.redispatch_to_excavator(i, truck_dispatch, truck_locate)
else: else:
tmp = self.group.group_walk_available[ pass
self.group.excavator_uuid_index_dict[next_excavator_id], :].flatten() else:
# self.logger.info(f'group_walk_available_pick {tmp}') try:
# self.logger.info(f'next_excavator_id {next_excavator_id}') next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]]
# self.logger.info(next_unload_area_value) next_unload_area_value = s.solve(truck_info)
next_unload_area_value *= self.group.group_walk_available[ # self.logger.info(f'车辆 {truck_id}')
self.group.excavator_uuid_index_dict[next_excavator_id], :].flatten() # self.logger.info(f'group distance {self.to_unload_area_distance}')
# self.logger.info(f'walk available {self.group_walk_available}')
# self.logger.info(next_unload_area_value) #
min_index = np.argmin(next_unload_area_value) # self.logger.info(self.unload_area_uuid_index_dict)
next_unload_area_id = self.group.unload_area_uuid_index_dict.inverse[min_index] # self.logger.info(self.excavator_uuid_index_dict)
self.logger.info(f'目标卸点 {min_index} {next_unload_area_id}') if i in self.group.truck.truck_dump_bind:
# next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]] dump_uuid_to_unload_area_uuid_dict = get_value("dump_uuid_to_unload_area_uuid_dict")
next_unload_area_id = dump_uuid_to_unload_area_uuid_dict[self.group.truck.truck_dump_bind[i]]
else:
tmp = self.group.group_walk_available[
self.group.excavator_uuid_index_dict[next_excavator_id], :].flatten()
# self.logger.info(f'group_walk_available_pick {tmp}')
# self.logger.info(f'next_excavator_id {next_excavator_id}')
# self.logger.info(next_unload_area_value)
next_unload_area_value *= self.group.group_walk_available[
self.group.excavator_uuid_index_dict[next_excavator_id], :].flatten()
truck_dispatch[i] = [next_excavator_id, next_unload_area_id] # self.logger.info(next_unload_area_value)
min_index = np.argmin(next_unload_area_value)
next_unload_area_id = self.group.unload_area_uuid_index_dict.inverse[min_index]
except Exception as es: self.logger.info(f'目标卸点 {min_index} {next_unload_area_id}')
self.logger.error("空载车辆全智能模式-计算异常") # next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
self.logger.error(es.__traceback__.tb_lineno)
self.logger.error(es)
truck_dispatch[i] = [None, None]
elif truck_task == 0:
if self.group.topo is not None:
if i in self.group.truck.get_truck_locate_dict():
truck_locate = self.group.truck.get_truck_locate_dict()[i]
else:
self.logger.error(f'车辆 {i} 位置信息丢失')
truck_dispatch[i] = [None, None]
return
self.logger.info(self.group.truck.truck_is_temp) truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
try:
truck_is_temp = self.group.truck.truck_is_temp[i]
except Exception as es:
truck_is_temp = False
self.logger.error("车辆临时字段异常")
self.logger.error(es)
# 车辆当前位于交叉路口前,且排队等待
self.logger.info("潜在二次调度车辆状态")
self.logger.info(f'车辆 {i}')
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
self.logger.info(self.group.topo.cross_bf_lanes)
self.logger.info(self.group.truck.truck_current_state)
self.logger.info(truck_is_temp)
# if (truck_locate in self.topo.cross_bf_lanes) and (self.truck.truck_current_state[truck_id] == 2) \
# and (not truck_is_temp):
if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2):
self.logger.info("触发二次调度")
# self.redispatch_to_excavator(i, truck_dispatch, truck_locate)
self.redispatcher.redispatch_to_excavator(i, truck_dispatch, truck_locate)
else:
pass
elif truck_task == 3:
if self.group.topo is not None:
try:
truck_locate = self.group.truck.get_truck_locate_dict()[i]
except Exception as es: except Exception as es:
self.logger.error("车辆位置信息丢失") self.logger.error("空载车辆全智能模式-计算异常")
self.logger.error(es.__traceback__.tb_lineno)
self.logger.error(es) self.logger.error(es)
truck_dispatch[i] = [None, None] truck_dispatch[i] = [None, None]
return
try: # TODO:车辆在空载状态是否应该如何计算,是计算下一次卸载区还是继续计算当前最优挖机
truck_is_temp = self.group.truck.truck_is_temp[i]
except Exception as es:
truck_is_temp = False
self.logger.error("车辆临时字段异常")
self.logger.error(es)
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
# 车辆当前位于交叉路口前,且排队等待
if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2) \
and (not truck_is_temp):
# self.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
self.redispatcher.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
else:
pass
# def redispatch_to_dump(self, truck_id: str, truck_dispatch: Mapping[str, List[str]], truck_locate: str, truck_trip: List[int]): # def redispatch_to_dump(self, truck_id: str, truck_dispatch: Mapping[str, List[str]], truck_locate: str, truck_trip: List[int]):
# """ # """
...@@ -858,8 +861,7 @@ class ReDispatcher: ...@@ -858,8 +861,7 @@ class ReDispatcher:
# current_load_area_id = DispatchInfo.excavator_load_dict[current_excavator_id] # current_load_area_id = DispatchInfo.excavator_load_dict[current_excavator_id]
load_area_dict, load_area_lane_dict = self.group.topo.get_load_target_node_real(truck_locate, load_area_dict, load_area_lane_dict = self.group.topo.get_load_target_node_real(truck_locate,
current_load_area_id, True) current_load_area_id, True)
# TODO # TODO:topo 放到 group 里面不太合理
# topo 放到 group 里面不太合理
self.logger.info("所有可达装载区") self.logger.info("所有可达装载区")
self.logger.info(load_area_dict) self.logger.info(load_area_dict)
......
...@@ -121,8 +121,7 @@ class DispatchSubmission: ...@@ -121,8 +121,7 @@ class DispatchSubmission:
record = redis_format(truck_id, group_id, str(uuid.uuid1()), item) record = redis_format(truck_id, group_id, str(uuid.uuid1()), item)
# TODO: # TODO: 判断了两次是否拥堵,需要改善
# 判断了两次是否拥堵,需要改善
if self.topo is not None: if self.topo is not None:
......
...@@ -342,7 +342,8 @@ def truck_pass_first_area(truck_id, lane_id, closer_entrance_node_id, further_en ...@@ -342,7 +342,8 @@ def truck_pass_first_area(truck_id, lane_id, closer_entrance_node_id, further_en
size = len(que) size = len(que)
for _ in range(size): for _ in range(size):
cur_node = que.popleft() cur_node = que.popleft()
if cur_node is None: continue if cur_node is None:
continue
logger.info(cur_node) logger.info(cur_node)
if cur_node == closer_entrance_node_id: if cur_node == closer_entrance_node_id:
logger.info("closer_entrance_node") logger.info("closer_entrance_node")
......
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 to comment