Commit a274a624 authored by 张晓彤's avatar 张晓彤

二次调度逻辑优化

parent 77024ac7
This diff is collapsed.
...@@ -28,6 +28,7 @@ class DispatchSubmission: ...@@ -28,6 +28,7 @@ class DispatchSubmission:
Attribute: Attribute:
""" """
def __init__(self, dump: DumpInfo, excavator: ExcavatorInfo, truck: TruckInfo, topo: Topo): def __init__(self, dump: DumpInfo, excavator: ExcavatorInfo, truck: TruckInfo, topo: Topo):
self.logger = get_logger("zxt.submission") self.logger = get_logger("zxt.submission")
self.dump = dump self.dump = dump
...@@ -35,7 +36,8 @@ class DispatchSubmission: ...@@ -35,7 +36,8 @@ class DispatchSubmission:
self.truck = truck self.truck = truck
self.topo = topo self.topo = topo
def truck_dispatch_to_redis(self, truck_id: str, truck_info: CurrentTruck, dispatch_seq: List[int], group_mode: int): def truck_dispatch_to_redis(self, truck_id: str, truck_info: CurrentTruck, dispatch_seq: List[int],
group_mode: int):
""" """
将truck_id对应矿卡派车计划写入redis 将truck_id对应矿卡派车计划写入redis
:param group_mode: (int) :param group_mode: (int)
...@@ -123,15 +125,18 @@ class DispatchSubmission: ...@@ -123,15 +125,18 @@ class DispatchSubmission:
# TODO: 判断了两次是否拥堵,需要改善 # TODO: 判断了两次是否拥堵,需要改善
if self.topo is not None:
# 车辆重载等待,且前方道路阻塞 # 车辆重载等待,且前方道路阻塞
if task == 3 and state == 2 and truck_id in self.truck.get_truck_locate_dict() and \ if self.topo is not None \
self.truck.get_truck_locate_dict()[truck_id] in self.topo.cross_bf_lanes: and task == 3 \
and state == 2 \
and truck_id in self.truck.get_truck_lane_locate_dict() \
and self.truck.get_truck_lane_locate_dict()[truck_id] in self.topo.cross_bf_lanes:
# try: # try:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]: # if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
self.logger.info("二次调度前往卸载区") self.logger.info("二次调度前往卸载区")
record["isTemp"] = True # 避免反复修改 record["isTemp"] = True # 避免反复修改
self.logger.info(f'redis 注入 {record}')
redis5.set(truck_id, str(json.dumps(record)))
POST(truck_id) POST(truck_id)
# else: # else:
# self.logger.info("车辆已完成二次调度-无需更改派车计划") # self.logger.info("车辆已完成二次调度-无需更改派车计划")
...@@ -144,7 +149,6 @@ class DispatchSubmission: ...@@ -144,7 +149,6 @@ class DispatchSubmission:
else: else:
self.logger.info("正常调度前往卸载区") self.logger.info("正常调度前往卸载区")
record["isTemp"] = False record["isTemp"] = False
self.logger.info(f'redis 注入 {record}') self.logger.info(f'redis 注入 {record}')
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
...@@ -184,14 +188,19 @@ class DispatchSubmission: ...@@ -184,14 +188,19 @@ class DispatchSubmission:
if self.topo is not None: if self.topo is not None:
# 车辆重载等待,且前方道路阻塞 # 车辆重载等待,且前方道路阻塞
if task == 0 and state == 2 and truck_id in self.truck.get_truck_locate_dict() and \ if self.topo is not None \
self.truck.get_truck_locate_dict()[truck_id] in self.topo.cross_bf_lanes: and task == 0 \
and state == 2 \
and truck_id in self.truck.get_truck_lane_locate_dict() \
and self.truck.get_truck_lane_locate_dict()[truck_id] in self.topo.cross_bf_lanes:
# 车辆停车等待 # 车辆停车等待
# try: # try:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]: # if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
self.logger.info("二次调度前往装载区") self.logger.info("二次调度前往装载区")
record["isTemp"] = True # 避免反复修改 record["isTemp"] = True # 避免反复修改
POST(truck_id) POST(truck_id)
self.logger.info(f'redis 注入 {record}')
redis5.set(truck_id, str(json.dumps(record)))
# else: # else:
# self.logger.info("车辆已完成二次调度-无需更改派车计划") # self.logger.info("车辆已完成二次调度-无需更改派车计划")
# except Exception as es: # except Exception as es:
...@@ -203,7 +212,6 @@ class DispatchSubmission: ...@@ -203,7 +212,6 @@ class DispatchSubmission:
else: else:
self.logger.info("正常调度前往装载区") self.logger.info("正常调度前往装载区")
record["isTemp"] = False record["isTemp"] = False
self.logger.info(f'redis 注入 {record}') self.logger.info(f'redis 注入 {record}')
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
...@@ -245,19 +253,22 @@ class DispatchSubmission: ...@@ -245,19 +253,22 @@ class DispatchSubmission:
self.logger.info("dispatch_plan_dict") self.logger.info("dispatch_plan_dict")
self.logger.info(dispatch_plan_dict) self.logger.info(dispatch_plan_dict)
for truck_id, dispatch_plan in dispatch_plan_dict.items(): for truck_id, dispatch_plan in dispatch_plan_dict.items():
try: try:
self.logger.info(f'======================================= 调度车辆 =======================================') if truck_id in group.truck_info_list:
self.logger.info(
f'======================================= 派车计划写入 =======================================')
self.truck_dispatch_to_redis(truck_id, group.truck_info_list[truck_id], dispatch_plan, group.group_mode) self.truck_dispatch_to_redis(truck_id, group.truck_info_list[truck_id], dispatch_plan, group.group_mode)
self.logger.info("======================================== 完成写入 =======================================") self.logger.info(
"======================================== 计划完成写入 =======================================")
else:
raise Exception("车辆对象信息不存在 group.truck_info_list")
except Exception as es: except Exception as es:
self.logger.error("group_dispatch_to_redis_error") # self.logger.error("group_dispatch_to_redis_error")
self.logger.error(es) self.logger.error(es)
truck_direct2redis(truck_id) truck_direct2redis(truck_id)
def redis_format(truck_id, group_id, dispatch_id, item): def redis_format(truck_id, group_id, dispatch_id, item):
record = {"truckId": truck_id, "dispatchId": dispatch_id, "exactorId": item.exactor_id, "dumpId": item.dump_id, record = {"truckId": truck_id, "dispatchId": dispatch_id, "exactorId": item.exactor_id, "dumpId": item.dump_id,
"loadAreaId": item.load_area_id, "unloadAreaId": item.unload_area_id, "groupId": item.group_id, "loadAreaId": item.load_area_id, "unloadAreaId": item.unload_area_id, "groupId": item.group_id,
......
This diff is collapsed.
...@@ -11,7 +11,9 @@ from settings import * ...@@ -11,7 +11,9 @@ from settings import *
from tables import * from tables import *
import numpy as np import numpy as np
# 全局参数设定 '''
全局参数设定
'''
# 空载任务集合 # 空载任务集合
empty_task_set = [0, 1, 5] empty_task_set = [0, 1, 5]
...@@ -27,69 +29,17 @@ M = 100000000 ...@@ -27,69 +29,17 @@ M = 100000000
logger = get_logger("zxt.para") logger = get_logger("zxt.para")
# # 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# # (uuid,index(id)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
# (
# load_area_uuid_to_index_dict,
# unload_area_uuid_to_index_dict,
# load_area_index_to_uuid_dict,
# unload_area_index_to_uuid_dict,
# ) = build_work_area_uuid_index_map()
#
# load_area_num, unload_area_num = len(load_area_uuid_to_index_dict), len(
# unload_area_uuid_to_index_dict
# )
#
# park_uuid_to_index_dict, park_index_to_uuid_dict = build_park_uuid_index_map()
#
# park_num = len(park_uuid_to_index_dict)
#
# truck_uuid_to_name_dict, truck_name_to_uuid_dict = build_truck_uuid_name_map()
#
# excavator_uuid_to_name_dict, dump_uuid_to_name_dict = build_equipment_uuid_name_map()
#
# # 矿卡集合
# group_trucks = set(update_total_truck())
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 动态派车矿卡集合
# # dynamic_truck_set = group_trucks.difference(fixed_truck_set)
# dynamic_truck_set = update_dynamic_truck()
#
# dynamic_truck_num = len(dynamic_truck_set)
#
# logger.info("可用于动态派车的矿卡:")
# logger.info(dynamic_truck_set)
#
# # 用于动态调度的挖机及卸载设备
# dynamic_excavator_set = set(update_autodisp_excavator())
# dynamic_excavator_num = len(dynamic_excavator_set)
#
# dynamic_dump_set = set(update_autodisp_dump())
# dynamic_dump_num = len(dynamic_dump_set)
#
# global global_dict
global_dict = {} global_dict = {}
# global_dict["dynamic_truck_set"] = dynamic_truck_set
# global_dict["dynamic_truck_num"] = dynamic_truck_num
# global_dict["dynamic_excavator_set"] = dynamic_excavator_set
# global_dict["dynamic_excavator_num"] = dynamic_excavator_num
# global_dict["dynamic_dump_set"] = dynamic_dump_set
# global_dict["dynamic_dump_num"] = dynamic_dump_num
# global_dict["park_num"] = park_num
def get_value(name): def get_value(name):
return global_dict[name] return global_dict[name]
# 设备映射类, 存储除工作区以外的映射关系
# 其余设备类继承该类
class DeviceMap: class DeviceMap:
"""
设备映射类, 存储除工作区以外的映射关系, 其余设备类继承该类
"""
excavator_uuid_to_index_dict = {} excavator_uuid_to_index_dict = {}
dump_uuid_to_index_dict = {} dump_uuid_to_index_dict = {}
excavator_index_to_uuid_dict = {} excavator_index_to_uuid_dict = {}
...@@ -103,50 +53,6 @@ class DeviceMap: ...@@ -103,50 +53,6 @@ class DeviceMap:
truck_uuid_to_index_dict = {} truck_uuid_to_index_dict = {}
truck_index_to_uuid_dict = {} truck_index_to_uuid_dict = {}
# def __init__(cls):
# cls.excavator_uuid_to_index_dict = {}
# cls.dump_uuid_to_index_dict = {}
# cls.excavator_index_to_uuid_dict = {}
# cls.dump_index_to_uuid_dict = {}
#
# cls.dump_uuid_to_unload_area_uuid_dict = {}
# cls.excavator_uuid_to_load_area_uuid_dict = {}
# cls.excavator_index_to_load_area_index_dict = {}
# cls.dump_index_to_unload_area_index_dict = {}
#
# cls.truck_uuid_to_index_dict = {}
# cls.truck_index_to_uuid_dict = {}
# def get_excavator_uuid_to_index_dict(cls):
# return cls.excavator_uuid_to_index_dict
#
# def get_dump_uuid_to_index_dict(cls):
# return cls.dump_uuid_to_index_dict
#
# def get_excavator_index_to_uuid_dict(cls):
# return cls.excavator_index_to_uuid_dict
#
# def get_dump_index_to_uuid_dict(cls):
# return cls.dump_index_to_uuid_dict
#
# def get_dump_uuid_to_unload_area_uuid_dict(cls):
# return cls.dump_uuid_to_unload_area_uuid_dict
#
# def get_excavator_uuid_to_load_area_uuid_dict(cls):
# return cls.excavator_uuid_to_load_area_uuid_dict
#
# def get_excavator_index_to_load_area_index_dict(cls):
# return cls.excavator_index_to_load_area_index_dict
#
# def get_dump_index_to_unload_area_index_dict(cls):
# return cls.dump_index_to_unload_area_index_dict
#
# def get_truck_uuid_to_index_dict(cls):
# return cls.truck_uuid_to_index_dict
#
# def get_truck_index_to_uuid_dict(cls):
# return cls.truck_index_to_uuid_dict
@classmethod @classmethod
def reset(cls): def reset(cls):
cls.excavator_uuid_to_index_dict = {} cls.excavator_uuid_to_index_dict = {}
...@@ -193,58 +99,19 @@ class DeviceMap: ...@@ -193,58 +99,19 @@ class DeviceMap:
"dump_index_to_unload_area_index_dict" "dump_index_to_unload_area_index_dict"
] ]
truck_map_dict = update_truck_uuid_index_map(get_value("dynamic_truck_set")) truck_map_dict = build_truck_uuid_index_map(get_value("dynamic_truck_set"))
cls.truck_uuid_to_index_dict = truck_map_dict["truck_uuid_to_index_dict"] cls.truck_uuid_to_index_dict = truck_map_dict["truck_uuid_to_index_dict"]
cls.truck_index_to_uuid_dict = truck_map_dict["truck_index_to_uuid_dict"] cls.truck_index_to_uuid_dict = truck_map_dict["truck_index_to_uuid_dict"]
# def period_map_para_load(cls):
# # 装载关系映射
# cls.excavator_uuid_to_index_dict = device_map.excavator_uuid_to_index_dict
# cls.dump_uuid_to_index_dict = device_map.dump_uuid_to_index_dict
# cls.excavator_index_to_uuid_dict = device_map.excavator_index_to_uuid_dict
# cls.dump_index_to_uuid_dict = device_map.dump_index_to_uuid_dict
#
# cls.dump_uuid_to_unload_area_uuid_dict = (
# device_map.dump_uuid_to_unload_area_uuid_dict
# )
# cls.excavator_uuid_to_load_area_uuid_dict = (
# device_map.excavator_uuid_to_load_area_uuid_dict
# )
# cls.excavator_index_to_load_area_index_dict = (
# device_map.excavator_index_to_load_area_index_dict
# )
# cls.dump_index_to_unload_area_index_dict = (
# device_map.dump_index_to_unload_area_index_dict
# )
#
# cls.truck_uuid_to_index_dict = device_map.truck_uuid_to_index_dict
# cls.truck_index_to_uuid_dict = device_map.truck_index_to_uuid_dict
# 路网信息类 #
class WalkManage(DeviceMap): class WalkManage(DeviceMap):
# def __init__(cls): """
# # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备 路网信息类
# """
# # 路网真实距离 # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
# cls.walk_time_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
# cls.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# cls.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
#
# # 路网行驶时间
# cls.distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
# cls.distance_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# cls.distance_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
# 路网真实距离 # 路网真实距离
walk_time_to_excavator = None walk_time_to_excavator = None
...@@ -262,49 +129,9 @@ class WalkManage(DeviceMap): ...@@ -262,49 +129,9 @@ class WalkManage(DeviceMap):
distance_to_load_area = None distance_to_load_area = None
distance_to_unload_area = None distance_to_unload_area = None
# def get_walk_time_to_load_area(cls):
# return cls.walk_time_to_load_area
#
# def get_walk_time_to_unload_area(cls):
# return cls.walk_time_to_unload_area
#
# def get_walk_time_to_excavator(cls):
# return cls.walk_time_to_excavator
#
# def get_walk_time_to_dump(cls):
# return cls.walk_time_to_dump
#
# def get_walk_time_park_to_load_area(cls):
# return cls.walk_time_park_to_load_area
#
# def get_walk_time_park_to_excavator(cls):
# return cls.walk_time_park_to_excavator
#
# def get_distance_to_load_area(cls):
# return cls.distance_to_load_area
#
# def get_distance_to_unload_area(cls):
# return cls.distance_to_unload_area
#
# def get_distance_to_excavator(cls):
# return cls.distance_to_excavator
#
# def get_distance_to_dump(cls):
# return cls.distance_to_dump
#
# def get_distance_park_to_load_area(cls):
# return cls.distance_park_to_load_area
#
# def get_distance_park_to_excavator(cls):
# return cls.distance_park_to_excavator
@classmethod @classmethod
def reset(cls): def reset(cls):
# dynamic_excavator_num
# dynamic_dump_num
# park_num
# 路网真实距离 # 路网真实距离
cls.walk_time_to_excavator = np.full( cls.walk_time_to_excavator = np.full(
(dynamic_dump_num, dynamic_excavator_num), M (dynamic_dump_num, dynamic_excavator_num), M
...@@ -450,7 +277,8 @@ def global_period_para_update(): ...@@ -450,7 +277,8 @@ def global_period_para_update():
truck_uuid_to_name_dict, truck_name_to_uuid_dict = build_truck_uuid_name_map() truck_uuid_to_name_dict, truck_name_to_uuid_dict = build_truck_uuid_name_map()
excavator_uuid_to_name_dict, dump_uuid_to_name_dict = build_equipment_uuid_name_map() excavator_uuid_to_name_dict = build_excavator_uuid_name_map()
dump_uuid_to_name_dict = build_dump_uuid_name_map()
global_dict = {"park_num": park_num, "load_area_num": load_area_num, "unload_area_num": unload_area_num, global_dict = {"park_num": park_num, "load_area_num": load_area_num, "unload_area_num": unload_area_num,
"truck_uuid_to_name_dict": truck_uuid_to_name_dict, "truck_uuid_to_name_dict": truck_uuid_to_name_dict,
......
...@@ -14,6 +14,11 @@ from tables import * ...@@ -14,6 +14,11 @@ from tables import *
logger = get_logger("zxt.static_data_process") logger = get_logger("zxt.static_data_process")
'''
area uuid index map building
'''
def build_work_area_uuid_index_map(): def build_work_area_uuid_index_map():
# load_area_id <-> load_area_index # load_area_id <-> load_area_index
# unload_area_id <-> unload_area_index # unload_area_id <-> unload_area_index
...@@ -71,7 +76,7 @@ def build_park_uuid_index_map(): ...@@ -71,7 +76,7 @@ def build_park_uuid_index_map():
if park_num < 1: if park_num < 1:
raise Exception("无备停区路网信息") raise Exception("无备停区路网信息")
except Exception as es: except Exception as es:
logger.info("备停区路网读取") logger.error("备停区路网读取")
logger.error(es) logger.error(es)
session_postgre.rollback() session_postgre.rollback()
session_mysql.rollback() session_mysql.rollback()
...@@ -79,6 +84,11 @@ def build_park_uuid_index_map(): ...@@ -79,6 +84,11 @@ def build_park_uuid_index_map():
return park_uuid_to_index_dict, park_index_to_uuid_dict return park_uuid_to_index_dict, park_index_to_uuid_dict
'''
equipment uuid name map building
'''
def build_truck_uuid_name_map(): def build_truck_uuid_name_map():
# truck_id <-> truck_name # truck_id <-> truck_name
truck_uuid_to_name_dict = {} truck_uuid_to_name_dict = {}
...@@ -100,11 +110,9 @@ def build_truck_uuid_name_map(): ...@@ -100,11 +110,9 @@ def build_truck_uuid_name_map():
return truck_uuid_to_name_dict, truck_name_to_uuid_dict return truck_uuid_to_name_dict, truck_name_to_uuid_dict
def build_equipment_uuid_name_map(): def build_excavator_uuid_name_map():
# excavator_id <-> excavator_name # excavator_id <-> excavator_name
# dump_id <-> dump_name
excavator_uuid_to_name_dict = {} excavator_uuid_to_name_dict = {}
dump_uuid_to_name_dict = {}
try: try:
for item in session_mysql.query(Equipment).filter_by(device_type=2).all(): for item in session_mysql.query(Equipment).filter_by(device_type=2).all():
...@@ -118,8 +126,13 @@ def build_equipment_uuid_name_map(): ...@@ -118,8 +126,13 @@ def build_equipment_uuid_name_map():
logger.warning(es) logger.warning(es)
session_postgre.rollback() session_postgre.rollback()
session_mysql.rollback() session_mysql.rollback()
return excavator_uuid_to_name_dict
def build_dump_uuid_name_map():
# dump_id <-> dump_name
dump_uuid_to_name_dict = {}
try: try:
for item in session_mysql.query(Equipment).filter_by(device_type=3).all(): for item in session_mysql.query(Equipment).filter_by(device_type=3).all():
truck_id = item.id truck_id = item.id
...@@ -132,7 +145,7 @@ def build_equipment_uuid_name_map(): ...@@ -132,7 +145,7 @@ def build_equipment_uuid_name_map():
logger.warning(es) logger.warning(es)
session_postgre.rollback() session_postgre.rollback()
session_mysql.rollback() session_mysql.rollback()
return excavator_uuid_to_name_dict, dump_uuid_to_name_dict return dump_uuid_to_name_dict
def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict): def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict):
...@@ -210,7 +223,7 @@ def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_ ...@@ -210,7 +223,7 @@ def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_
} }
def update_truck_uuid_index_map(dynamic_truck_set): def build_truck_uuid_index_map(dynamic_truck_set):
truck_uuid_to_index_dict = {} truck_uuid_to_index_dict = {}
truck_index_to_uuid_dict = {} truck_index_to_uuid_dict = {}
...@@ -229,6 +242,7 @@ def update_truck_uuid_index_map(dynamic_truck_set): ...@@ -229,6 +242,7 @@ def update_truck_uuid_index_map(dynamic_truck_set):
"truck_index_to_uuid_dict": truck_index_to_uuid_dict, "truck_index_to_uuid_dict": truck_index_to_uuid_dict,
} }
def update_total_truck(): def update_total_truck():
# 矿卡集合 # 矿卡集合
truck_list = [] truck_list = []
......
...@@ -85,8 +85,8 @@ class TruckInfo(WalkManage): ...@@ -85,8 +85,8 @@ class TruckInfo(WalkManage):
# 对象域 # 对象域
self._dump = dump self._dump = dump
self._excavator = excavator self._excavator = excavator
# 车辆位置信息 # 车辆车道位置信息
self.truck_locate_dict = {} self.truck_lane_locate_dict = {}
# 车辆临时调度 # 车辆临时调度
self.truck_is_temp = {} self.truck_is_temp = {}
...@@ -132,8 +132,8 @@ class TruckInfo(WalkManage): ...@@ -132,8 +132,8 @@ class TruckInfo(WalkManage):
def get_excavator_hold_truck_num(self): def get_excavator_hold_truck_num(self):
return self.excavator_hold_truck_num return self.excavator_hold_truck_num
def get_truck_locate_dict(self): def get_truck_lane_locate_dict(self):
return self.truck_locate_dict return self.truck_lane_locate_dict
################################################ short term update ################################################ ################################################ short term update ################################################
...@@ -219,18 +219,20 @@ class TruckInfo(WalkManage): ...@@ -219,18 +219,20 @@ class TruckInfo(WalkManage):
key_value_dict = redis5.get(truck_name_to_uuid_dict[item]) # reids str可以自动转为bytes key_value_dict = redis5.get(truck_name_to_uuid_dict[item]) # reids str可以自动转为bytes
if key_value_dict is None: if key_value_dict is None:
raise CoreException(108, f'车辆{item}不存在于redis5') # raise CoreException(108, f'车辆{item}不存在于redis5')
self.logger.warning(f'车辆{item}不存在于redis5')
isTemp = True
else:
key_value_dict = json.loads(byte_to_str(key_value_dict)) key_value_dict = json.loads(byte_to_str(key_value_dict))
if truck_name_to_uuid_dict[item] in self.dynamic_truck_set: if "isTemp" in key_value_dict:
try:
isTemp = key_value_dict["isTemp"] isTemp = key_value_dict["isTemp"]
else:
isTemp = True
if truck_name_to_uuid_dict[item] in self.dynamic_truck_set:
self.truck_is_temp[truck_name_to_uuid_dict[item]] = bool(isTemp) self.truck_is_temp[truck_name_to_uuid_dict[item]] = bool(isTemp)
except Exception as es: else:
self.logger.error(item) continue
self.logger.error(es)
self.truck_is_temp[truck_name_to_uuid_dict[item]] = True
# print(f'here3 {item} {bool(isTemp)}') # print(f'here3 {item} {bool(isTemp)}')
except Exception as es: except Exception as es:
...@@ -525,15 +527,15 @@ class TruckInfo(WalkManage): ...@@ -525,15 +527,15 @@ class TruckInfo(WalkManage):
print("self.excavator_hold_truck_num") print("self.excavator_hold_truck_num")
print(self.excavator_hold_truck_num) print(self.excavator_hold_truck_num)
def update_trucks_locate(self): def update_trucks_lane_locate(self):
""" """
get trucks locates. get trucks locates.
:return: truck_locate_dict :return: truck_lane_locate_dict
""" """
truck_uuid_to_name_dict = get_value("truck_uuid_to_name_dict") truck_uuid_to_name_dict = get_value("truck_uuid_to_name_dict")
self.truck_locate_dict = {} self.truck_lane_locate_dict = {}
for truck_id in self.dynamic_truck_set: for truck_id in self.dynamic_truck_set:
try: try:
# item = item.decode(encoding='utf-8') # item = item.decode(encoding='utf-8')
...@@ -548,7 +550,7 @@ class TruckInfo(WalkManage): ...@@ -548,7 +550,7 @@ class TruckInfo(WalkManage):
and (str_to_byte('laneId') in key_set): and (str_to_byte('laneId') in key_set):
truck_locate = key_value_dict[str_to_byte('laneId')] truck_locate = key_value_dict[str_to_byte('laneId')]
if eval(truck_locate) is not '': if eval(truck_locate) is not '':
self.truck_locate_dict[truck_id] = eval(truck_locate) self.truck_lane_locate_dict[truck_id] = eval(truck_locate)
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error(f'车辆 {truck_id} 位置信息丢失') self.logger.error(f'车辆 {truck_id} 位置信息丢失')
...@@ -638,6 +640,9 @@ class TruckInfo(WalkManage): ...@@ -638,6 +640,9 @@ class TruckInfo(WalkManage):
item = session_mysql.query(Equipment).filter_by(id=excavator_id).first() item = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
if item.bind_list is not None: if item.bind_list is not None:
for truck_name in json.loads(item.bind_list): for truck_name in json.loads(item.bind_list):
if truck_name not in truck_name_to_uuid_dict:
self.logger.error(f'truck_name_to_uuid_dict 不存在 {truck_name}')
continue
self.truck_excavator_bind[ self.truck_excavator_bind[
truck_name_to_uuid_dict[truck_name] truck_name_to_uuid_dict[truck_name]
] = excavator_id ] = excavator_id
...@@ -953,4 +958,4 @@ class TruckInfo(WalkManage): ...@@ -953,4 +958,4 @@ class TruckInfo(WalkManage):
self.update_truck_speed() self.update_truck_speed()
# 矿卡位置更新 # 矿卡位置更新
self.update_trucks_locate() self.update_trucks_lane_locate()
...@@ -154,21 +154,21 @@ class Topo(): ...@@ -154,21 +154,21 @@ class Topo():
if Entrancenode_for_dump not in self.unload_G_all_nodes: if Entrancenode_for_dump not in self.unload_G_all_nodes:
self.unload_G_all_nodes.append(Entrancenode_for_dump) self.unload_G_all_nodes.append(Entrancenode_for_dump)
self.unload_G_dump_nodes.append(Entrancenode_for_dump) self.unload_G_dump_nodes.append(Entrancenode_for_dump)
try: try:
unload_saved_lane = [] unload_saved_lane = []
for i in item[1]: # for each lane in a to_unload route for lane_id in item[1]: # for each lane in a to_unload route
i_startpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().StartNodeId) lane_startpoint = str(session_postgre.query(Lane).filter_by(Id=lane_id).first().StartNodeId)
i_endpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().EndNodeId) lane_endpoint = str(session_postgre.query(Lane).filter_by(Id=lane_id).first().EndNodeId)
# add [start_point, end_point, length, lane_id] to unload_saved_lane # add [start_point, end_point, length, lane_id] to unload_saved_lane
unload_saved_lane.append([str(i_startpoint), str(i_endpoint), unload_saved_lane.append([str(lane_startpoint), str(lane_endpoint),
float(session_postgre.query(Lane).filter_by(Id=i).first().Length), i]) float(session_postgre.query(Lane).filter_by(Id=lane_id).first().Length),
# son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = i_endpoint).all()) lane_id])
son_lane_num = len(session_postgre.query(Lane).filter_by(StartNodeId=i_endpoint).all()) # son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = lane_endpoint).all())
son_lane_num = len(session_postgre.query(Lane).filter_by(StartNodeId=lane_endpoint).all())
# 可以添加的节点:分叉口或终点 # 可以添加的节点:分叉口或终点
if son_lane_num > 1 or i_endpoint in self.unload_G_dump_nodes: if son_lane_num > 1 or lane_endpoint in self.unload_G_dump_nodes:
# print("item",item[0]) # print("item",item[0])
# print(unload_saved_lane) # print(unload_saved_lane)
# print("\n") # print("\n")
...@@ -188,17 +188,17 @@ class Topo(): ...@@ -188,17 +188,17 @@ class Topo():
# if [unload_saved_lane[0][0], unload_saved_lane[-1][1]] not in self.unload_G_edges: # if [unload_saved_lane[0][0], unload_saved_lane[-1][1]] not in self.unload_G_edges:
# self.unload_G_edges.append([unload_saved_lane[0][0], unload_saved_lane[-1][1]]) # self.unload_G_edges.append([unload_saved_lane[0][0], unload_saved_lane[-1][1]])
unload_saved_lane = [] unload_saved_lane = []
if i_startpoint not in self.unload_G_all_nodes: if lane_startpoint not in self.unload_G_all_nodes:
self.unload_G_all_nodes.append(i_startpoint) self.unload_G_all_nodes.append(lane_startpoint)
if i_endpoint not in self.unload_G_all_nodes: if lane_endpoint not in self.unload_G_all_nodes:
self.unload_G_all_nodes.append(i_endpoint) self.unload_G_all_nodes.append(lane_endpoint)
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error("去卸载区拓扑图出错") self.logger.error("去卸载区拓扑图出错")
session_mysql.rollback() session_mysql.rollback()
session_postgre.rollback() session_postgre.rollback()
# path_node_for_trip.append(Exitnode_for_digging) # add node for trip # path_node_for_trip.append(Exitnode_for_digging) # add node for trip
# if i_endpoint in self.unload_G_dump_nodes: # if lane_endpoint in self.unload_G_dump_nodes:
# load_G # load_G
Entrancenode_for_digging = str( Entrancenode_for_digging = str(
...@@ -216,24 +216,26 @@ class Topo(): ...@@ -216,24 +216,26 @@ class Topo():
self.load_G_all_nodes.append(Entrancenode_for_digging) self.load_G_all_nodes.append(Entrancenode_for_digging)
self.load_G_digging_nodes.append(Entrancenode_for_digging) self.load_G_digging_nodes.append(Entrancenode_for_digging)
self.load_G.add_node(Exitnode_for_dump, name='group_dumps', type=digging_name) self.load_G.add_node(Exitnode_for_dump, name='group_dumps', type=dump_name)
self.load_G.add_node(Entrancenode_for_digging, name='digging', type=dump_name) self.load_G.add_node(Entrancenode_for_digging, name='digging', type=digging_name)
try: try:
load_saved_lane = [] load_saved_lane = []
for i in item[2]: # [[str(item.load_area_id), str(item.unload_area_id)], item.to_unload_lanes, item.to_load_lanes] for lane_id in item[
load_i_startpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().StartNodeId) 2]: # [[str(item.load_area_id), str(item.unload_area_id)], item.to_unload_lanes, item.to_load_lanes]
load_i_endpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().EndNodeId) lane_startpoint = str(session_postgre.query(Lane).filter_by(Id=lane_id).first().StartNodeId)
lane_endpoint = str(session_postgre.query(Lane).filter_by(Id=lane_id).first().EndNodeId)
load_saved_lane.append([str(load_i_startpoint), str(load_i_endpoint), load_saved_lane.append([str(lane_startpoint), str(lane_endpoint),
float(session_postgre.query(Lane).filter_by(Id=i).first().Length), i]) float(session_postgre.query(Lane).filter_by(Id=lane_id).first().Length),
# son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = load_i_endpoint).all()) lane_id])
son_lane_num = len(session_postgre.query(Lane).filter_by(StartNodeId=load_i_endpoint).all()) # son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = lane_endpoint).all())
son_lane_num = len(session_postgre.query(Lane).filter_by(StartNodeId=lane_endpoint).all())
nodes = list(self.load_G.nodes) nodes = list(self.load_G.nodes)
# 可以添加的节点:分叉口或终点 # 可以添加的节点:分叉口或终点
if son_lane_num > 1 or load_i_endpoint in self.load_G_digging_nodes or load_i_endpoint in nodes: if son_lane_num > 1 or lane_endpoint in self.load_G_digging_nodes or lane_endpoint in nodes:
# print("item",item[0]) # print("item",item[0])
# print(load_saved_lane) # print(load_saved_lane)
# print("\n") # print("\n")
...@@ -252,19 +254,19 @@ class Topo(): ...@@ -252,19 +254,19 @@ class Topo():
# if [load_saved_lane[0][0], load_saved_lane[-1][1]] not in self.load_G_edges: # if [load_saved_lane[0][0], load_saved_lane[-1][1]] not in self.load_G_edges:
# self.load_G_edges.append([load_saved_lane[0][0], load_saved_lane[-1][1]]) # self.load_G_edges.append([load_saved_lane[0][0], load_saved_lane[-1][1]])
load_saved_lane = [] load_saved_lane = []
if load_i_startpoint not in self.load_G_all_nodes: if lane_startpoint not in self.load_G_all_nodes:
self.load_G_all_nodes.append(load_i_startpoint) self.load_G_all_nodes.append(lane_startpoint)
if load_i_endpoint not in self.load_G_all_nodes: if lane_endpoint not in self.load_G_all_nodes:
self.load_G_all_nodes.append(load_i_endpoint) self.load_G_all_nodes.append(lane_endpoint)
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error("去装载区拓扑图生成失败") self.logger.error("去装载区拓扑图生成失败")
session_mysql.rollback() session_mysql.rollback()
session_postgre.rollback() session_postgre.rollback()
print(self.load_G.nodes.data()) print(self.load_G.nodes.data())
# park_to_load_G
for k in park_trip: for k in park_trip:
...@@ -354,10 +356,11 @@ class Topo(): ...@@ -354,10 +356,11 @@ class Topo():
distance, path = nx.single_source_dijkstra(self.unload_G, source=source_node, target=i, distance, path = nx.single_source_dijkstra(self.unload_G, source=source_node, target=i,
weight="real_distance") weight="real_distance")
unload_area_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first(EntranceNodeId=i).first().Id unload_area_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first(
EntranceNodeId=i).first().Id
unload_area_lane_dict[str(unload_area_id)] = [] unload_area_lane_dict[str(unload_area_id)] = []
for j in range(len(path) - 1): for j in range(len(path) - 1):
unload_area_lane_dict[str(unload_area_id)] += self.load_G[path[j]][path[j+1]]['lane'] unload_area_lane_dict[str(unload_area_id)] += self.load_G[path[j]][path[j + 1]]['lane']
path_length_map[distance] = path path_length_map[distance] = path
# print(path) # print(path)
...@@ -402,7 +405,6 @@ class Topo(): ...@@ -402,7 +405,6 @@ class Topo():
data[u] = [v[0], v[0]] data[u] = [v[0], v[0]]
self.load_G[path[i]][path[i + 1]]['locked_distance'] = sum(i[-1] for i in list(data.values())) self.load_G[path[i]][path[i + 1]]['locked_distance'] = sum(i[-1] for i in list(data.values()))
""" """
return relative distance between node and lane (graph_type: 0=load, 1=unload) return relative distance between node and lane (graph_type: 0=load, 1=unload)
""" """
...@@ -455,7 +457,6 @@ class Topo(): ...@@ -455,7 +457,6 @@ class Topo():
if not len(target_list): if not len(target_list):
self.logger.error("当前无可去装载区!") self.logger.error("当前无可去装载区!")
load_area_lane_dict = {} load_area_lane_dict = {}
# print(target_list) # print(target_list)
...@@ -469,7 +470,7 @@ class Topo(): ...@@ -469,7 +470,7 @@ class Topo():
load_area_id = session_postgre.query(DiggingWorkArea).filter_by(EntranceNodeId=i).first().Id load_area_id = session_postgre.query(DiggingWorkArea).filter_by(EntranceNodeId=i).first().Id
load_area_lane_dict[str(load_area_id)] = [] load_area_lane_dict[str(load_area_id)] = []
for j in range(len(path) - 1): for j in range(len(path) - 1):
load_area_lane_dict[str(load_area_id)] += self.load_G[path[j]][path[j+1]]['lane'] load_area_lane_dict[str(load_area_id)] += self.load_G[path[j]][path[j + 1]]['lane']
path_length_map[distance] = path path_length_map[distance] = path
# print(path) # print(path)
...@@ -511,6 +512,6 @@ class Topo(): ...@@ -511,6 +512,6 @@ class Topo():
lanes = session_postgre.query(Lane).filter_by(EndNodeId=node_id).first() lanes = session_postgre.query(Lane).filter_by(EndNodeId=node_id).first()
if lanes is not None: if lanes is not None:
self.cross_bf_lanes.append(str(lanes.Id)) self.cross_bf_lanes.append(str(lanes.Id))
def get_cross_nodes(self): def get_cross_nodes(self):
return self.cross_nodes return self.cross_nodes
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