Commit e857342b authored by 虢奥's avatar 虢奥

特殊穿越装载区

parent 9875a3db
{ {
"para": { "para": {
"log_path": "/usr/local/fleet-log/dispatch", "log_path": "/Users/guoao/Desktop/Log",
"empty_speed": 15, "empty_speed": 15,
"heavy_speed": 15, "heavy_speed": 15,
"dump_target_mass": 5000, "dump_target_mass": 5000,
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
"password": "Huituo@123" "password": "Huituo@123"
}, },
"gothrough": { "gothrough": {
"closer_area_name": "1025装载区01", "closer_area_name": "1025装载区02",
"further_area_name": "1025装载区-03" "further_area_name": "1025装载区-03"
} }
} }
\ No newline at end of file
...@@ -576,31 +576,33 @@ class GroupDispatcher: ...@@ -576,31 +576,33 @@ class GroupDispatcher:
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区 # 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
if truck_task in [-2, 3, 4, 5]: if truck_task in [-2, 3, 4, 5]:
if truck_task == 3: if truck_task == 3:
if self.group.topo is not None and truck_locate is not None:
self.logger.info("潜在二次调度车辆状态")
self.logger.info(f'车辆 {truck_name}')
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
self.logger.info(f'车辆任务 {truck_task}')
self.logger.info(f'车辆临时 {truck_is_temp}')
self.logger.info(self.group.topo.cross_bf_lanes)
self.logger.info(self.group.truck.truck_current_state)
# 车辆当前位于交叉路口前,且排队等待
if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
self.logger.info("触发二次调度")
# self.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip)
try:
truck_info.redispatch =\
self.redispatcher.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip, truck_info)
except Exception as es:
self.logger.error("二次调度至卸载点失败")
self.logger.error(es)
else:
self.logger.info("未触发二次调度, 执行重载周期调度")
self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
else:
self.logger.info("正常重载行驶, 执行重载周期调度") self.logger.info("正常重载行驶, 执行重载周期调度")
self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip) self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
# if self.group.topo is not None and truck_locate is not None:
# self.logger.info("潜在二次调度车辆状态")
# self.logger.info(f'车辆 {truck_name}')
# self.logger.info(f'车辆位置 {truck_locate}')
# self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
# self.logger.info(f'车辆任务 {truck_task}')
# self.logger.info(f'车辆临时 {truck_is_temp}')
# self.logger.info(self.group.topo.cross_bf_lanes)
# self.logger.info(self.group.truck.truck_current_state)
# # 车辆当前位于交叉路口前,且排队等待
# if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
# self.logger.info("触发二次调度")
# # self.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip)
# try:
# truck_info.redispatch =\
# self.redispatcher.redispatch_to_dump(truck_id, truck_dispatch, truck_locate, truck_trip, truck_info)
# except Exception as es:
# self.logger.error("二次调度至卸载点失败")
# self.logger.error(es)
# else:
# self.logger.info("未触发二次调度, 执行重载周期调度")
# self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
# else:
# self.logger.info("正常重载行驶, 执行重载周期调度")
# self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
else: else:
self.logger.info("卸载区内, 执行重载周期调度") self.logger.info("卸载区内, 执行重载周期调度")
...@@ -609,34 +611,40 @@ class GroupDispatcher: ...@@ -609,34 +611,40 @@ class GroupDispatcher:
# 车辆位于装载区内, 调度车辆前往卸载区 # 车辆位于装载区内, 调度车辆前往卸载区
elif truck_task in [0, 1, 2]: elif truck_task in [0, 1, 2]:
if truck_task == 0: if truck_task == 0:
if self.group.topo is not None and truck_locate is not None:
self.logger.info("潜在二次调度车辆状态")
# 车辆当前位于交叉路口前,且排队等待
self.logger.info(f'车辆 {truck_name}')
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
self.logger.info(f'车辆临时 {truck_is_temp}')
self.logger.info(self.group.topo.cross_bf_lanes)
self.logger.info(self.group.truck.truck_current_state)
if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
self.logger.info("触发二次调度")
try:
truck_info.redispatch =\
self.redispatcher.redispatch_to_excavator(truck_id, truck_dispatch, truck_locate,
truck_trip, truck_info)
except Exception as es:
self.logger.error("二次调度至装载点失败")
self.logger.error(es)
else:
self.logger.info("未触发二次调度,执行空载周期调度")
self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
# 穿越装载区判断
if self.gothrough_active: if self.gothrough_active:
self.logger.info("穿越装载区调度开启")
self.gothroghdispatcher.update_lanes_info() self.gothroghdispatcher.update_lanes_info()
self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck) self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck)
# if self.group.topo is not None and truck_locate is not None:
# # 穿越装载区判断
# if self.gothrough_active:
# self.logger.info("穿越装载区调度开启")
# self.gothroghdispatcher.update_lanes_info()
# self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck)
# self.logger.info("潜在二次调度车辆状态")
#
# # 车辆当前位于交叉路口前,且排队等待
# self.logger.info(f'车辆 {truck_name}')
# self.logger.info(f'车辆位置 {truck_locate}')
# self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[truck_id]}')
# self.logger.info(f'车辆临时 {truck_is_temp}')
# self.logger.info(self.group.topo.cross_bf_lanes)
# self.logger.info(self.group.truck.truck_current_state)
# if (truck_locate in self.group.topo.cross_bf_lanes) and (not truck_is_temp):
# self.logger.info("触发二次调度")
#
# try:
# truck_info.redispatch =\
# self.redispatcher.redispatch_to_excavator(truck_id, truck_dispatch, truck_locate,
# truck_trip, truck_info)
# except Exception as es:
# self.logger.error("二次调度至装载点失败")
# self.logger.error(es)
# else:
# self.logger.info("未触发二次调度,执行空载周期调度")
# self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
else: else:
self.logger.info("正常空载行驶,执行空载周期调度") self.logger.info("正常空载行驶,执行空载周期调度")
self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip) self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
...@@ -1148,32 +1156,37 @@ class GoThroughDispatcher: ...@@ -1148,32 +1156,37 @@ class GoThroughDispatcher:
further_area_backtrack_node_id = item.StartNodeId further_area_backtrack_node_id = item.StartNodeId
except Exception as es: except Exception as es:
self.logger.error("回溯端装载路段异常") self.logger.error("回溯端装载路段异常")
self.logger.error(es) self.logger.error(es)
try: try:
lowest_common_ancestor = None lowest_common_ancestor = None
closer_area_backtrack_node_id = self.closer_entrance_node_id closer_area_backtrack_node_id = self.closer_entrance_node_id
self.closer_area_backtrack_lanes = [] self.closer_area_backtrack_lanes = []
for i in range(5):
for i in range(3):
# 查询回溯路段对象 # 查询回溯路段对象
item = session_postgre.query(Lane).filter_by(EndNodeId=closer_area_backtrack_node_id).first() item = session_postgre.query(Lane).filter_by(EndNodeId=closer_area_backtrack_node_id).first()
logger.info(f"查询到路段{str(item.Id)}")
if item is None: if item is None:
break break
# 若查询到共同祖先 # # 若查询到共同祖先
if str(item.Id) in self.further_area_backtrack_lanes: # if str(item.Id) in self.further_area_backtrack_lanes:
lowest_common_ancestor = item # lowest_common_ancestor = item
break # break
# 将路段Id加入回溯列表 # 将路段Id加入回溯列表
self.closer_area_backtrack_lanes.append(str(item.Id)) self.closer_area_backtrack_lanes.append(str(item.Id))
# 更新当前回溯节点 # 更新当前回溯节点
closer_area_backtrack_node_id = item.StartNodeId closer_area_backtrack_node_id = item.StartNodeId
# logger.info(self.closer_entrance_node_id)
logger.info("近端道路列表")
logger.info(self.closer_area_backtrack_lanes)
# 交叉口路段 # 交叉口路段
cross_lane = str(lowest_common_ancestor.Id) cross_lane = str(lowest_common_ancestor.Id)
except Exception as es: except Exception as es:
self.logger.error("回溯端装载路段异常") self.logger.error("回溯端装载路段异常")
self.logger.error(es) self.logger.error(es)
return return
...@@ -1256,74 +1269,6 @@ class GoThroughDispatcher: ...@@ -1256,74 +1269,6 @@ class GoThroughDispatcher:
self.logger.error(es) self.logger.error(es)
return return
# '''
# 2. 寻找车辆穿越装载区自动判定区域
# '''
# try:
# further_area_backtrack_node_id = further_entrance_node_id
# further_area_backtrack_lanes = []
# for truck_id in range(5):
# # 查询回溯路段对象
# item = session_postgre.query(Lane).filter_by(EndNodeId=further_area_backtrack_node_id).first()
# if item is None:
# break
# # 将路段Id加入回溯列表
# further_area_backtrack_lanes.append(str(item.Id))
# # 更新当前回溯节点
# further_area_backtrack_node_id = item.StartNodeId
#
# except Exception as es:
# self.logger.error("回溯近端装载路段异常")
# self.logger.error(es)
#
# try:
# lowest_common_ancestor = None
# closer_area_backtrack_node_id = closer_entrance_node_id
# closer_area_backtrack_lanes = []
# for truck_id in range(5):
# # 查询回溯路段对象
# item = session_postgre.query(Lane).filter_by(EndNodeId=closer_area_backtrack_node_id).first()
# if item is None:
# break
# # 若查询到共同祖先
# if str(item.Id) in further_area_backtrack_lanes:
# lowest_common_ancestor = item
# break
# # 将路段Id加入回溯列表
# closer_area_backtrack_lanes.append(str(item.Id))
# # 更新当前回溯节点
# closer_area_backtrack_node_id = item.StartNodeId
#
# # 交叉口路段
# cross_lane = str(lowest_common_ancestor.Id)
#
# except Exception as es:
# self.logger.error("回溯远端装载路段异常")
# self.logger.error(es)
# return
#
#
# self.logger.info("cross_lane")
# self.logger.info(cross_lane)
#
# # 截取远端入场点到交叉口的路段
# further_area_backtrack_lanes = further_area_backtrack_lanes[0:further_area_backtrack_lanes.index(cross_lane)]
#
# # 穿越装载区检查路段
# gothrough_check_lanes = [cross_lane]
#
# try:
# # 多回溯一个路段
# if lowest_common_ancestor.Length < 200:
# item = session_postgre.query(Lane).filter_by(EndNodeId=lowest_common_ancestor.StartNodeId).first()
# gothrough_check_lanes.append(item.Id)
#
# self.logger.info("gothrough_check_lanes")
# self.logger.info(gothrough_check_lanes)
#
# except Exception as es:
# self.logger.error("穿越装载区交叉口判断异常")
# self.logger.error(es)
''' '''
3. 调度判断逻辑 3. 调度判断逻辑
...@@ -1342,8 +1287,11 @@ class GoThroughDispatcher: ...@@ -1342,8 +1287,11 @@ class GoThroughDispatcher:
raise CoreException(111, f'truck_index_to_uuid_dict 缺失 {excavator_index} 号挖机信息') raise CoreException(111, f'truck_index_to_uuid_dict 缺失 {excavator_index} 号挖机信息')
current_truck_goto_excavator_id = self.group.excavator_info.truck_index_to_uuid_dict[excavator_index] current_truck_goto_excavator_id = self.group.excavator_info.truck_index_to_uuid_dict[excavator_index]
if request_truck_lane_id in self.gothrough_check_lanes: # if request_truck_lane_id in self.gothrough_check_lanes:
logger.info(f"近端lanes{self.closer_area_backtrack_lanes}")
# self.closer_area_backtrack_lanes.pop(0)
# logger.info(f"变更之后lanes{self.closer_area_backtrack_lanes}")
if request_truck_lane_id in self.closer_area_backtrack_lanes:
# 选择合适装载区 # 选择合适装载区
target_excavator = None target_excavator = None
try: try:
...@@ -1355,8 +1303,26 @@ class GoThroughDispatcher: ...@@ -1355,8 +1303,26 @@ class GoThroughDispatcher:
except Exception as es: except Exception as es:
logger.error("寻找最优装载区异常") logger.error("寻找最优装载区异常")
logger.error(es) logger.error(es)
logger.info(f"当前{current_truck_goto_excavator_id}")
logger.info(f"目标{target_excavator}")
try:
# item = (session_mysql.query(EquipmentPair).filter_by(truck_id=request_truck_id, group_id=group_id,
# isdeleted=0, ).first())
excavator_now = session_mysql.query(EquipmentPair).filter_by(truck_id=request_truck_id,
isdeleted=0).first().exactor_id
self.logger.info('查询到的挖机')
self.logger.info(excavator_now)
if (target_excavator is not None) and (current_truck_goto_excavator_id != target_excavator): self.logger.info('当前目标挖机')
self.logger.info(target_excavator)
except Exception as es:
self.logger.error("pair表查询异常")
self.logger.error(es)
excavator_now = 0
if excavator_now == target_excavator:
self.logger.info("目标一致不用变更")
if (target_excavator is not None) and (excavator_now != target_excavator):
self.logger.info(f'更新车辆 {request_truck_name} 派车计划前往 {target_excavator}') self.logger.info(f'更新车辆 {request_truck_name} 派车计划前往 {target_excavator}')
# 派车计划写入redis # 派车计划写入redis
truck_dispatch_to_redis(request_truck_id, group_id, target_excavator) truck_dispatch_to_redis(request_truck_id, group_id, target_excavator)
......
...@@ -22,7 +22,7 @@ json_file = os.path.join(relative_path, "config.json") ...@@ -22,7 +22,7 @@ json_file = os.path.join(relative_path, "config.json")
# json_file = "config.json" # json_file = "config.json"
with open(json_file, encoding='UTF-8') as f: with open(json_file, encoding='UTF-8') as f:
load_vale = json.load(f, encoding='UTF-8') load_vale = json.load(f)
postgre_config = load_vale["postgresql"] postgre_config = load_vale["postgresql"]
......
No preview for this file type
...@@ -49,6 +49,8 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set ...@@ -49,6 +49,8 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
logger.info("arrival_truck_list") logger.info("arrival_truck_list")
logger.info(arrival_truck_list) logger.info(arrival_truck_list)
logger.info(f"输入的closer_lane_set{closer_lane_set}")
closer_lane_set_nearest = [closer_lane_set[-1]]
# 统计不同状态车辆数量 # 统计不同状态车辆数量
goto_closer_area_num = 0 goto_closer_area_num = 0
goto_further_area_num = 0 goto_further_area_num = 0
...@@ -61,7 +63,7 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set ...@@ -61,7 +63,7 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
# 前往远端装载区车辆数加1 # 前往远端装载区车辆数加1
goto_further_area_num += 1 goto_further_area_num += 1
# 车辆未经过近端装载区 # 车辆未经过近端装载区
elif truck_lane_id in closer_lane_set: elif truck_lane_id in closer_lane_set_nearest:
# 前往近端或近端装载区车辆数加1 # 前往近端或近端装载区车辆数加1
goto_closer_area_num += 1 goto_closer_area_num += 1
else: else:
...@@ -79,33 +81,46 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set ...@@ -79,33 +81,46 @@ def area_choose(excavators_id, closer_area_id, further_area_id, further_lane_set
logger.info(before_cross_num) logger.info(before_cross_num)
# # 近端挖机空闲
# if closer_excavator_state == 0 and goto_closer_area_num == 0:
# logger.info("近端挖机空闲, 调度车辆前往近端装载区")
# target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
# # 远端挖机空闲
# elif further_excavator_state == 0 and goto_further_area_num == 0:
# logger.info("远端挖机空闲, 调度车辆前往远端装载区")
# target_excavator = DispatchInfo.load_excavator_dict[further_area_id]
# # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id])
# # 两挖机均不空闲
# else:
# # goto_further_area_num -= 1
# logger.info("goto_further_area_num-goto_closer_area_num")
# logger.info(goto_further_area_num)
# logger.info(goto_closer_area_num)
# # 默认当前请调车辆与近端装载点前没有车辆,因此前往近端装载区的车辆仅其本身
# # goto_closer_area_num = 1
# # 在远处排队等待的车辆更少
# if goto_closer_area_num + before_cross_num > goto_further_area_num:
# logger.info("远端挖机排队时间短, 调度车辆前往")
# target_excavator = DispatchInfo.load_excavator_dict[further_area_id]
# # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id])
# else:
# logger.info("近端挖机排队时间短, 调度车辆前往")
# target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
# 近端挖机空闲 # 近端挖机空闲
if closer_excavator_state == 0 and goto_closer_area_num == 0: if closer_excavator_state == 0 and goto_closer_area_num == 0:
logger.info("近端挖机空闲, 调度车辆前往近端装载区") logger.info("近端挖机空闲, 调度车辆前往近端装载区")
target_excavator = DispatchInfo.load_excavator_dict[closer_area_id] target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id]) # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
# 远端挖机空闲 # 远端挖机空闲
elif further_excavator_state == 0 and goto_further_area_num == 0:
logger.info("远端挖机空闲, 调度车辆前往远端装载区")
target_excavator = DispatchInfo.load_excavator_dict[further_area_id]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id])
# 两挖机均不空闲
else: else:
# goto_further_area_num -= 1 logger.info("近端挖机占用, 调度车辆前往远端装载区")
logger.info("goto_further_area_num-goto_closer_area_num")
logger.info(goto_further_area_num)
logger.info(goto_closer_area_num)
# 默认当前请调车辆与近端装载点前没有车辆,因此前往近端装载区的车辆仅其本身
# goto_closer_area_num = 1
# 在远处排队等待的车辆更少
if goto_closer_area_num + before_cross_num > goto_further_area_num:
logger.info("远端挖机排队时间短, 调度车辆前往")
target_excavator = DispatchInfo.load_excavator_dict[further_area_id] target_excavator = DispatchInfo.load_excavator_dict[further_area_id]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id]) # truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[further_area_id])
else:
logger.info("近端挖机排队时间短, 调度车辆前往")
target_excavator = DispatchInfo.load_excavator_dict[closer_area_id]
# truck_dispatch_to_redis(request_truck_id, group_id, DispatchInfo.load_excavator_dict[closer_area_id])
return target_excavator return target_excavator
...@@ -250,6 +265,10 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id): ...@@ -250,6 +265,10 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id):
item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first()) item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first())
logger.error(es) logger.error(es)
logger.info(f"{type(truck_id)}")
logger.info(f"{type(item.truck_id)}")
if str(truck_id) != str(item.truck_id):
logger.info("无重复派车计划,重新生成中")
# 其余调度信息写入 # 其余调度信息写入
try: try:
# record["dispatchId"] = item.id # record["dispatchId"] = item.id
...@@ -270,6 +289,8 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id): ...@@ -270,6 +289,8 @@ def truck_dispatch_to_redis(truck_id, group_id, excavator_id):
logger.error(es) logger.error(es)
finally: finally:
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
else:
logger.info("调度计划相同,无需变更")
def get_lanes_between_entrances(closer_node_id, further_node_id): def get_lanes_between_entrances(closer_node_id, further_node_id):
......
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