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

添加等待时间算法,修复部分BUG

parent 8ec9eb1f
...@@ -41,4 +41,13 @@ Changelog for package Dispatch ...@@ -41,4 +41,13 @@ Changelog for package Dispatch
[fix ]: [fix ]:
[TODO ]: [TODO ]:
[info ]: author: zxt ; time: 2021-11-03 10:13:00 ; email: ; tel: ; [info ]: author: zxt ; time: 2021-11-03 10:13:00 ; email: ; tel: ;
--------------------
--------------------
[version]: 3.4.0
[message]: add expected travelling time algorithm module
[feather]:
[fix ]:
[TODO ]:
[info ]: author: zxt ; time: 2022-04-07 17:33:00 ; email: ; tel: ;
-------------------- --------------------
\ No newline at end of file
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
from para_config import * from para_config import *
from equipment.truck import TruckInfo
from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo
class ScheduleAlg(WalkManage): class ScheduleAlg(WalkManage):
""" class for the schedule algorithm. """ class for the schedule algorithm.
...@@ -19,13 +22,15 @@ class ScheduleAlg(WalkManage): ...@@ -19,13 +22,15 @@ class ScheduleAlg(WalkManage):
equipment class: truck, excavator, dump, group equipment class: truck, excavator, dump, group
""" """
def __init__(self, dump, excavator, truck, group): def __init__(self, dump, excavator, truck, group, pre_sch):
self._dump = dump self._dump = dump
self._excavator = excavator self._excavator = excavator
self._truck = truck self._truck = truck
self._group = group self._group = group
# 获取日志器 # 获取日志器
self.logger = get_logger("zxt.alg") self.logger = get_logger("zxt.alg")
# 行程预测对象
self._pre_sch = pre_sch
def truck_schedule(self, current_truck, alg): def truck_schedule(self, current_truck, alg):
""" """
...@@ -35,27 +40,43 @@ class ScheduleAlg(WalkManage): ...@@ -35,27 +40,43 @@ class ScheduleAlg(WalkManage):
:return: 调度价值 :return: 调度价值
""" """
if alg == "congestion": transport_value = None
try:
if alg == "congestion":
transport_value = self.congestion_schedule(current_truck)
transport_value = self.congestion_schedule(current_truck.get_truck_id(), current_truck) elif alg == "traffic_plan":
elif alg == "traffic_plan": transport_value = self.traffic_plan_schedule(current_truck)
transport_value = self.traffic_plan_schedule(current_truck) elif alg == "saturation":
elif alg == "saturation": transport_value = self.saturation_schedule(current_truck)
elif alg == "expected":
transport_value = self.saturation_schedule(current_truck) transport_value = self.expected_travelling_schedule(current_truck)
else: else:
return None return None
except Exception as es:
self.logger.error("调度算法计算异常")
self.logger.error(es)
return transport_value return transport_value
def congestion_schedule(self, truck_id, current_truck): def congestion_schedule(self, current_truck):
"""
计算车辆驶往各目的地的拥堵度
:param current_truck: 请求调度
:return: transport_value
"""
transport_value = None transport_value = None
truck_id = current_truck.get_truck_id()
group_id = current_truck.get_group_id() group_id = current_truck.get_group_id()
task = current_truck.get_task() task = current_truck.get_task()
...@@ -70,7 +91,7 @@ class ScheduleAlg(WalkManage): ...@@ -70,7 +91,7 @@ class ScheduleAlg(WalkManage):
################################################ 矿卡启动 ############################################### ################################################ 矿卡启动 ###############################################
try: try:
self.logger.info("矿卡状态:矿卡启动或故障恢复") self.logger.info("矿卡状态:矿卡启动或故障恢复")
self.logger.info(f"涉及挖机:{list(self._excavator.excavator_uuid_to_index_dict.keys())}") self.logger.info(f"涉及挖机:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except Exception as es: except Exception as es:
self.logger.error(f"矿卡{truck_id}状态不匹配") self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es) self.logger.error(es)
...@@ -87,7 +108,7 @@ class ScheduleAlg(WalkManage): ...@@ -87,7 +108,7 @@ class ScheduleAlg(WalkManage):
try: try:
self.logger.info("矿卡状态:矿卡空载") self.logger.info("矿卡状态:矿卡空载")
self.logger.info(f"涉及卸载设备:{list(self._dump.dump_uuid_to_index_dict.keys())}") self.logger.info(f"涉及卸载设备:{list(DumpInfo.dump_uuid_to_index_dict.keys())}")
except Exception as es: except Exception as es:
self.logger.error(f"矿卡{truck_id}状态不匹配") self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es) self.logger.error(es)
...@@ -104,7 +125,7 @@ class ScheduleAlg(WalkManage): ...@@ -104,7 +125,7 @@ class ScheduleAlg(WalkManage):
try: try:
self.logger.info("矿卡状态:矿卡重载") self.logger.info("矿卡状态:矿卡重载")
self.logger.info(f"涉及挖机设备:{list(self._excavator.excavator_uuid_to_index_dict.keys())}") self.logger.info(f"涉及挖机设备:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except Exception as es: except Exception as es:
self.logger.error(f"矿卡{truck_id}状态不匹配") self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es) self.logger.error(es)
...@@ -119,6 +140,151 @@ class ScheduleAlg(WalkManage): ...@@ -119,6 +140,151 @@ class ScheduleAlg(WalkManage):
return transport_value return transport_value
def expected_travelling_schedule(self, current_truck):
"""
车辆驶往各目的地预计行驶时间
:param current_truck: 请求调度车辆信息
:return: transport_value
"""
transport_value = None
truck_id = current_truck.get_truck_id()
group_id = current_truck.get_group_id()
task = current_truck.get_task()
trip = current_truck.get_trip()
dynamic_excavator_num = get_value("dynamic_excavator_num")
dynamic_dump_num = get_value("dynamic_dump_num")
# 车辆可用时间
truck_avl_time = self._pre_sch.get_truck_avl_time(truck_id=truck_id)
if task == -2:
################################################ 矿卡启动 ###############################################
try:
self.logger.info("矿卡状态:矿卡启动或故障恢复")
self.logger.info(f"涉及挖机:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except Exception as es:
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
# try:
# 挖机可用时间
excavator_val_time = self._group.update_excavator_avl_time(self._pre_sch.get_excavator_avl_time())[group_id]
# 车辆驶往各目的地时间
truck_reach_time = 60 * self._group.group_park_to_excavator[group_id][0, :] / 1000 / \
self._truck.empty_speed[truck_id] + truck_avl_time
# 计算车辆得到服务时间
truck_service_time = np.maximum(truck_reach_time, excavator_val_time)
# 计算行程时间
transport_value = truck_service_time - truck_avl_time
self.logger.info("expected_travelling_schedule-truck_avl_time")
self.logger.info(truck_avl_time)
self.logger.info("expected_travelling_schedule-truck_service_time")
self.logger.info(truck_service_time)
self.logger.info("expected_travelling_schedule-truck_reach_time")
self.logger.info(truck_reach_time)
self.logger.info("expected_travelling_schedule-excavator_val_time")
self.logger.info(excavator_val_time)
# except Exception as es:
# transport_value = np.zeros(dynamic_excavator_num)
# self.logger.info(es)
if task in [0, 1, 2]:
################################################ 矿卡空载 ###############################################
try:
self.logger.info("矿卡状态:矿卡空载")
self.logger.info(f"涉及卸载设备:{list(DeviceMap.dump_uuid_to_index_dict.keys())}")
except Exception as es:
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
# try:
# 卸点可用时间
dump_val_time = self._group.update_dump_avl_time(self._pre_sch.get_dump_avl_time())[group_id]
# 车辆所在挖机
excavator_id = DeviceMap.excavator_index_to_uuid_dict[int(trip[1])]
# 挖机对应分组编号
excavator_group_index = self._group.group_excavator_uuid_to_index_dict[group_id][excavator_id]
# 车辆驶往各目的地时间
truck_reach_time = 60 * self._group.group_walk_to_dump_cost[group_id][excavator_group_index, :] \
/ 1000 / self._truck.heavy_speed[truck_id] + truck_avl_time
# 计算车辆得到服务时间
truck_service_time = np.maximum(truck_reach_time, dump_val_time)
# 计算行程时间
transport_value = truck_service_time - truck_avl_time
self.logger.info("expected_travelling_schedule-truck_avl_time")
self.logger.info(truck_avl_time)
self.logger.info("expected_travelling_schedule-truck_service_time")
self.logger.info(truck_service_time)
self.logger.info("expected_travelling_schedule-truck_reach_time")
self.logger.info(truck_reach_time)
self.logger.info("expected_travelling_schedule-dump_val_time")
self.logger.info(dump_val_time)
# except Exception as es:
# transport_value = np.zeros(dynamic_dump_num)
# self.logger.error(es)
elif task in [3, 4, 5]:
################################################ 矿卡重载 ###############################################
try:
self.logger.info("矿卡状态:矿卡重载")
self.logger.info(f"涉及挖机设备:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except Exception as es:
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
try:
# 挖机可用时间
excavator_val_time = self._group.update_excavator_avl_time(self._pre_sch.get_excavator_avl_time())[group_id]
# 车辆所在卸点
dump_id = DeviceMap.dump_index_to_uuid_dict[int(trip[1])]
# 卸点对应分组编号
dump_group_index = self._group.group_dump_uuid_to_index_dict[group_id][dump_id]
# 车辆驶往各目的地时间
truck_reach_time = 60 * self._group.group_walk_to_excavator_cost[group_id][dump_group_index, :] \
/ 1000 / self._truck.empty_speed[truck_id] + truck_avl_time
# 计算车辆得到服务时间
truck_service_time = np.maximum(truck_reach_time, excavator_val_time)
# 计算行程时间
transport_value = truck_service_time - truck_avl_time
except Exception as es:
transport_value = np.zeros(dynamic_dump_num)
self.logger.error(es)
return transport_value
# def traffic_plan_schedule(self, current_truck): # def traffic_plan_schedule(self, current_truck):
# #
# traffic_value = None # traffic_value = None
...@@ -324,4 +490,4 @@ class ScheduleAlg(WalkManage): ...@@ -324,4 +490,4 @@ class ScheduleAlg(WalkManage):
self.logger.info(f'饱和度价值 {saturation_value}') self.logger.info(f'饱和度价值 {saturation_value}')
# self.logger.info(saturation_value) # self.logger.info(saturation_value)
return saturation_value return saturation_value
\ No newline at end of file
{ {
"para": { "para": {
<<<<<<< HEAD
"log_path": "/Users/guoao/Desktop/work_log/wek33/integrated-scheduling-v3-master/dispatch", "log_path": "/Users/guoao/Desktop/work_log/wek33/integrated-scheduling-v3-master/dispatch",
=======
"log_path": "E:\\Pycharm Projects\\Waytous\\",
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
"empty_speed": 25, "empty_speed": 25,
"heavy_speed": 22, "heavy_speed": 22,
"dump_target_mass": 5000, "dump_target_mass": 5000,
...@@ -9,7 +13,7 @@ ...@@ -9,7 +13,7 @@
}, },
"mysql": { "mysql": {
"host": "192.168.28.111", "host": "192.168.9.152",
"port": "3306", "port": "3306",
"user": "root", "user": "root",
"password": "Huituo@123", "password": "Huituo@123",
...@@ -17,7 +21,7 @@ ...@@ -17,7 +21,7 @@
}, },
"postgresql": { "postgresql": {
"host": "192.168.28.111", "host": "192.168.9.152",
"port": "5432", "port": "5432",
"user": "postgres", "user": "postgres",
"password": "Huituo@123", "password": "Huituo@123",
...@@ -25,7 +29,7 @@ ...@@ -25,7 +29,7 @@
}, },
"redis": { "redis": {
"host": "192.168.28.111", "host": "192.168.9.152",
"password": "Huituo@123" "password": "Huituo@123"
} }
} }
...@@ -14,6 +14,19 @@ from algorithm import ScheduleAlg ...@@ -14,6 +14,19 @@ from algorithm import ScheduleAlg
class CurrentTruck: class CurrentTruck:
""" class for the information of current dispatching truck.
Description:
当前请求调度卡车信息
Attribute:
truck_id(uuid)
group_id(uuid)
trip(list)
task(int)
"""
def __init__(self, truck_id, group_id, trip, task): def __init__(self, truck_id, group_id, trip, task):
self._truck_id = truck_id self._truck_id = truck_id
self._group_id = group_id self._group_id = group_id
...@@ -168,7 +181,8 @@ class Dispatcher(WalkManage): ...@@ -168,7 +181,8 @@ class Dispatcher(WalkManage):
# self.topo = Topo() # self.topo = Topo()
# 车流对象 # 车流对象
self.traffic_flow = Traffic_flow(dump, excavator, truck) # self.traffic_flow = Traffic_flow(dump, excavator, truck)
self.traffic_flow = None
# 分组控制对象 # 分组控制对象
self.group = Group(dump, excavator, truck, self.traffic_flow, topo) self.group = Group(dump, excavator, truck, self.traffic_flow, topo)
...@@ -182,31 +196,28 @@ class Dispatcher(WalkManage): ...@@ -182,31 +196,28 @@ class Dispatcher(WalkManage):
self.truck = truck self.truck = truck
# 调度算法 # 调度算法
self._schedule_alg = ScheduleAlg(dump, excavator, truck, self.group) self._schedule_alg = ScheduleAlg(dump, excavator, truck, self.group, self.pre_sch)
# 获取日志器 # 获取日志器
self.logger = get_logger("zxt.dispatcher") self.logger = get_logger("zxt.dispatcher")
def dispatcher_period_update(self,topo): def dispatcher_period_update(self,topo):
# 装载映射参数及 global_period_para_update()
self.period_map_para_load()
self.period_walk_para_load()
# 更新卸载设备对象 # 更新卸载设备对象
self.dump.para_period_update() self.dump.dump_para_period_update()
# 更新挖机对象 # 更新挖机对象
self.excavator.para_period_update() self.excavator.excavator_para_period_update()
# 更新矿卡对象 # 更新矿卡对象
self.truck.para_period_update(self.dump, self.excavator) self.truck.truck_para_period_update(self.dump, self.excavator)
self.truck.state_period_update() self.truck.state_period_update()
# 更新实时车流 # # 更新实时车流
self.traffic_flow.update_actual_traffic_flow() # self.traffic_flow.update_actual_traffic_flow()
# 获取路网加权行驶成本 # 获取路网加权行驶成本
self.cost_to_excavator, self.cost_to_dump, self.cost_park_to_excavator = self.path.walk_cost_cal() self.cost_to_excavator, self.cost_to_dump, self.cost_park_to_excavator = self.path.walk_cost_cal()
...@@ -265,6 +276,7 @@ class Dispatcher(WalkManage): ...@@ -265,6 +276,7 @@ class Dispatcher(WalkManage):
################################################ 矿卡启动 ############################################### ################################################ 矿卡启动 ###############################################
try: try:
self.logger.info(datetime.now())
self.logger.info("矿卡状态:矿卡启动或故障恢复") self.logger.info("矿卡状态:矿卡启动或故障恢复")
self.logger.info("矿卡行程:无") self.logger.info("矿卡行程:无")
self.logger.info(f"涉及挖机:{list(self.excavator.excavator_uuid_to_index_dict.keys())}") self.logger.info(f"涉及挖机:{list(self.excavator.excavator_uuid_to_index_dict.keys())}")
...@@ -276,44 +288,61 @@ class Dispatcher(WalkManage): ...@@ -276,44 +288,61 @@ class Dispatcher(WalkManage):
self.logger.error(f"矿卡{truck_id}状态不匹配") self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es) self.logger.error(es)
# try: try:
# 1. 绑定调度 # 1. 绑定调度
if truck_id in self.truck.truck_excavator_bind: if truck_id in self.truck.truck_excavator_bind:
self.logger.info("绑定调度") self.logger.info("绑定调度")
target = self.excavator.excavator_uuid_to_index_dict[self.truck.truck_excavator_bind[truck_id]] target = self.excavator.excavator_uuid_to_index_dict[self.truck.truck_excavator_bind[truck_id]]
# 2. 正常调度
elif rule3 and rule4:
self.logger.info("正常调度")
transport_value = self._schedule_alg.truck_schedule(current_truck, "expected")
self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}')
excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id]
self.logger.info(f'挖机设备禁止因子 {excavator_exclude_modify}')
# 2. 正常调度 target = np.argmin(
elif rule3 and rule4: transport_value
self.logger.info("正常调度") + excavator_exclude_modify)
transport_value = self._schedule_alg.truck_schedule(current_truck, "congestion") self.logger.info("truck_schedule-target")
self.logger.info(target)
self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}') target = self.excavator.excavator_uuid_to_index_dict[
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
self.logger.info("truck_schedule-dict")
self.logger.info(self.excavator.excavator_uuid_to_index_dict)
self.logger.info(self.group.group_excavator_index_to_uuid_dict)
excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id] self.logger.info("truck_schedule-target")
self.logger.info(target)
self.logger.info(f'挖机设备禁止因子 {excavator_exclude_modify}') self.logger.info(f'excavator_uuid_to_index_dict {self.excavator.excavator_uuid_to_index_dict}')
target = np.argmin( # 3. 启用饱和度调度
transport_value else:
+ excavator_exclude_modify) self.logger.info("饱和度调度")
target = self.excavator.excavator_uuid_to_index_dict[
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
self.logger.info(f'行驶成本-含拥堵度的路径长度 {self.excavator.excavator_uuid_to_index_dict}') # saturation_value = self._schedule_alg.saturation_schedule(current_truck)
# 3. 启用饱和度调度 saturation_value = self._schedule_alg.truck_schedule(current_truck, "saturation")
else:
self.logger.info("饱和度调度")
saturation_value = self._schedule_alg.saturation_schedule(current_truck) self.logger.info(f'驶往挖机饱和度价值 {saturation_value}')
self.logger.info(f'驶往挖机饱和度价值 {saturation_value}') target = np.argmax(saturation_value)
target = np.argmax(saturation_value) target = self.excavator.excavator_uuid_to_index_dict[
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
target = self.excavator.excavator_uuid_to_index_dict[ except Exception as es:
self.group.group_excavator_index_to_uuid_dict[group_id][target]] self.logger.error(f"矿卡{truck_id}调度指令生成异常")
self.logger.error(es)
self.logger.info(self.excavator.excavator_uuid_to_index_dict) self.logger.info(self.excavator.excavator_uuid_to_index_dict)
self.logger.info(self.group.group_excavator_uuid_to_index_dict) self.logger.info(self.group.group_excavator_uuid_to_index_dict)
...@@ -345,45 +374,54 @@ class Dispatcher(WalkManage): ...@@ -345,45 +374,54 @@ class Dispatcher(WalkManage):
self.logger.info("矿卡行程信息异常") self.logger.info("矿卡行程信息异常")
self.logger.info(es) self.logger.info(es)
# 1. 绑定调度
if truck_id in self.truck.truck_dump_bind:
self.logger.info("矿卡已绑定卸点")
unload_area_uuid_to_index_dict = get_value("unload_area_uuid_to_index_dict")
bind_unload_area_id = self.truck.truck_dump_bind[truck_id]
for key, value in self.dump.dump_index_to_unload_area_index_dict.items():
if value == unload_area_uuid_to_index_dict[bind_unload_area_id]:
target = key
break
# 2. 正常调度 try:
elif rule3 and rule4:
# 1. 绑定调度
if truck_id in self.truck.truck_dump_bind:
self.logger.info("矿卡已绑定卸点")
unload_area_uuid_to_index_dict = get_value("unload_area_uuid_to_index_dict")
bind_unload_area_id = self.truck.truck_dump_bind[truck_id]
for key, value in self.dump.dump_index_to_unload_area_index_dict.items():
if value == unload_area_uuid_to_index_dict[bind_unload_area_id]:
target = key
break
# 2. 正常调度
elif rule3 and rule4:
# 卸载点处理能力及产量约束 and 电铲采装能力及产量约束 均未启用
transport_value = self._schedule_alg.truck_schedule(current_truck, "expected")
self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}')
transport_value = self._schedule_alg.truck_schedule(current_truck, "congestion") dump_material_bind_modify = self.group.group_dump_material_bind_modify[truck_id]
self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}') self.logger.info(f'卸点物料禁止因子 {dump_material_bind_modify}')
dump_material_bind_modify = self.group.group_dump_material_bind_modify[truck_id] target = np.argmin(transport_value.T + dump_material_bind_modify)
self.logger.info(f'卸点物料禁止因子 {dump_material_bind_modify}')
target = np.argmin(transport_value.T + dump_material_bind_modify) target = self.dump.dump_uuid_to_index_dict[
self.group.group_dump_index_to_uuid_dict[group_id][target]]
target = self.dump.dump_uuid_to_index_dict[ # 3. 饱和度调度
self.group.group_dump_index_to_uuid_dict[group_id][target]] else:
# 卸载点处理能力及产量约束 or 电铲采装能力及产量约束 启用
# 3. 饱和度调度 self.logger.info("饱和度调度")
else:
self.logger.info("饱和度调度") # saturation_value = self._schedule_alg.saturation_schedule(current_truck)
# saturation_value = self._schedule_alg.saturation_schedule(current_truck) saturation_value = self._schedule_alg.truck_schedule(current_truck, "saturation")
saturation_value = self._schedule_alg.truck_schedule(current_truck, "saturation") self.logger.info(f'驶往卸点饱和度价值 {saturation_value}')
self.logger.info(f'驶往卸点饱和度价值 {saturation_value}') target = np.argmax(saturation_value)
target = np.argmax(saturation_value) target = self.dump.dump_uuid_to_index_dict[
self.group.group_dump_index_to_uuid_dict[group_id][target]]
target = self.dump.dump_uuid_to_index_dict[ except Exception as es:
self.group.group_dump_index_to_uuid_dict[group_id][target]] self.logger.error(f"矿卡{truck_id}调度指令生成异常")
self.logger.error(es)
dump_uuid_to_name_dict = get_value("dump_uuid_to_name_dict") dump_uuid_to_name_dict = get_value("dump_uuid_to_name_dict")
self.logger.info(f"目的地:{dump_uuid_to_name_dict[self.dump.dump_index_to_uuid_dict[target]]}") self.logger.info(f"目的地:{dump_uuid_to_name_dict[self.dump.dump_index_to_uuid_dict[target]]}")
...@@ -431,7 +469,7 @@ class Dispatcher(WalkManage): ...@@ -431,7 +469,7 @@ class Dispatcher(WalkManage):
elif rule3 and rule4: elif rule3 and rule4:
self.logger.info("正常调度") self.logger.info("正常调度")
transport_value = self._schedule_alg.truck_schedule(current_truck, "congestion") transport_value = self._schedule_alg.truck_schedule(current_truck, "expected")
self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}') self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}')
excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id] excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id]
...@@ -461,11 +499,11 @@ class Dispatcher(WalkManage): ...@@ -461,11 +499,11 @@ class Dispatcher(WalkManage):
self.group.group_excavator_index_to_uuid_dict[group_id][target]] self.group.group_excavator_index_to_uuid_dict[group_id][target]]
except Exception as es: except Exception as es:
self.logger.error("trip出错1") self.logger.error(f"矿卡{truck_id}调度指令生成异常")
self.logger.info(es) self.logger.info(es)
excavator_uuid_to_name_dict = get_value("excavator_uuid_to_name_dict") excavator_uuid_to_name_dict = get_value("excavator_uuid_to_name_dict")
self.logger.info(f"目的地:{excavator_uuid_to_name_dict[self.excavator.excavator_index_to_uuid_dict[target]]}") self.logger.info(f"目的地:{excavator_uuid_to_name_dict[DeviceMap.excavator_index_to_uuid_dict[target]]}")
self.logger.info("==========================================================") self.logger.info("==========================================================")
...@@ -589,8 +627,8 @@ class Dispatcher(WalkManage): ...@@ -589,8 +627,8 @@ class Dispatcher(WalkManage):
item = ( item = (
session_mysql.query(Dispatch) session_mysql.query(Dispatch)
.filter_by(dump_id=self.dump.dump_index_to_uuid_dict[Seq[i][1]], .filter_by(dump_id=DeviceMap.dump_index_to_uuid_dict[Seq[i][1]],
exactor_id=self.excavator.excavator_index_to_uuid_dict[Seq[i][0]], exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][0]],
truck_id=truck_id, truck_id=truck_id,
group_id=group_id, group_id=group_id,
isauto=1, isdeleted=0, ).first()) isauto=1, isdeleted=0, ).first())
...@@ -609,8 +647,8 @@ class Dispatcher(WalkManage): ...@@ -609,8 +647,8 @@ class Dispatcher(WalkManage):
elif task in heavy_task_set: elif task in heavy_task_set:
item = ( item = (
session_mysql.query(Dispatch) session_mysql.query(Dispatch)
.filter_by(exactor_id=self.excavator.excavator_index_to_uuid_dict[Seq[i][1]], .filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]],
dump_id=self.dump.dump_index_to_uuid_dict[Seq[i][0]], dump_id=DeviceMap.dump_index_to_uuid_dict[Seq[i][0]],
truck_id=truck_id, truck_id=truck_id,
group_id=group_id, group_id=group_id,
isauto=1, isdeleted=0, ).first()) isauto=1, isdeleted=0, ).first())
...@@ -630,11 +668,15 @@ class Dispatcher(WalkManage): ...@@ -630,11 +668,15 @@ class Dispatcher(WalkManage):
try: try:
item = ( item = (
session_mysql.query(Dispatch) session_mysql.query(Dispatch)
.filter_by(exactor_id=self.excavator.excavator_index_to_uuid_dict[Seq[i][1]], .filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]],
truck_id=truck_id, truck_id=truck_id,
group_id=group_id, group_id=group_id,
isauto=1, isdeleted=0).first()) isauto=1, isdeleted=0).first())
print(Seq)
print(Seq[i][1])
print(DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]])
print("item") print("item")
print(item.id, item.truck_id, item.exactor_id, item.dump_id) print(item.id, item.truck_id, item.exactor_id, item.dump_id)
except Exception as es: except Exception as es:
...@@ -683,7 +725,7 @@ class PreSchedule: ...@@ -683,7 +725,7 @@ class PreSchedule:
Description: Description:
Calculate and update the prediction item. Calculate and update the prediction item.
复杂处理所有预测项的计算与更新 负责处理所有预测项的计算与更新
基于矿卡最近一次装卸载时间预测其抵达目的地时间 基于矿卡最近一次装卸载时间预测其抵达目的地时间
根据矿卡请求队列及抵达信息,计算设备最早可用时间 根据矿卡请求队列及抵达信息,计算设备最早可用时间
...@@ -711,6 +753,8 @@ class PreSchedule: ...@@ -711,6 +753,8 @@ class PreSchedule:
# 卡车完成装载及卸载时间(矿卡可用时间) # 卡车完成装载及卸载时间(矿卡可用时间)
self.truck_avl_time = np.zeros(self.truck.get_truck_num()) self.truck_avl_time = np.zeros(self.truck.get_truck_num())
self.logger = get_logger("zxt.pre_schedule")
def update_truck_reach_time(self): def update_truck_reach_time(self):
""" """
更新矿卡预计抵达目的地时间 更新矿卡预计抵达目的地时间
...@@ -733,9 +777,13 @@ class PreSchedule: ...@@ -733,9 +777,13 @@ class PreSchedule:
excavator_avl_ls = [[] for _ in range(dynamic_excavator_num)] excavator_avl_ls = [[] for _ in range(dynamic_excavator_num)]
dump_avl_ls = [[] for _ in range(dumps)] dump_avl_ls = [[] for _ in range(dumps)]
self.logger.info("update_truck_reach_time-trucks")
self.logger.info(trucks)
for i in range(trucks): for i in range(trucks):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]] task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1] end_area_index = truck_current_trip[i][1]
self.logger.info("update_truck_reach_time-truck_current_trip")
self.logger.info(truck_current_trip)
if task in [0, 1]: if task in [0, 1]:
reach_time = truck_reach_excavator[i] reach_time = truck_reach_excavator[i]
excavator_avl_ls[end_area_index].append( excavator_avl_ls[end_area_index].append(
...@@ -784,6 +832,8 @@ class PreSchedule: ...@@ -784,6 +832,8 @@ class PreSchedule:
) )
for reach_ls in excavator_avl_ls: for reach_ls in excavator_avl_ls:
self.logger.info("update_excavator_avl_time-excavator_avl_ls")
self.logger.info(excavator_avl_ls)
if len(reach_ls) != 0: if len(reach_ls) != 0:
reach_ls = np.array(reach_ls) reach_ls = np.array(reach_ls)
tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)] tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)]
...@@ -886,24 +936,33 @@ class PreSchedule: ...@@ -886,24 +936,33 @@ class PreSchedule:
dump_avl_time = self.update_dump_avl_time(dump_avl_ls) dump_avl_time = self.update_dump_avl_time(dump_avl_ls)
return dump_avl_time return dump_avl_time
def get_excavator_avl_time(self): def get_excavator_avl_time(self, excavator_id=None):
""" """
获取挖机最早可用时间 获取挖机最早可用时间
:param excavator_id: 挖机编号uuid
:return: :return:
excavator_avl_time: (array) 各挖机完成所有已分配矿卡装载的时间 excavator_avl_time: (array) 各挖机完成所有已分配矿卡装载的时间
""" """
self._reset() self._reset()
excavator_avl_ls, dump_avl_ls = self.update_truck_reach_time() excavator_avl_ls, dump_avl_ls = self.update_truck_reach_time()
return self.update_excavator_avl_time(excavator_avl_ls) if excavator_id is not None:
return self.update_excavator_avl_time(excavator_avl_ls) \
[self.excavator.excavator_uuid_to_index_dict[excavator_id]]
else:
return self.update_excavator_avl_time(excavator_avl_ls)
def get_truck_avl_time(self): def get_truck_avl_time(self, truck_id=None):
""" """
获取矿卡最早可用时间 获取矿卡最早可用时间
:return: :param truck_id: 矿卡编号uuid
truck_avl_time: (array) 各矿卡完成当前装载或卸载任务的时间 :return: truck_avl_time: (array) 各矿卡完成当前装载或卸载任务的时间
""" """
self._reset() self._reset()
excavator_avl_ls, dump_avl_ls = self.update_truck_reach_time() excavator_avl_ls, dump_avl_ls = self.update_truck_reach_time()
self.update_excavator_avl_time(excavator_avl_ls) self.update_excavator_avl_time(excavator_avl_ls)
self.update_dump_avl_time(dump_avl_ls) self.update_dump_avl_time(dump_avl_ls)
return self.truck_avl_time
if truck_id is not None:
return self.truck_avl_time[self.truck.truck_uuid_to_index_dict[truck_id]]
else:
return self.truck_avl_time
...@@ -32,15 +32,11 @@ class DumpInfo(WalkManage): ...@@ -32,15 +32,11 @@ class DumpInfo(WalkManage):
# 卸点卸载能力 # 卸点卸载能力
self.dump_strength = np.zeros(self.dynamic_dump_num) self.dump_strength = np.zeros(self.dynamic_dump_num)
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
# 日志器 # 日志器
self.logger = get_logger("zxt.dump") self.logger = get_logger("zxt.dump")
# 参数初始化 # # 参数初始化
self.para_period_update() # self.dump_para_period_update()
def get_unloading_time(self): def get_unloading_time(self):
...@@ -89,7 +85,7 @@ class DumpInfo(WalkManage): ...@@ -89,7 +85,7 @@ class DumpInfo(WalkManage):
# except Exception as es: # except Exception as es:
# self.logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)") # self.logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es) # self.logger.error(es)
self.unloading_time[self.dump_uuid_to_index_dict[dump_id]] = 5.00 self.unloading_time[self.dump_uuid_to_index_dict[dump_id]] = 2.00
# print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]]) # print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]])
# 更新卸载设备出入时间 # 更新卸载设备出入时间
...@@ -127,7 +123,7 @@ class DumpInfo(WalkManage): ...@@ -127,7 +123,7 @@ class DumpInfo(WalkManage):
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
self.dump_material[dump_id] = dump_material_id self.dump_material[dump_id] = dump_material_id
except Exception as es: except Exception as es:
self.logger.error("无动态派车计划可用") self.logger.error("卸点物料更新异常")
self.logger.error(es) self.logger.error(es)
def update_dump_priority(self): def update_dump_priority(self):
...@@ -136,10 +132,14 @@ class DumpInfo(WalkManage): ...@@ -136,10 +132,14 @@ class DumpInfo(WalkManage):
try: try:
unload_area_index = self.dump_index_to_unload_area_index_dict[self.dump_uuid_to_index_dict[dump_id]] unload_area_index = self.dump_index_to_unload_area_index_dict[self.dump_uuid_to_index_dict[dump_id]]
unload_area_id = unload_area_index_to_uuid_dict[unload_area_index] unload_area_id = unload_area_index_to_uuid_dict[unload_area_index]
self.logger.debug("update_dump_priority-unload_area_index")
self.logger.debug(unload_area_index)
self.logger.debug("update_dump_priority-unload_area_id")
self.logger.debug(unload_area_id)
item = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first() item = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first()
self.dump_priority_coefficient[self.dump_uuid_to_index_dict[dump_id]] += item.Priority self.dump_priority_coefficient[self.dump_uuid_to_index_dict[dump_id]] += item.Priority
except Exception as es: except Exception as es:
self.logger.error("无动态派车计划可用") self.logger.error("卸点优先级更新异常")
self.logger.error(es) self.logger.error(es)
def update_unload_ability(self): def update_unload_ability(self):
...@@ -150,10 +150,10 @@ class DumpInfo(WalkManage): ...@@ -150,10 +150,10 @@ class DumpInfo(WalkManage):
unload_area_id = unload_area_index_to_uuid_dict[self.dump_index_to_unload_area_index_dict[dump_index]] unload_area_id = unload_area_index_to_uuid_dict[self.dump_index_to_unload_area_index_dict[dump_index]]
unload_ability = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().UnloadAbililty unload_ability = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().UnloadAbililty
self.dump_strength[dump_index] = unload_ability # 卸载设备最大卸载能力,单位吨/小时 self.dump_strength[dump_index] = unload_ability # 卸载设备最大卸载能力,单位吨/小时
# if unload_ability < 200: if unload_ability < 200:
# raise Exception("卸载点卸载能力异常") raise Exception("卸载点卸载能力异常")
else: else:
self.dump_strength = np.full(self.dynamic_dump_num, 5000) self.dump_strength = np.full(self.dynamic_dump_num, 5000)
...@@ -179,7 +179,7 @@ class DumpInfo(WalkManage): ...@@ -179,7 +179,7 @@ class DumpInfo(WalkManage):
# 卸点卸载能力 # 卸点卸载能力
self.dump_strength = np.zeros(self.dynamic_dump_num) self.dump_strength = np.zeros(self.dynamic_dump_num)
def para_period_update(self): def dump_para_period_update(self):
self.reset() self.reset()
...@@ -187,11 +187,6 @@ class DumpInfo(WalkManage): ...@@ -187,11 +187,6 @@ class DumpInfo(WalkManage):
self.logger.info("Dump update!") self.logger.info("Dump update!")
# 装载周期参数
self.period_map_para_load()
self.period_walk_para_load()
# 计算平均卸载时间 # 计算平均卸载时间
self.update_dump_unloadtime() self.update_dump_unloadtime()
......
...@@ -36,15 +36,11 @@ class ExcavatorInfo(WalkManage): ...@@ -36,15 +36,11 @@ class ExcavatorInfo(WalkManage):
# 挖机装载能力 # 挖机装载能力
self.excavator_strength = np.zeros(self.dynamic_excavator_num) self.excavator_strength = np.zeros(self.dynamic_excavator_num)
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
# 日志器 # 日志器
self.logger = get_logger("zxt.excavator") self.logger = get_logger("zxt.excavator")
#
# 参数初始化 # # 参数初始化
self.para_period_update() # self.excavator_para_period_update()
def get_loading_time(self): def get_loading_time(self):
return self.loading_time return self.loading_time
...@@ -87,7 +83,7 @@ class ExcavatorInfo(WalkManage): ...@@ -87,7 +83,7 @@ class ExcavatorInfo(WalkManage):
self.logger.info(self.loading_time) self.logger.info(self.loading_time)
self.logger.info("excavator_uuid_to_index_dict") self.logger.info("excavator_uuid_to_index_dict")
self.logger.info(self.excavator_uuid_to_index_dict) self.logger.info(self.excavator_uuid_to_index_dict)
self.loading_time[self.excavator_uuid_to_index_dict[excavator_id]] = 5.00 self.loading_time[self.excavator_uuid_to_index_dict[excavator_id]] = 1.00
# 更新挖机设备出入时间 # 更新挖机设备出入时间
def update_excavator_entrance_exit_time(self): def update_excavator_entrance_exit_time(self):
...@@ -208,7 +204,7 @@ class ExcavatorInfo(WalkManage): ...@@ -208,7 +204,7 @@ class ExcavatorInfo(WalkManage):
# 挖机装载能力 # 挖机装载能力
self.excavator_strength = np.zeros(get_value("dynamic_excavator_num")) self.excavator_strength = np.zeros(get_value("dynamic_excavator_num"))
def para_period_update(self): def excavator_para_period_update(self):
self.reset() self.reset()
...@@ -219,14 +215,8 @@ class ExcavatorInfo(WalkManage): ...@@ -219,14 +215,8 @@ class ExcavatorInfo(WalkManage):
self.logger.info("物料优先级规则") self.logger.info("物料优先级规则")
self.logger.info(rule7) self.logger.info(rule7)
# 装载周期参数
self.period_map_para_load()
print("truck.excavator_uuid_index_dict") print("truck.excavator_uuid_index_dict")
print(self.excavator_uuid_to_index_dict) print(self.excavator_uuid_to_index_dict)
self.period_walk_para_load()
# # 用于动态调度的挖机设备 # # 用于动态调度的挖机设备
# self.dynamic_excavator_set = set(update_autodisp_excavator()) # self.dynamic_excavator_set = set(update_autodisp_excavator())
# #
......
...@@ -12,8 +12,6 @@ from equipment.excavator import ExcavatorInfo ...@@ -12,8 +12,6 @@ from equipment.excavator import ExcavatorInfo
from typing import List from typing import List
# 矿卡设备类 # 矿卡设备类
class TruckInfo(WalkManage): class TruckInfo(WalkManage):
def __init__(self, dump, excavator): def __init__(self, dump, excavator):
...@@ -71,20 +69,17 @@ class TruckInfo(WalkManage): ...@@ -71,20 +69,17 @@ class TruckInfo(WalkManage):
self.dump_hold_truck_num = np.zeros(get_value("dynamic_dump_num")) self.dump_hold_truck_num = np.zeros(get_value("dynamic_dump_num"))
# 各装载区矿卡数量 # 各装载区矿卡数量
self.excavator_hold_truck_num = np.zeros(get_value("dynamic_excavator_num")) self.excavator_hold_truck_num = np.zeros(get_value("dynamic_excavator_num"))
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
# 日志 # 日志
self.logger = get_logger("zxt.truck") self.logger = get_logger("zxt.truck")
# 初始化读取参数 # # 初始化读取参数
self.para_period_update(dump, excavator) # self.truck_para_period_update(dump, excavator)
# # 矿卡所属group # # 矿卡所属group
# self.truck_group = {} # self.truck_group = {}
# 矿卡禁用列表 # 矿卡禁用列表
self.truck_disable_list = [] self.truck_disable_list = []
# 对象域 # 对象域
self.dump = dump self._dump = dump
self.excavator = excavator self._excavator = excavator
def get_truck_current_trip(self): def get_truck_current_trip(self):
return self.truck_current_trip return self.truck_current_trip
...@@ -132,13 +127,6 @@ class TruckInfo(WalkManage): ...@@ -132,13 +127,6 @@ class TruckInfo(WalkManage):
self.truck_current_task = {} self.truck_current_task = {}
device_name_set = redis2.keys() device_name_set = redis2.keys()
# print("tast_truck_set")
# print(get_value("dynamic_truck_set")) ## 两个
#
# print(self.dynamic_truck_set)
# print(self.truck_uuid_to_index_dict)
for item in device_name_set: for item in device_name_set:
try: try:
item = item.decode(encoding="utf-8") item = item.decode(encoding="utf-8")
...@@ -264,8 +252,8 @@ class TruckInfo(WalkManage): ...@@ -264,8 +252,8 @@ class TruckInfo(WalkManage):
def update_truck_trip(self): def update_truck_trip(self):
walk_time_to_load_area = walk_manage.get_walk_time_to_load_area() walk_time_to_load_area = WalkManage.walk_time_to_load_area
walk_time_to_unload_area = walk_manage.get_walk_time_to_unload_area() walk_time_to_unload_area = WalkManage.walk_time_to_unload_area
# 初始化矿卡行程, -1代表备停区 # 初始化矿卡行程, -1代表备停区
self.truck_current_trip = np.full((self.dynamic_truck_num, 2), -1) self.truck_current_trip = np.full((self.dynamic_truck_num, 2), -1)
...@@ -287,77 +275,91 @@ class TruckInfo(WalkManage): ...@@ -287,77 +275,91 @@ class TruckInfo(WalkManage):
self.logger.error(es) self.logger.error(es)
continue continue
# try: try:
# 若矿卡状态为空运 # 若矿卡状态为空运
if task in empty_task_set: if task in empty_task_set:
last_unload_time = self.relative_last_unload_time[ last_unload_time = self.relative_last_unload_time[
self.truck_index_to_uuid_dict[i] self.truck_index_to_uuid_dict[i]
] ]
# 开始区域id if item.dump_id in DeviceMap.dump_uuid_to_unload_area_uuid_dict:
start_area_id = self.dump_uuid_to_unload_area_uuid_dict[ start_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
item.dump_id start_area_index = unload_area_uuid_to_index_dict[start_area_id]
] start_eq_index = self.dump_uuid_to_index_dict[item.dump_id]
# 开始区域序号 else:
start_area_index = unload_area_uuid_to_index_dict[start_area_id] start_area_index = -1
end_area_id = self.excavator_uuid_to_load_area_uuid_dict[ start_eq_index = -1
item.exactor_id
] if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
end_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
# # 结束设备index end_area_index = load_area_uuid_to_index_dict[end_area_id]
# end_eqp_index = self.excavator_uuid_to_index_dict[item.exactor_id] end_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
end_area_index = load_area_uuid_to_index_dict[end_area_id] end_area_index = -1
self.truck_current_trip[i] = [ end_eq_index = -1
self.dump_uuid_to_index_dict[item.dump_id],
self.excavator_uuid_to_index_dict[item.exactor_id], self.truck_current_trip[i] = [start_eq_index, end_eq_index]
]
self.cur_truck_reach_excavator[i] = ( self.cur_truck_reach_excavator[i] = (
last_unload_time last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index] + walk_time_to_load_area[start_area_index][end_area_index]
) )
# # 目的地矿卡数加一 self.logger.info(f'update_truck_trip-{truck_id}-last_unload_time')
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1 self.logger.info(last_unload_time)
# 若矿卡状态为重载 self.logger.info(f'update_truck_trip-walk_time_to_load_area')
elif task in heavy_task_set: self.logger.info(walk_time_to_load_area[start_area_index][end_area_index])
# print("读取重载行程")
# print(item.exactor_id, item.dump_id) # # 目的地矿卡数加一
last_load_time = self.relative_last_load_time[ # self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
self.truck_index_to_uuid_dict[i] # 若矿卡状态为重载
] elif task in heavy_task_set:
# 开始区域id # print("读取重载行程")
start_area_id = self.excavator_uuid_to_load_area_uuid_dict[ # print(item.exactor_id, item.dump_id)
item.exactor_id last_load_time = self.relative_last_load_time[
] self.truck_index_to_uuid_dict[i]
# 开始区域序号 ]
start_area_index = load_area_uuid_to_index_dict[start_area_id]
# 结束区域id if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
end_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id] start_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
# 结束区域序号 start_area_index = load_area_uuid_to_index_dict[start_area_id]
end_area_index = unload_area_uuid_to_index_dict[end_area_id] start_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
# # 结束设备index start_area_index = -1
# end_eqp_index = self.dump_uuid_to_index_dict[item.dump_id] start_eq_index = -1
self.truck_current_trip[i] = [ if item.dump_id in DeviceMap.dump_uuid_to_index_dict:
self.excavator_uuid_to_index_dict[item.exactor_id], end_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
self.dump_uuid_to_index_dict[item.dump_id], end_area_index = unload_area_uuid_to_index_dict[end_area_id]
] end_eq_index = self.dump_uuid_to_index_dict[item.dump_id]
self.cur_truck_reach_dump[i] = ( else:
last_load_time end_area_index = -1
+ walk_time_to_unload_area[end_area_index][start_area_index] end_eq_index = -1
)
# # 结束设备index
# end_eqp_index = self.dump_uuid_to_index_dict[item.dump_id]
self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.cur_truck_reach_dump[i] = (
last_load_time
+ walk_time_to_unload_area[end_area_index][start_area_index]
)
# 目的地矿卡数加一 self.logger.info(f'update_truck_trip-{truck_id}-last_load_time')
# self.dump_hold_truck_num[end_eqp_index] = self.dump_hold_truck_num[end_eqp_index] + 1 self.logger.info(last_load_time)
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡 self.logger.info(f'update_truck_trip-walk_time_to_unload_area')
else: self.logger.info(walk_time_to_unload_area[end_area_index][start_area_index])
# end_eqp_index = excavator.excavator_uuid_to_index_dict[item.exactor_id]
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1 # 目的地矿卡数加一
pass # self.dump_hold_truck_num[end_eqp_index] = self.dump_hold_truck_num[end_eqp_index] + 1
# except Exception as es: # 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
# self.logger.error("矿卡行程读取异常") else:
# self.logger.error(es) # end_eqp_index = excavator.excavator_uuid_to_index_dict[item.exactor_id]
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
pass
except Exception as es:
self.logger.error("矿卡行程读取异常")
self.logger.error(es)
# print("self.dump_hold_truck_num") # print("self.dump_hold_truck_num")
# print(self.dump_hold_truck_num) # print(self.dump_hold_truck_num)
...@@ -366,8 +368,8 @@ class TruckInfo(WalkManage): ...@@ -366,8 +368,8 @@ class TruckInfo(WalkManage):
# print(self.excavator_hold_truck_num) # print(self.excavator_hold_truck_num)
self.truck_current_trip.flatten() self.truck_current_trip.flatten()
# print("当前矿卡行程:") print("当前矿卡行程:")
# print(self.truck_current_trip) print(self.truck_current_trip)
def update_eqp_hold_truck(self): def update_eqp_hold_truck(self):
...@@ -547,8 +549,8 @@ class TruckInfo(WalkManage): ...@@ -547,8 +549,8 @@ class TruckInfo(WalkManage):
if truck_id in self.truck_excavator_bind: if truck_id in self.truck_excavator_bind:
excavator_id = self.truck_excavator_bind[truck_id] excavator_id = self.truck_excavator_bind[truck_id]
# print(self.excavator.excavator_material) # print(self._excavator.excavator_material)
excavator_material_id = self.excavator.excavator_material[excavator_id] excavator_material_id = self._excavator.excavator_material[excavator_id]
self.truck_material_bind[truck_id] = excavator_material_id self.truck_material_bind[truck_id] = excavator_material_id
for truck_id in self.dynamic_truck_set: for truck_id in self.dynamic_truck_set:
...@@ -560,14 +562,14 @@ class TruckInfo(WalkManage): ...@@ -560,14 +562,14 @@ class TruckInfo(WalkManage):
material = self.truck_material_bind[truck_id] material = self.truck_material_bind[truck_id]
for excavator_id in get_value("dynamic_excavator_set"): for excavator_id in get_value("dynamic_excavator_set"):
excavator_material_id = self.excavator.excavator_material[excavator_id] excavator_material_id = self._excavator.excavator_material[excavator_id]
excavator_index = self.excavator_uuid_to_index_dict[excavator_id] excavator_index = self.excavator_uuid_to_index_dict[excavator_id]
print(truck_index, excavator_index) print(truck_index, excavator_index)
if excavator_material_id != material: if excavator_material_id != material:
self.excavator_material_bind_modify[truck_index][excavator_index] = 1000000 self.excavator_material_bind_modify[truck_index][excavator_index] = 1000000
for dump_id in get_value("dynamic_dump_set"): for dump_id in get_value("dynamic_dump_set"):
dump_material_id = self.dump.dump_material[dump_id] dump_material_id = self._dump.dump_material[dump_id]
dump_index = self.dump_uuid_to_index_dict[dump_id] dump_index = self.dump_uuid_to_index_dict[dump_id]
if dump_material_id != material: if dump_material_id != material:
self.dump_material_bind_modify[truck_index][dump_index] = 1000000 self.dump_material_bind_modify[truck_index][dump_index] = 1000000
...@@ -633,7 +635,7 @@ class TruckInfo(WalkManage): ...@@ -633,7 +635,7 @@ class TruckInfo(WalkManage):
self.dump = dump self.dump = dump
self.excavator = excavator self.excavator = excavator
def para_period_update(self, dump, excavator): def truck_para_period_update(self, dump, excavator):
# 初始化参数 # 初始化参数
self.truck_reset(dump, excavator) self.truck_reset(dump, excavator)
...@@ -705,11 +707,6 @@ class TruckInfo(WalkManage): ...@@ -705,11 +707,6 @@ class TruckInfo(WalkManage):
self.logger.info("Para truck update!") self.logger.info("Para truck update!")
# 装载周期参数
self.period_map_para_update()
self.period_walk_para_update()
# 更新有效载重 # 更新有效载重
self.update_truck_payload() self.update_truck_payload()
......
...@@ -114,7 +114,7 @@ class Group(WalkManage): ...@@ -114,7 +114,7 @@ class Group(WalkManage):
print(truck_current_task) print(truck_current_task)
for i in range(dynamic_truck_num): for i in range(dynamic_truck_num):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]] task = truck_current_task[DeviceMap.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1] end_area_index = truck_current_trip[i][1]
start_area_index = truck_current_trip[i][0] start_area_index = truck_current_trip[i][0]
...@@ -122,8 +122,6 @@ class Group(WalkManage): ...@@ -122,8 +122,6 @@ class Group(WalkManage):
self.goto_dump_truck_num[start_area_index][end_area_index] += 1 self.goto_dump_truck_num[start_area_index][end_area_index] += 1
self.actual_goto_dump_traffic_flow[start_area_index][end_area_index] += float(payload[i]) self.actual_goto_dump_traffic_flow[start_area_index][end_area_index] += float(payload[i])
# logger.info("debug2")
if task in empty_task_set: if task in empty_task_set:
self.goto_excavator_truck_num[start_area_index][end_area_index] += 1 self.goto_excavator_truck_num[start_area_index][end_area_index] += 1
self.actual_goto_excavator_traffic_flow[start_area_index][end_area_index] += float(payload[i]) self.actual_goto_excavator_traffic_flow[start_area_index][end_area_index] += float(payload[i])
...@@ -181,16 +179,16 @@ class Group(WalkManage): ...@@ -181,16 +179,16 @@ class Group(WalkManage):
dump_group_index = self.group_dump_uuid_to_index_dict[group_id][dump_id] dump_group_index = self.group_dump_uuid_to_index_dict[group_id][dump_id]
excavator_group_index = self.group_excavator_uuid_to_index_dict[group_id][excavator_id] excavator_group_index = self.group_excavator_uuid_to_index_dict[group_id][excavator_id]
local_opt_goto_dump_traffic_flow[excavator_group_index][dump_group_index] = \ local_opt_goto_dump_traffic_flow[excavator_group_index][dump_group_index] = \
opt_goto_dump_traffic_flow[self.excavator.excavator_uuid_to_index_dict[excavator_id]][self.dump.dump_uuid_to_index_dict[dump_id]] opt_goto_dump_traffic_flow[DeviceMap.excavator_uuid_to_index_dict[excavator_id]][DeviceMap.dump_uuid_to_index_dict[dump_id]]
local_opt_goto_excavator_traffic_flow[dump_group_index][excavator_group_index] = \ local_opt_goto_excavator_traffic_flow[dump_group_index][excavator_group_index] = \
opt_goto_excavator_traffic_flow[self.dump.dump_uuid_to_index_dict[dump_id]][self.excavator.excavator_uuid_to_index_dict[excavator_id]] opt_goto_excavator_traffic_flow[DeviceMap.dump_uuid_to_index_dict[dump_id]][DeviceMap.excavator_uuid_to_index_dict[excavator_id]]
local_actual_goto_dump_traffic_flow[excavator_group_index][dump_group_index] = \ local_actual_goto_dump_traffic_flow[excavator_group_index][dump_group_index] = \
actual_goto_dump_traffic_flow[self.excavator.excavator_uuid_to_index_dict[excavator_id]][self.dump.dump_uuid_to_index_dict[dump_id]] actual_goto_dump_traffic_flow[DeviceMap.excavator_uuid_to_index_dict[excavator_id]][DeviceMap.dump_uuid_to_index_dict[dump_id]]
local_actual_goto_excavator_traffic_flow[dump_group_index][excavator_group_index] = \ local_actual_goto_excavator_traffic_flow[dump_group_index][excavator_group_index] = \
actual_goto_excavator_traffic_flow[self.dump.dump_uuid_to_index_dict[dump_id]][self.excavator.excavator_uuid_to_index_dict[excavator_id]] actual_goto_excavator_traffic_flow[DeviceMap.dump_uuid_to_index_dict[dump_id]][DeviceMap.excavator_uuid_to_index_dict[excavator_id]]
self.group_opt_goto_dump_traffic_flow[group_id] = local_opt_goto_dump_traffic_flow self.group_opt_goto_dump_traffic_flow[group_id] = local_opt_goto_dump_traffic_flow
self.group_opt_goto_excavator_traffic_flow[group_id] = local_opt_goto_excavator_traffic_flow self.group_opt_goto_excavator_traffic_flow[group_id] = local_opt_goto_excavator_traffic_flow
...@@ -204,7 +202,6 @@ class Group(WalkManage): ...@@ -204,7 +202,6 @@ class Group(WalkManage):
logger.info(self.group_opt_goto_dump_traffic_flow) logger.info(self.group_opt_goto_dump_traffic_flow)
logger.info(self.group_opt_goto_excavator_traffic_flow) logger.info(self.group_opt_goto_excavator_traffic_flow)
def update_group_walk_cost(self): def update_group_walk_cost(self):
# 更新调度分组路网行驶成本 # 更新调度分组路网行驶成本
...@@ -217,7 +214,7 @@ class Group(WalkManage): ...@@ -217,7 +214,7 @@ class Group(WalkManage):
dump_group = self.device_group[group_id][0] dump_group = self.device_group[group_id][0]
excavator_group = self.device_group[group_id][1] excavator_group = self.device_group[group_id][1]
local_walk_to_excavator_cost = np.zeros((len(dump_group), len(excavator_group))) local_walk_to_excavator_cost = np.zeros((len(dump_group), len(excavator_group)))
local_walk_to_dump_cost = np.zeros((len(dump_group), len(excavator_group))) local_walk_to_dump_cost = np.zeros((len(excavator_group), len(dump_group)))
local_park_to_excavator_cost = np.zeros((park_num, len(excavator_group))) local_park_to_excavator_cost = np.zeros((park_num, len(excavator_group)))
for excavator_id in excavator_group: for excavator_id in excavator_group:
for dump_id in dump_group: for dump_id in dump_group:
...@@ -226,16 +223,19 @@ class Group(WalkManage): ...@@ -226,16 +223,19 @@ class Group(WalkManage):
print("dump_group") print("dump_group")
print(dump_group) print(dump_group)
local_walk_to_excavator_cost[dump_group_index][excavator_group_index] = \ local_walk_to_excavator_cost[dump_group_index][excavator_group_index] = \
walk_to_excavator_cost[self.dump.dump_uuid_to_index_dict[dump_id]][self.excavator.excavator_uuid_to_index_dict[excavator_id]] walk_to_excavator_cost[DeviceMap.dump_uuid_to_index_dict[dump_id]][DeviceMap.excavator_uuid_to_index_dict[excavator_id]]
local_walk_to_dump_cost[dump_group_index][excavator_group_index] = \ local_walk_to_dump_cost[excavator_group_index][dump_group_index] = \
walk_to_dump_cost[self.dump.dump_uuid_to_index_dict[dump_id]][self.excavator.excavator_uuid_to_index_dict[excavator_id]] walk_to_dump_cost[DeviceMap.dump_uuid_to_index_dict[dump_id]][DeviceMap.excavator_uuid_to_index_dict[excavator_id]]
for park_index in range(park_num): for park_index in range(park_num):
for excavator_id in excavator_group: for excavator_id in excavator_group:
excavator_group_index = self.group_excavator_uuid_to_index_dict[group_id][excavator_id] excavator_group_index = self.group_excavator_uuid_to_index_dict[group_id][excavator_id]
local_park_to_excavator_cost[park_index][excavator_group_index] = \ local_park_to_excavator_cost[park_index][excavator_group_index] = \
park_to_excavator_cost[park_index][self.excavator.excavator_uuid_to_index_dict[excavator_id]] park_to_excavator_cost[park_index][DeviceMap.excavator_uuid_to_index_dict[excavator_id]]
print("here1")
print(park_to_excavator_cost)
self.group_walk_to_excavator_cost[group_id] = local_walk_to_excavator_cost self.group_walk_to_excavator_cost[group_id] = local_walk_to_excavator_cost
self.group_walk_to_dump_cost[group_id] = local_walk_to_dump_cost self.group_walk_to_dump_cost[group_id] = local_walk_to_dump_cost
...@@ -358,6 +358,42 @@ class Group(WalkManage): ...@@ -358,6 +358,42 @@ class Group(WalkManage):
return group_dump_hold_truck return group_dump_hold_truck
def update_excavator_avl_time(self, excavator_avl_time):
'''
更新调度分组内挖机可用时间
:param excavator_hold_truck:
:return:
'''
group_excavator_avl_time= {}
for group_id in self.group_set:
excavator_group = self.device_group[group_id][1]
group_excavator_avl_time[group_id] = np.zeros(len(excavator_group))
for excavator_id in excavator_group:
group_excavator_index = self.group_excavator_uuid_to_index_dict[group_id][excavator_id]
excavator_index = self.excavator.excavator_uuid_to_index_dict[excavator_id]
group_excavator_avl_time[group_id][group_excavator_index] = excavator_avl_time[excavator_index]
return group_excavator_avl_time
def update_dump_avl_time(self, dump_avl_time):
'''
更新调度分组内挖机可用时间
:param dump_hold_truck:
:return:
'''
group_dump_avl_time= {}
for group_id in self.group_set:
dump_group = self.device_group[group_id][0]
group_dump_avl_time[group_id] = np.zeros(len(dump_group))
for dump_id in dump_group:
group_dump_index = self.group_dump_uuid_to_index_dict[group_id][dump_id]
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
group_dump_avl_time[group_id][group_dump_index] = dump_avl_time[dump_index]
return group_dump_avl_time
def update_allow_flow_to_excavator(self): def update_allow_flow_to_excavator(self):
group_allow_flow_to_excavator = {} group_allow_flow_to_excavator = {}
...@@ -391,7 +427,11 @@ class Group(WalkManage): ...@@ -391,7 +427,11 @@ class Group(WalkManage):
self.update_device_group() self.update_device_group()
self.update_group_device_map() self.update_group_device_map()
self.update_group_walk_cost() self.update_group_walk_cost()
<<<<<<< HEAD
self.update_group_truck_flow(topo) self.update_group_truck_flow(topo)
=======
# self.update_group_truck_flow()
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
self.update_modify() self.update_modify()
def get_diaptch_truck_group(self): def get_diaptch_truck_group(self):
......
...@@ -85,221 +85,249 @@ global_dict["park_num"] = park_num ...@@ -85,221 +85,249 @@ 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:
def __init__(self): excavator_uuid_to_index_dict = {}
self.excavator_uuid_to_index_dict = {} dump_uuid_to_index_dict = {}
self.dump_uuid_to_index_dict = {} excavator_index_to_uuid_dict = {}
self.excavator_index_to_uuid_dict = {} dump_index_to_uuid_dict = {}
self.dump_index_to_uuid_dict = {}
dump_uuid_to_unload_area_uuid_dict = {}
self.dump_uuid_to_unload_area_uuid_dict = {} excavator_uuid_to_load_area_uuid_dict = {}
self.excavator_uuid_to_load_area_uuid_dict = {} excavator_index_to_load_area_index_dict = {}
self.excavator_index_to_load_area_index_dict = {} dump_index_to_unload_area_index_dict = {}
self.dump_index_to_unload_area_index_dict = {}
truck_uuid_to_index_dict = {}
self.truck_uuid_to_index_dict = {} truck_index_to_uuid_dict = {}
self.truck_index_to_uuid_dict = {}
# def __init__(cls):
def get_excavator_uuid_to_index_dict(self): # cls.excavator_uuid_to_index_dict = {}
return self.excavator_uuid_to_index_dict # cls.dump_uuid_to_index_dict = {}
# cls.excavator_index_to_uuid_dict = {}
def get_dump_uuid_to_index_dict(self): # cls.dump_index_to_uuid_dict = {}
return self.dump_uuid_to_index_dict #
# cls.dump_uuid_to_unload_area_uuid_dict = {}
def get_excavator_index_to_uuid_dict(self): # cls.excavator_uuid_to_load_area_uuid_dict = {}
return self.excavator_index_to_uuid_dict # cls.excavator_index_to_load_area_index_dict = {}
# cls.dump_index_to_unload_area_index_dict = {}
def get_dump_index_to_uuid_dict(self): #
return self.dump_index_to_uuid_dict # cls.truck_uuid_to_index_dict = {}
# cls.truck_index_to_uuid_dict = {}
def get_dump_uuid_to_unload_area_uuid_dict(self):
return self.dump_uuid_to_unload_area_uuid_dict
def get_excavator_uuid_to_load_area_uuid_dict(self):
return self.excavator_uuid_to_load_area_uuid_dict
def get_excavator_index_to_load_area_index_dict(self):
return self.excavator_index_to_load_area_index_dict
def get_dump_index_to_unload_area_index_dict(self):
return self.dump_index_to_unload_area_index_dict
def get_truck_uuid_to_index_dict(self):
return self.truck_uuid_to_index_dict
def get_truck_index_to_uuid_dict(self):
return self.truck_index_to_uuid_dict
def reset(self): # def get_excavator_uuid_to_index_dict(cls):
self.excavator_uuid_to_index_dict = {} # return cls.excavator_uuid_to_index_dict
self.dump_uuid_to_index_dict = {} #
self.excavator_index_to_uuid_dict = {} # def get_dump_uuid_to_index_dict(cls):
self.dump_index_to_uuid_dict = {} # 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
self.dump_uuid_to_unload_area_uuid_dict = {} @classmethod
self.excavator_uuid_to_load_area_uuid_dict = {} def reset(cls):
self.excavator_index_to_load_area_index_dict = {} cls.excavator_uuid_to_index_dict = {}
self.dump_index_to_unload_area_index_dict = {} cls.dump_uuid_to_index_dict = {}
cls.excavator_index_to_uuid_dict = {}
cls.dump_index_to_uuid_dict = {}
self.truck_uuid_to_index_dict = {} cls.dump_uuid_to_unload_area_uuid_dict = {}
self.truck_index_to_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 = {}
def period_map_para_update(self): cls.truck_uuid_to_index_dict = {}
cls.truck_index_to_uuid_dict = {}
self.reset() @classmethod
def period_map_para_update(cls):
cls.reset()
device_map_dict = update_deveices_map( device_map_dict = update_deveices_map(
unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict
) )
self.excavator_uuid_to_index_dict = device_map_dict[ cls.excavator_uuid_to_index_dict = device_map_dict[
"excavator_uuid_to_index_dict" "excavator_uuid_to_index_dict"
] ]
print("device.dump_uuid_to_index_dict") cls.dump_uuid_to_index_dict = device_map_dict["dump_uuid_to_index_dict"]
print(self.dump_uuid_to_index_dict) cls.excavator_index_to_uuid_dict = device_map_dict[
self.dump_uuid_to_index_dict = device_map_dict["dump_uuid_to_index_dict"]
self.excavator_index_to_uuid_dict = device_map_dict[
"excavator_index_to_uuid_dict" "excavator_index_to_uuid_dict"
] ]
self.dump_index_to_uuid_dict = device_map_dict["dump_index_to_uuid_dict"] cls.dump_index_to_uuid_dict = device_map_dict["dump_index_to_uuid_dict"]
self.dump_uuid_to_unload_area_uuid_dict = device_map_dict[ cls.dump_uuid_to_unload_area_uuid_dict = device_map_dict[
"dump_uuid_to_unload_area_uuid_dict" "dump_uuid_to_unload_area_uuid_dict"
] ]
self.excavator_uuid_to_load_area_uuid_dict = device_map_dict[ cls.excavator_uuid_to_load_area_uuid_dict = device_map_dict[
"excavator_uuid_to_load_area_uuid_dict" "excavator_uuid_to_load_area_uuid_dict"
] ]
self.excavator_index_to_load_area_index_dict = device_map_dict[ cls.excavator_index_to_load_area_index_dict = device_map_dict[
"excavator_index_to_load_area_index_dict" "excavator_index_to_load_area_index_dict"
] ]
self.dump_index_to_unload_area_index_dict = device_map_dict[ cls.dump_index_to_unload_area_index_dict = device_map_dict[
"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 = update_truck_uuid_index_map(get_value("dynamic_truck_set"))
self.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"]
self.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(self):
# 装载关系映射
self.excavator_uuid_to_index_dict = device_map.excavator_uuid_to_index_dict
self.dump_uuid_to_index_dict = device_map.dump_uuid_to_index_dict
self.excavator_index_to_uuid_dict = device_map.excavator_index_to_uuid_dict
self.dump_index_to_uuid_dict = device_map.dump_index_to_uuid_dict
self.dump_uuid_to_unload_area_uuid_dict = (
device_map.dump_uuid_to_unload_area_uuid_dict
)
self.excavator_uuid_to_load_area_uuid_dict = (
device_map.excavator_uuid_to_load_area_uuid_dict
)
self.excavator_index_to_load_area_index_dict = (
device_map.excavator_index_to_load_area_index_dict
)
self.dump_index_to_unload_area_index_dict = (
device_map.dump_index_to_unload_area_index_dict
)
self.truck_uuid_to_index_dict = device_map.truck_uuid_to_index_dict # def period_map_para_load(cls):
self.truck_index_to_uuid_dict = device_map.truck_index_to_uuid_dict # # 装载关系映射
# 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__(self): # def __init__(cls):
# # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备 # # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
#
# 路网真实距离 # # 路网真实距离
self.walk_time_to_excavator = np.full( # cls.walk_time_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
(dynamic_dump_num, dynamic_excavator_num), M # 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)
self.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M) # cls.walk_time_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
self.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M) # cls.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
self.walk_time_park_to_load_area = np.full((park_num, load_area_num), M) # cls.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
self.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M) #
self.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M) # # 路网行驶时间
# 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)
self.distance_to_excavator = np.full( # cls.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
(dynamic_dump_num, dynamic_excavator_num), M # 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)
self.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M) # cls.distance_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
self.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
self.distance_park_to_load_area = np.full((park_num, load_area_num), M) # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
self.distance_to_load_area = np.full((unload_area_num, load_area_num), M)
self.distance_to_unload_area = np.full((unload_area_num, load_area_num), M) # 路网真实距离
walk_time_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
def get_walk_time_to_load_area(self): walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
return self.walk_time_to_load_area walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
walk_time_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
def get_walk_time_to_unload_area(self): walk_time_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
return self.walk_time_to_unload_area walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
def get_walk_time_to_excavator(self): # 路网行驶时间
return self.walk_time_to_excavator distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
def get_walk_time_to_dump(self): distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
return self.walk_time_to_dump distance_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
distance_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
def get_walk_time_park_to_load_area(self): distance_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
return self.walk_time_park_to_load_area
# def get_walk_time_to_load_area(cls):
def get_walk_time_park_to_excavator(self): # return cls.walk_time_to_load_area
return self.walk_time_park_to_excavator #
# def get_walk_time_to_unload_area(cls):
def get_distance_to_load_area(self): # return cls.walk_time_to_unload_area
return self.distance_to_load_area #
# def get_walk_time_to_excavator(cls):
def get_distance_to_unload_area(self): # return cls.walk_time_to_excavator
return self.distance_to_unload_area #
# def get_walk_time_to_dump(cls):
def get_distance_to_excavator(self): # return cls.walk_time_to_dump
return self.distance_to_excavator #
# def get_walk_time_park_to_load_area(cls):
def get_distance_to_dump(self): # return cls.walk_time_park_to_load_area
return self.distance_to_dump #
# def get_walk_time_park_to_excavator(cls):
def get_distance_park_to_load_area(self): # return cls.walk_time_park_to_excavator
return self.distance_park_to_load_area #
# def get_distance_to_load_area(cls):
def get_distance_park_to_excavator(self): # return cls.distance_to_load_area
return self.distance_park_to_excavator #
# 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
def reset(self): @classmethod
def reset(cls):
# dynamic_excavator_num # dynamic_excavator_num
# dynamic_dump_num # dynamic_dump_num
# park_num # park_num
# 路网真实距离 # 路网真实距离
self.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
) )
self.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M) cls.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
self.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M) cls.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
self.walk_time_park_to_load_area = np.full((park_num, load_area_num), M) cls.walk_time_park_to_load_area = np.full((park_num, load_area_num), M)
self.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M) cls.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M)
self.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M) cls.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M)
# 路网行驶时间 # 路网行驶时间
self.distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M) cls.distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M)
self.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M) cls.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
self.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M) cls.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
self.distance_park_to_load_area = np.full((park_num, load_area_num), M) cls.distance_park_to_load_area = np.full((park_num, load_area_num), M)
self.distance_to_load_area = np.full((unload_area_num, load_area_num), M) cls.distance_to_load_area = np.full((unload_area_num, load_area_num), M)
self.distance_to_unload_area = np.full((unload_area_num, load_area_num), M) cls.distance_to_unload_area = np.full((unload_area_num, load_area_num), M)
def period_walk_para_update(self): @classmethod
def period_walk_para_update(cls):
self.reset() cls.reset()
self.period_map_para_update() cls.period_map_para_update()
# 计算路网距离及行走时间 # 计算路网距离及行走时间
try: try:
...@@ -309,16 +337,16 @@ class WalkManage(DeviceMap): ...@@ -309,16 +337,16 @@ class WalkManage(DeviceMap):
unload_area = str(item.unload_area_id) unload_area = str(item.unload_area_id)
load_area_index = load_area_uuid_to_index_dict[load_area] load_area_index = load_area_uuid_to_index_dict[load_area]
unload_area_index = unload_area_uuid_to_index_dict[unload_area] unload_area_index = unload_area_uuid_to_index_dict[unload_area]
self.distance_to_load_area[unload_area_index][load_area_index] = float( cls.distance_to_load_area[unload_area_index][load_area_index] = float(
item.to_load_distance item.to_load_distance
) )
self.walk_time_to_load_area[unload_area_index][load_area_index] = float( cls.walk_time_to_load_area[unload_area_index][load_area_index] = float(
60 / 1000 * item.to_load_distance / empty_speed 60 / 1000 * item.to_load_distance / empty_speed
) )
self.distance_to_unload_area[unload_area_index][ cls.distance_to_unload_area[unload_area_index][
load_area_index load_area_index
] = float(item.to_unload_distance) ] = float(item.to_unload_distance)
self.walk_time_to_unload_area[unload_area_index][ cls.walk_time_to_unload_area[unload_area_index][
load_area_index load_area_index
] = float(60 / 1000 * item.to_unload_distance / heavy_speed) ] = float(60 / 1000 * item.to_unload_distance / heavy_speed)
except Exception as es: except Exception as es:
...@@ -329,18 +357,18 @@ class WalkManage(DeviceMap): ...@@ -329,18 +357,18 @@ class WalkManage(DeviceMap):
try: try:
for i in range(dynamic_dump_num): for i in range(dynamic_dump_num):
for j in range(dynamic_excavator_num): for j in range(dynamic_excavator_num):
self.distance_to_excavator[i][j] = self.distance_to_load_area[ cls.distance_to_excavator[i][j] = cls.distance_to_load_area[
self.dump_index_to_unload_area_index_dict[i] cls.dump_index_to_unload_area_index_dict[i]
][self.excavator_index_to_load_area_index_dict[j]] ][cls.excavator_index_to_load_area_index_dict[j]]
self.walk_time_to_excavator[i][j] = self.walk_time_to_load_area[ cls.walk_time_to_excavator[i][j] = cls.walk_time_to_load_area[
self.dump_index_to_unload_area_index_dict[i] cls.dump_index_to_unload_area_index_dict[i]
][self.excavator_index_to_load_area_index_dict[j]] ][cls.excavator_index_to_load_area_index_dict[j]]
self.distance_to_dump[i][j] = self.distance_to_unload_area[ cls.distance_to_dump[i][j] = cls.distance_to_unload_area[
self.dump_index_to_unload_area_index_dict[i] cls.dump_index_to_unload_area_index_dict[i]
][self.excavator_index_to_load_area_index_dict[j]] ][cls.excavator_index_to_load_area_index_dict[j]]
self.walk_time_to_dump[i][j] = self.walk_time_to_unload_area[ cls.walk_time_to_dump[i][j] = cls.walk_time_to_unload_area[
self.dump_index_to_unload_area_index_dict[i] cls.dump_index_to_unload_area_index_dict[i]
][self.excavator_index_to_load_area_index_dict[j]] ][cls.excavator_index_to_load_area_index_dict[j]]
except Exception as es: except Exception as es:
logger.error("设备路网信息异常异常") logger.error("设备路网信息异常异常")
logger.error(es) logger.error(es)
...@@ -351,10 +379,10 @@ class WalkManage(DeviceMap): ...@@ -351,10 +379,10 @@ class WalkManage(DeviceMap):
park_area = str(item.park_area_id) park_area = str(item.park_area_id)
load_area_index = load_area_uuid_to_index_dict[load_area] load_area_index = load_area_uuid_to_index_dict[load_area]
park_index = park_uuid_to_index_dict[park_area] park_index = park_uuid_to_index_dict[park_area]
self.distance_park_to_load_area[park_index][load_area_index] = float( cls.distance_park_to_load_area[park_index][load_area_index] = float(
item.park_load_distance item.park_load_distance
) )
self.walk_time_park_to_load_area[park_index][load_area_index] = float( cls.walk_time_park_to_load_area[park_index][load_area_index] = float(
60 / 1000 * item.park_load_distance / empty_speed 60 / 1000 * item.park_load_distance / empty_speed
) )
except Exception as es: except Exception as es:
...@@ -363,52 +391,23 @@ class WalkManage(DeviceMap): ...@@ -363,52 +391,23 @@ class WalkManage(DeviceMap):
try: try:
for i in range(park_num): for i in range(park_num):
for j in range(dynamic_excavator_num): for j in range(dynamic_excavator_num):
self.distance_park_to_excavator[i][j] = self.distance_park_to_load_area[ cls.distance_park_to_excavator[i][j] = cls.distance_park_to_load_area[
i i
][self.excavator_index_to_load_area_index_dict[j]] ][cls.excavator_index_to_load_area_index_dict[j]]
self.walk_time_park_to_excavator[i][ cls.walk_time_park_to_excavator[i][
j j
] = self.walk_time_park_to_load_area[i][ ] = cls.walk_time_park_to_load_area[i][
self.excavator_index_to_load_area_index_dict[j] cls.excavator_index_to_load_area_index_dict[j]
] ]
except Exception as es: except Exception as es:
logger.error("备停区设备路网信息异常") logger.error("备停区设备路网信息异常")
logger.error(es) logger.error(es)
logger.info("distance_park_to_excavator") logger.info("distance_park_to_excavator")
logger.info(self.distance_park_to_excavator) logger.info(cls.distance_park_to_excavator)
def period_walk_para_load(self):
# 装载路网信息
self.distance_to_load_area = walk_manage.distance_to_load_area
self.distance_to_unload_area = walk_manage.distance_to_unload_area
self.distance_park_to_load_area = walk_manage.distance_park_to_load_area
self.distance_to_excavator = walk_manage.distance_to_excavator
self.distance_to_dump = walk_manage.distance_to_dump
self.distance_park_to_excavator = walk_manage.distance_park_to_excavator
self.walk_time_to_excavator = walk_manage.walk_time_to_excavator
self.walk_time_to_dump = walk_manage.walk_time_to_dump
self.walk_time_park_to_excavator = walk_manage.walk_time_park_to_excavator
self.walk_time_to_load_area = walk_manage.walk_time_to_load_area
self.walk_time_to_unload_area = walk_manage.walk_time_to_unload_area
self.walk_time_park_to_load_area = walk_manage.walk_time_park_to_load_area
device_map = DeviceMap() def global_period_para_update():
walk_manage = WalkManage()
device_map.period_map_para_update()
walk_manage.period_map_para_load()
walk_manage.period_walk_para_update()
def period_para_update():
global load_area_uuid_to_index_dict, load_area_index_to_uuid_dict global load_area_uuid_to_index_dict, load_area_index_to_uuid_dict
global unload_area_uuid_to_index_dict, unload_area_index_to_uuid_dict global unload_area_uuid_to_index_dict, unload_area_index_to_uuid_dict
global load_area_num, unload_area_num, park_num global load_area_num, unload_area_num, park_num
...@@ -471,9 +470,13 @@ def period_para_update(): ...@@ -471,9 +470,13 @@ def period_para_update():
dynamic_dump_set = set(update_autodisp_dump()) dynamic_dump_set = set(update_autodisp_dump())
dynamic_dump_num = len(dynamic_dump_set) dynamic_dump_num = len(dynamic_dump_set)
device_map.period_map_para_update() DeviceMap.reset()
DeviceMap.period_map_para_update()
WalkManage.reset()
walk_manage.period_walk_para_update() WalkManage.period_walk_para_update()
global_dict["dynamic_truck_set"] = dynamic_truck_set global_dict["dynamic_truck_set"] = dynamic_truck_set
global_dict["dynamic_truck_num"] = dynamic_truck_num global_dict["dynamic_truck_num"] = dynamic_truck_num
...@@ -493,9 +496,9 @@ def period_para_update(): ...@@ -493,9 +496,9 @@ def period_para_update():
global_dict["park_uuid_to_index_dict"] = park_uuid_to_index_dict global_dict["park_uuid_to_index_dict"] = park_uuid_to_index_dict
global_dict["park_index_to_uuid_dict"] = park_index_to_uuid_dict global_dict["park_index_to_uuid_dict"] = park_index_to_uuid_dict
global_dict["distance_to_excavator"] = walk_manage.distance_to_excavator global_dict["distance_to_excavator"] = WalkManage.distance_to_excavator
global_dict["distance_park_to_excavator"] = walk_manage.distance_park_to_excavator global_dict["distance_park_to_excavator"] = WalkManage.distance_park_to_excavator
global_dict["distance_to_dump"] = walk_manage.distance_to_dump global_dict["distance_to_dump"] = WalkManage.distance_to_dump
# logger.info("walk_manage_para") # logger.info("walk_manage_para")
# logger.info("distance_to_excavator") # logger.info("distance_to_excavator")
...@@ -515,522 +518,3 @@ def period_para_update(): ...@@ -515,522 +518,3 @@ def period_para_update():
# logger.info(walk_manage.truck_index_to_uuid_dict) # logger.info(walk_manage.truck_index_to_uuid_dict)
# logger.info("walk_manage.dynamic_truck_set") # logger.info("walk_manage.dynamic_truck_set")
# logger.info(dynamic_truck_set) # logger.info(dynamic_truck_set)
# # 全局参数设定
#
# # 空载任务集合
# empty_task_set = [0, 1, 5]
#
# # 重载任务集合
# heavy_task_set = [2, 3, 4]
#
# # # 空载矿卡速度,单位(km/h)
# # global empty_speed
# #
# # empty_speed = 25
# #
# # # 重载矿卡速度,单位(km/h)
# # global heavy_speed
# #
# # heavy_speed = 22
# #
# # # 卸载设备目标卸载量
# # dump_target_mass = 5000
# #
# # # 挖机目标装载量
# # excavator_target_mass = 5000
#
# # 任务集合
# task_set = [-2, 0, 1, 2, 3, 4, 5]
#
# #
# # truck = TruckInfo()
# # excavator = ExcavatorInfo()
# # dump = DumpInfo()
#
# # Big integer
# M = 100000000
#
# # 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# # (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()
#
# # 矿卡集合
# truck_set = set(update_total_truck())
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 动态派车矿卡集合
# # dynamic_truck_set = truck_set.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["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):
# return global_dict[name]
#
# # 设备映射类, 存储除工作区以外的映射关系
# # 其余设备类继承该类
# class DeviceMap:
# def __init__(self):
# self.excavator_uuid_to_index_dict = {}
# self.dump_uuid_to_index_dict = {}
# self.excavator_index_to_uuid_dict = {}
# self.dump_index_to_uuid_dict = {}
#
# self.dump_uuid_to_unload_area_uuid_dict = {}
# self.excavator_uuid_to_load_area_uuid_dict = {}
# self.excavator_index_to_load_area_index_dict = {}
# self.dump_index_to_unload_area_index_dict = {}
#
# self.truck_uuid_to_index_dict = {}
# self.truck_index_to_uuid_dict = {}
#
# def get_excavator_uuid_to_index_dict(self):
# return self.excavator_uuid_to_index_dict
#
# def get_dump_uuid_to_index_dict(self):
# return self.dump_uuid_to_index_dict
#
# def get_excavator_index_to_uuid_dict(self):
# return self.excavator_index_to_uuid_dict
#
# def get_dump_index_to_uuid_dict(self):
# return self.dump_index_to_uuid_dict
#
# def get_dump_uuid_to_unload_area_uuid_dict(self):
# return self.dump_uuid_to_unload_area_uuid_dict
#
# def get_excavator_uuid_to_load_area_uuid_dict(self):
# return self.excavator_uuid_to_load_area_uuid_dict
#
# def get_excavator_index_to_load_area_index_dict(self):
# return self.excavator_index_to_load_area_index_dict
#
# def get_dump_index_to_unload_area_index_dict(self):
# return self.dump_index_to_unload_area_index_dict
#
# def get_truck_uuid_to_index_dict(self):
# return self.truck_uuid_to_index_dict
#
# def get_truck_index_to_uuid_dict(self):
# return self.truck_index_to_uuid_dict
#
# def reset(self):
# self.excavator_uuid_to_index_dict = {}
# self.dump_uuid_to_index_dict = {}
# self.excavator_index_to_uuid_dict = {}
# self.dump_index_to_uuid_dict = {}
#
# self.dump_uuid_to_unload_area_uuid_dict = {}
# self.excavator_uuid_to_load_area_uuid_dict = {}
# self.excavator_index_to_load_area_index_dict = {}
# self.dump_index_to_unload_area_index_dict = {}
#
# self.truck_uuid_to_index_dict = {}
# self.truck_index_to_uuid_dict = {}
#
# def period_map_para_update(self):
#
# self.reset()
#
# device_map_dict = update_deveices_map(
# unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict
# )
#
# self.excavator_uuid_to_index_dict = device_map_dict[
# "excavator_uuid_to_index_dict"
# ]
#
# print("device.dump_uuid_to_index_dict")
# print(self.dump_uuid_to_index_dict)
#
# self.dump_uuid_to_index_dict = device_map_dict["dump_uuid_to_index_dict"]
# self.excavator_index_to_uuid_dict = device_map_dict[
# "excavator_index_to_uuid_dict"
# ]
# self.dump_index_to_uuid_dict = device_map_dict["dump_index_to_uuid_dict"]
#
# self.dump_uuid_to_unload_area_uuid_dict = device_map_dict[
# "dump_uuid_to_unload_area_uuid_dict"
# ]
# self.excavator_uuid_to_load_area_uuid_dict = device_map_dict[
# "excavator_uuid_to_load_area_uuid_dict"
# ]
# self.excavator_index_to_load_area_index_dict = device_map_dict[
# "excavator_index_to_load_area_index_dict"
# ]
# self.dump_index_to_unload_area_index_dict = device_map_dict[
# "dump_index_to_unload_area_index_dict"
# ]
#
# truck_map_dict = update_truck_uuid_index_map(get_value("dynamic_truck_set"))
#
# self.truck_uuid_to_index_dict = truck_map_dict["truck_uuid_to_index_dict"]
#
# self.truck_index_to_uuid_dict = truck_map_dict["truck_index_to_uuid_dict"]
#
# def period_map_para_load(self):
# # 装载关系映射
# self.excavator_uuid_to_index_dict = device_map.excavator_uuid_to_index_dict
# self.dump_uuid_to_index_dict = device_map.dump_uuid_to_index_dict
# self.excavator_index_to_uuid_dict = device_map.excavator_index_to_uuid_dict
# self.dump_index_to_uuid_dict = device_map.dump_index_to_uuid_dict
#
# self.dump_uuid_to_unload_area_uuid_dict = (
# device_map.dump_uuid_to_unload_area_uuid_dict
# )
# self.excavator_uuid_to_load_area_uuid_dict = (
# device_map.excavator_uuid_to_load_area_uuid_dict
# )
# self.excavator_index_to_load_area_index_dict = (
# device_map.excavator_index_to_load_area_index_dict
# )
# self.dump_index_to_unload_area_index_dict = (
# device_map.dump_index_to_unload_area_index_dict
# )
#
# self.truck_uuid_to_index_dict = device_map.truck_uuid_to_index_dict
# self.truck_index_to_uuid_dict = device_map.truck_index_to_uuid_dict
#
#
# # 路网信息类
# class WalkManage(DeviceMap):
# def __init__(self):
# # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
#
# # 路网真实距离
# self.walk_time_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.walk_time_park_to_load_area = np.full((park_num, load_area_num), M)
# self.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# # 路网行驶时间
# self.distance_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.distance_park_to_load_area = np.full((park_num, load_area_num), M)
# self.distance_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.distance_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# def get_walk_time_to_load_area(self):
# return self.walk_time_to_load_area
#
# def get_walk_time_to_unload_area(self):
# return self.walk_time_to_unload_area
#
# def get_walk_time_to_excavator(self):
# return self.walk_time_to_excavator
#
# def get_walk_time_to_dump(self):
# return self.walk_time_to_dump
#
# def get_walk_time_park_to_load_area(self):
# return self.walk_time_park_to_load_area
#
# def get_walk_time_park_to_excavator(self):
# return self.walk_time_park_to_excavator
#
# def get_distance_to_load_area(self):
# return self.distance_to_load_area
#
# def get_distance_to_unload_area(self):
# return self.distance_to_unload_area
#
# def get_distance_to_excavator(self):
# return self.distance_to_excavator
#
# def get_distance_to_dump(self):
# return self.distance_to_dump
#
# def get_distance_park_to_load_area(self):
# return self.distance_park_to_load_area
#
# def get_distance_park_to_excavator(self):
# return self.distance_park_to_excavator
#
# def reset(self):
#
# # dynamic_excavator_num
# # dynamic_dump_num
# # park_num
#
# # 路网真实距离
# self.walk_time_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.walk_time_park_to_load_area = np.full((park_num, load_area_num), M)
# self.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# # 路网行驶时间
# self.distance_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.distance_park_to_load_area = np.full((park_num, load_area_num), M)
# self.distance_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.distance_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# def period_walk_para_update(self):
#
# self.reset()
#
# self.period_map_para_update()
#
# # 计算路网距离及行走时间
# try:
# # 处理距离
# for item in session_postgre.query(WalkTime).all():
# load_area = str(item.load_area_id)
# unload_area = str(item.unload_area_id)
# load_area_index = load_area_uuid_to_index_dict[load_area]
# unload_area_index = unload_area_uuid_to_index_dict[unload_area]
# self.distance_to_load_area[unload_area_index][load_area_index] = float(
# item.to_load_distance
# )
# self.walk_time_to_load_area[unload_area_index][load_area_index] = float(
# 60 / 1000 * item.to_load_distance / empty_speed
# )
# self.distance_to_unload_area[unload_area_index][
# load_area_index
# ] = float(item.to_unload_distance)
# self.walk_time_to_unload_area[unload_area_index][
# load_area_index
# ] = float(60 / 1000 * item.to_unload_distance / heavy_speed)
# except Exception as es:
# logger.error("路网信息异常")
# logger.error(es)
#
# # 计算设备路网距离及行走时间
# try:
# for i in range(dynamic_dump_num):
# for j in range(dynamic_excavator_num):
# self.distance_to_excavator[i][j] = self.distance_to_load_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.walk_time_to_excavator[i][j] = self.walk_time_to_load_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.distance_to_dump[i][j] = self.distance_to_unload_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.walk_time_to_dump[i][j] = self.walk_time_to_unload_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# except Exception as es:
# logger.error("设备路网信息异常异常")
# logger.error(es)
#
# try:
# for item in session_postgre.query(WalkTimePark).all():
# load_area = str(item.load_area_id)
# park_area = str(item.park_area_id)
# load_area_index = load_area_uuid_to_index_dict[load_area]
# park_index = park_uuid_to_index_dict[park_area]
# self.distance_park_to_load_area[park_index][load_area_index] = float(
# item.park_load_distance
# )
# self.walk_time_park_to_load_area[park_index][load_area_index] = float(
# 60 / 1000 * item.park_load_distance / empty_speed
# )
# except Exception as es:
# logger.error("备停区路网信息异常")
# logger.error(es)
# try:
# for i in range(park_num):
# for j in range(dynamic_excavator_num):
# self.distance_park_to_excavator[i][j] = self.distance_park_to_load_area[
# i
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.walk_time_park_to_excavator[i][
# j
# ] = self.walk_time_park_to_load_area[i][
# self.excavator_index_to_load_area_index_dict[j]
# ]
# except Exception as es:
# logger.error("备停区设备路网信息异常")
# logger.error(es)
#
# def period_walk_para_load(self):
# # 装载路网信息
# self.distance_to_load_area = walk_manage.distance_to_load_area
# self.distance_to_unload_area = walk_manage.distance_to_unload_area
# self.distance_park_to_load_area = walk_manage.distance_park_to_load_area
#
# self.distance_to_excavator = walk_manage.distance_to_excavator
# self.distance_to_dump = walk_manage.distance_to_dump
# self.distance_park_to_excavator = walk_manage.distance_park_to_excavator
#
# self.walk_time_to_excavator = walk_manage.walk_time_to_excavator
# self.walk_time_to_dump = walk_manage.walk_time_to_dump
# self.walk_time_park_to_excavator = walk_manage.walk_time_park_to_excavator
#
# self.walk_time_to_load_area = walk_manage.walk_time_to_load_area
# self.walk_time_to_unload_area = walk_manage.walk_time_to_unload_area
# self.walk_time_park_to_load_area = walk_manage.walk_time_park_to_load_area
#
#
# device_map = DeviceMap()
#
# walk_manage = WalkManage()
#
# device_map.period_map_para_update()
#
# walk_manage.period_map_para_load()
#
# walk_manage.period_walk_para_update()
#
#
# def period_para_update():
# global load_area_uuid_to_index_dict, load_area_index_to_uuid_dict
# global unload_area_uuid_to_index_dict, unload_area_index_to_uuid_dict
# global load_area_num, unload_area_num, park_num
# global park_uuid_to_index_dict, park_index_to_uuid_dict
# global truck_uuid_to_name_dict, truck_name_to_uuid_dict
# global dynamic_truck_num, dynamic_excavator_num, dynamic_dump_num
#
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# # (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()
#
# # 矿卡集合
# truck_set = set(update_total_truck())
#
# logger.info("truck_set")
# logger.info(truck_set)
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# logger.info("fixed_truck_set")
# logger.info(fixed_truck_set)
#
# # 动态派车矿卡集合
# # dynamic_truck_set = truck_set.difference(fixed_truck_set)
# dynamic_truck_set = update_dynamic_truck()
#
# dynamic_truck_num = len(dynamic_truck_set)
#
# logger.info("可用于动态派车的矿卡:")
# logger.info(dynamic_truck_num)
# 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)
#
# device_map.period_map_para_update()
#
# walk_manage.period_walk_para_update()
#
# 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
#
# print("walk_manage.distance_to_excavator")
# print(dynamic_dump_num, dynamic_excavator_num)
# print(walk_manage.distance_to_excavator)
#
# print("walk_manage.excavator_dict")
# print(walk_manage.excavator_uuid_to_index_dict)
# print("walk_manage.dump_dict")
# print(walk_manage.dump_uuid_to_index_dict)
#
# global_dict["distance_to_excavator"] = walk_manage.distance_to_excavator
# global_dict["distance_park_to_excavator"] = walk_manage.distance_park_to_excavator
# global_dict["distance_to_dump"] = walk_manage.distance_to_dump
#
# logger.info("walk_manage_para")
# logger.info("distance_to_excavator")
# logger.info(walk_manage.distance_to_excavator)
# logger.info("distance_park_to_excavator")
# logger.info(walk_manage.distance_park_to_excavator)
# logger.info("distance_to_dump")
# logger.info(walk_manage.distance_to_dump)
# logger.info("excavator_uuid_to_index_dict")
# logger.info(walk_manage.excavator_uuid_to_index_dict)
# logger.info("dump_uuid_to_index_dict")
# logger.info(walk_manage.dump_uuid_to_index_dict)
# logger.info("walk_manage.distance_park_to_excavator")
# logger.info(walk_manage.distance_park_to_excavator)
#
# logger.info("walk_manage.truck_index_to_uuid_dict")
# logger.info(walk_manage.truck_index_to_uuid_dict)
# logger.info("walk_manage.dynamic_truck_set")
# logger.info(dynamic_truck_set)
...@@ -69,9 +69,9 @@ class PathPlanner(WalkManage): ...@@ -69,9 +69,9 @@ class PathPlanner(WalkManage):
# weighted_distance = weighted_walk_cost() # weighted_distance = weighted_walk_cost()
# 修正因子 # 修正因子
weight = 60 weight = 10
# 阻塞成本权重 # 阻塞成本权重
alpha = 1 alpha = 0
# 距离成本权重 # 距离成本权重
beta = 1 beta = 1
...@@ -87,9 +87,11 @@ class PathPlanner(WalkManage): ...@@ -87,9 +87,11 @@ class PathPlanner(WalkManage):
if rule2.disabled == 0: if rule2.disabled == 0:
alpha = rule2.rule_weight alpha = rule2.rule_weight
beta /= beta if alpha > 0:
beta /= (beta + 0.001)
alpha = alpha / beta * weight alpha = alpha / beta * weight
else:
beta = 1
try: try:
...@@ -154,18 +156,14 @@ class PathPlanner(WalkManage): ...@@ -154,18 +156,14 @@ class PathPlanner(WalkManage):
def walk_cost_cal(self): def walk_cost_cal(self):
self.excavator.para_period_update() self.excavator.excavator_para_period_update()
self.dump.para_period_update() self.dump.dump_para_period_update()
self.truck.para_period_update(self.dump, self.excavator) self.truck.truck_para_period_update(self.dump, self.excavator)
self.truck.state_period_update() self.truck.state_period_update()
self.period_walk_para_load()
self.period_map_para_load()
# self.controller.period_update(self.dump, self.excavator, self.truck) # self.controller.period_update(self.dump, self.excavator, self.truck)
# 计算行驶成本前,更新路网速度信息 # 计算行驶成本前,更新路网速度信息
...@@ -187,6 +185,9 @@ class PathPlanner(WalkManage): ...@@ -187,6 +185,9 @@ class PathPlanner(WalkManage):
load_area_index = load_area_uuid_to_index_dict[str(walk_time_park.load_area_id)] load_area_index = load_area_uuid_to_index_dict[str(walk_time_park.load_area_id)]
self.cost_park_to_load_area[park_area_index][load_area_index], _ = \ self.cost_park_to_load_area[park_area_index][load_area_index], _ = \
self.path_cost_generate(str(walk_time_park.load_area_id), str(walk_time_park.park_area_id), True) self.path_cost_generate(str(walk_time_park.load_area_id), str(walk_time_park.park_area_id), True)
logger.info(self.cost_park_to_load_area)
logger.info(self.distance_park_to_excavator)
except Exception as es: except Exception as es:
logger.error('路网信息计成本计算异常') logger.error('路网信息计成本计算异常')
logger.error(es) logger.error(es)
...@@ -234,6 +235,7 @@ class PathPlanner(WalkManage): ...@@ -234,6 +235,7 @@ class PathPlanner(WalkManage):
for j in range(get_value("dynamic_excavator_num")): for j in range(get_value("dynamic_excavator_num")):
load_area_index = self.excavator_index_to_load_area_index_dict[j] load_area_index = self.excavator_index_to_load_area_index_dict[j]
self.cost_park_to_excavator[0][j] = self.cost_park_to_load_area[0][load_area_index] / park_walk_weight[0][j] self.cost_park_to_excavator[0][j] = self.cost_park_to_load_area[0][load_area_index] / park_walk_weight[0][j]
print()
logger.info("真实路网距离-驶往挖机:") logger.info("真实路网距离-驶往挖机:")
logger.info(self.distance_to_excavator) logger.info(self.distance_to_excavator)
...@@ -284,25 +286,25 @@ class LaneInfo: ...@@ -284,25 +286,25 @@ class LaneInfo:
def update_truck_loacate(self): def update_truck_loacate(self):
# 读取矿卡所在路段信息 # 读取矿卡所在路段信息
try: # try:
truck_locate_dict = {} truck_locate_dict = {}
device_name_set = redis2.keys() device_name_set = redis2.keys()
for item in device_name_set: for item in device_name_set:
item = item.decode(encoding='utf-8') item = item.decode(encoding='utf-8')
# json_value = json.loads(redis2.get(item)) # json_value = json.loads(redis2.get(item))
key_value_dict = redis2.hgetall(item) key_value_dict = redis2.hgetall(item)
device_type = key_value_dict[str_to_byte('type')] device_type = key_value_dict[str_to_byte('type')]
is_online = key_value_dict[str_to_byte('online')] is_online = key_value_dict[str_to_byte('online')]
key_set = key_value_dict.keys() key_set = key_value_dict.keys()
if (device_type == str_to_byte("1")) \ if (device_type == str_to_byte("1")) \
and (str_to_byte('online') in key_set) \ and (str_to_byte('online') in key_set) \
and (bytes.decode(is_online) in ["true" or "True"]) \ and (bytes.decode(is_online) in ["true" or "True"]) \
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')]
truck_locate_dict[truck_name_to_uuid_dict[item]] = eval(truck_locate) truck_locate_dict[truck_name_to_uuid_dict[item]] = eval(truck_locate)
except Exception as es: # except Exception as es:
logger.error(f'矿卡{item}所在路段信息读取异常') # logger.error(f'矿卡{item}所在路段信息读取异常')
logger.error(es) # logger.error(es)
print("truck_locate_dict") print("truck_locate_dict")
print(truck_locate_dict) print(truck_locate_dict)
...@@ -348,47 +350,45 @@ class LaneInfo: ...@@ -348,47 +350,45 @@ class LaneInfo:
# used lane, 存在行驶矿卡的路段 # used lane, 存在行驶矿卡的路段
tmp_lane_set = [] tmp_lane_set = []
try: # try:
# 初始化 # 初始化
for lane_id in lane_set: for lane_id in lane_set:
self.lane_speed_dict[str(lane_id)] = 0 self.lane_speed_dict[str(lane_id)] = 0
lane_trucks_dict[str(lane_id)] = 0 lane_trucks_dict[str(lane_id)] = 0
# 对于各路段信息
print("truck_locate_dict")
print(truck_locate_dict.keys())
for truck in truck_locate_dict.keys():
lane_id = truck_locate_dict[truck]
logger.info("lane_speed_generate-lane_id")
logger.info(lane_id)
if lane_id in lane_set:
self.lane_speed_dict[truck_locate_dict[truck]] = self.lane_speed_dict[truck_locate_dict[truck]] + \
truck_speed_dict[truck]
# 该路段矿卡数量加一
lane_trucks_dict[truck_locate_dict[truck]] = lane_trucks_dict[truck_locate_dict[truck]] + 1
# 记录存在行驶矿卡的路段
tmp_lane_set.append(lane_id)
# 存在矿卡的路段
print("存在矿卡的路段:")
print(tmp_lane_set)
logger.info("存在矿卡的路段:")
logger.info(tmp_lane_set)
# 对不存在的矿卡路段,实时速度设置为最高
for lane_id in lane_set:
if lane_id not in tmp_lane_set:
self.lane_speed_dict[str(lane_id)] = session_postgre.query(Lane).filter_by(
Id=lane_id).first().MaxSpeed
lane_trucks_dict[str(lane_id)] = 1
# 各路段实时速度取平均
for lane in lane_trucks_dict:
self.lane_speed_dict[lane] = self.lane_speed_dict[lane] / lane_trucks_dict[lane]
except Exception as es: # 对于各路段信息
logger.error("路段实时速度计算异常") print("truck_locate_dict")
logger.error(es) print(truck_locate_dict.keys())
for truck in truck_locate_dict.keys():
lane_id = truck_locate_dict[truck]
logger.info("lane_speed_generate-lane_id")
logger.info(lane_id)
if lane_id in lane_set and truck in truck_speed_dict and truck in truck_locate_dict:
self.lane_speed_dict[truck_locate_dict[truck]] = self.lane_speed_dict[truck_locate_dict[truck]] + \
truck_speed_dict[truck]
# 该路段矿卡数量加一
lane_trucks_dict[truck_locate_dict[truck]] = lane_trucks_dict[truck_locate_dict[truck]] + 1
# 记录存在行驶矿卡的路段
tmp_lane_set.append(lane_id)
# 存在矿卡的路段
logger.info("存在矿卡的路段:")
logger.info(tmp_lane_set)
# 对不存在的矿卡路段,实时速度设置为最高
for lane_id in lane_set:
if lane_id not in tmp_lane_set:
self.lane_speed_dict[str(lane_id)] = session_postgre.query(Lane).filter_by(
Id=lane_id).first().MaxSpeed
lane_trucks_dict[str(lane_id)] = 1
# 各路段实时速度取平均
for lane in lane_trucks_dict:
self.lane_speed_dict[lane] = self.lane_speed_dict[lane] / lane_trucks_dict[lane]
# except Exception as es:
# logger.error("路段实时速度计算异常")
# logger.error(es)
return self.lane_speed_dict return self.lane_speed_dict
......
...@@ -76,7 +76,7 @@ class PriorityController(): ...@@ -76,7 +76,7 @@ class PriorityController():
park_walk_weight = park_walk_weight - (park_walk_weight.min() - 1) park_walk_weight = park_walk_weight - (park_walk_weight.min() - 1)
except Exception as es: except Exception as es:
self.logger.errro(es) self.logger.error(es)
self.logger.error("优先级归一化异常") self.logger.error("优先级归一化异常")
return walk_to_excavator_weight, walk_to_dump_weight, park_walk_weight return walk_to_excavator_weight, walk_to_dump_weight, park_walk_weight
...@@ -152,11 +152,9 @@ class PriorityController(): ...@@ -152,11 +152,9 @@ class PriorityController():
dynamic_excavator_num = get_value("dynamic_excavator_num") dynamic_excavator_num = get_value("dynamic_excavator_num")
walk_available = np.ones((dynamic_dump_num, dynamic_excavator_num)) walk_available = np.ones((dynamic_dump_num, dynamic_excavator_num))
walk_manage.period_walk_para_update()
for dump_index in range(dynamic_dump_num): for dump_index in range(dynamic_dump_num):
for excavator_index in range(dynamic_excavator_num): for excavator_index in range(dynamic_excavator_num):
if walk_manage.distance_to_excavator[dump_index][excavator_index] > M / 2: if WalkManage.distance_to_excavator[dump_index][excavator_index] > M / 2:
walk_available[dump_index][excavator_index] = 0 walk_available[dump_index][excavator_index] = 0
return walk_available return walk_available
...@@ -8,8 +8,6 @@ ...@@ -8,8 +8,6 @@
# 实时调度模块 # 实时调度模块
from traffic_flow.traffic_flow_planner import *
from para_config import * from para_config import *
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
...@@ -23,10 +21,16 @@ from dispatcher import Dispatcher, PreSchedule ...@@ -23,10 +21,16 @@ from dispatcher import Dispatcher, PreSchedule
def process(dispatcher): def process(dispatcher):
# try: # try:
<<<<<<< HEAD
# 更新周期参数 # 更新周期参数
logger.info("#####################################周期更新开始#####################################") logger.info("#####################################周期更新开始#####################################")
period_para_update() period_para_update()
=======
# 更新周期参数
logger.info("#####################################周期更新开始#####################################")
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0: if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0:
raise Exception("无动态派车计划可用") raise Exception("无动态派车计划可用")
return return
...@@ -43,7 +47,11 @@ def process(dispatcher): ...@@ -43,7 +47,11 @@ def process(dispatcher):
session_postgre.flush() session_postgre.flush()
# 周期更新 # 周期更新
<<<<<<< HEAD
dispatcher.dispatcher_period_update(topo) dispatcher.dispatcher_period_update(topo)
=======
dispatcher.dispatcher_period_update()
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
# try: # try:
...@@ -92,7 +100,7 @@ if __name__ == "__main__": ...@@ -92,7 +100,7 @@ if __name__ == "__main__":
logger = get_logger("zxt.main") logger = get_logger("zxt.main")
# 全局参数更新 # 全局参数更新
period_para_update() global_period_para_update()
# 实例化设备对象 # 实例化设备对象
dump = DumpInfo() dump = DumpInfo()
...@@ -119,4 +127,4 @@ if __name__ == "__main__": ...@@ -119,4 +127,4 @@ if __name__ == "__main__":
logger.info(" ") logger.info(" ")
logger.info("调度系统启动") logger.info("调度系统启动")
main(10, dispatcher) main(30, dispatcher)
...@@ -48,6 +48,7 @@ dump_target_mass = para_config["dump_target_mass"] ...@@ -48,6 +48,7 @@ dump_target_mass = para_config["dump_target_mass"]
excavator_target_mass = para_config["excavator_target_mass"] excavator_target_mass = para_config["excavator_target_mass"]
<<<<<<< HEAD
# def set_log(): # def set_log():
# #
# # 创建日志 # # 创建日志
...@@ -80,6 +81,40 @@ excavator_target_mass = para_config["excavator_target_mass"] ...@@ -80,6 +81,40 @@ excavator_target_mass = para_config["excavator_target_mass"]
# def get_logger(module_name): # def get_logger(module_name):
# logger = logging.getLogger(module_name) # logger = logging.getLogger(module_name)
# return logger # return logger
=======
def set_log():
# 创建日志
########################################################################################################################
# 日志存储地址
log_path = para_config["log_path"]
# 创建日志目录
if not os.path.exists(log_path):
os.mkdir(log_path)
# logging初始化工作
logging.basicConfig()
logger = logging.getLogger("zxt")
logger.setLevel(logging.INFO)
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
# filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=3*1024*1024, backupCount=10)
filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log"
formatter = logging.Formatter("%(asctime)s - %(name)s: %(levelname)s %(filename)s %(message)s")
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
def get_logger(module_name):
logger = logging.getLogger(module_name)
return logger
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
# 连接reids # 连接reids
......
...@@ -39,6 +39,7 @@ with open(json_file) as f: ...@@ -39,6 +39,7 @@ with open(json_file) as f:
with open(json_file) as f: with open(json_file) as f:
postgre_config = json.load(f)["postgresql"] postgre_config = json.load(f)["postgresql"]
<<<<<<< HEAD
with open(json_file) as f: with open(json_file) as f:
redis_config = json.load(f)["redis"] redis_config = json.load(f)["redis"]
...@@ -80,6 +81,9 @@ json_file = "config.json" ...@@ -80,6 +81,9 @@ json_file = "config.json"
logger = get_logger("zxt.tables") logger = get_logger("zxt.tables")
=======
# logger = get_logger("zxt.tables")
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
# # 创建对象的基类: # # 创建对象的基类:
# Base = declarative_base() # Base = declarative_base()
...@@ -161,8 +165,9 @@ try: ...@@ -161,8 +165,9 @@ try:
session_postgre.expire_on_commit = False session_postgre.expire_on_commit = False
except Exception as es: except Exception as es:
logger.error("数据库连接失败") # logger.error("数据库连接失败")
logger.error(es) # logger.error(es)
pass
# 定义对象: # 定义对象:
......
...@@ -53,11 +53,6 @@ class Traffic_flow(WalkManage): ...@@ -53,11 +53,6 @@ class Traffic_flow(WalkManage):
# 更新实际交通流 # 更新实际交通流
def update_actual_traffic_flow(self): def update_actual_traffic_flow(self):
# 装载周期参数
self.period_map_para_load()
self.period_walk_para_load()
loading_task_time = self.excavator.get_loading_task_time() loading_task_time = self.excavator.get_loading_task_time()
unloading_task_time = self.dump.get_unloading_task_time() unloading_task_time = self.dump.get_unloading_task_time()
...@@ -231,6 +226,10 @@ class Traffic_para(WalkManage): ...@@ -231,6 +226,10 @@ class Traffic_para(WalkManage):
rule4 = session_mysql.query(DispatchRule).filter_by(id=4).first() rule4 = session_mysql.query(DispatchRule).filter_by(id=4).first()
if not rule4.disabled: if not rule4.disabled:
for excavator_index in range(len(self.excavator_index_to_uuid_dict)): for excavator_index in range(len(self.excavator_index_to_uuid_dict)):
logger.debug("extract_excavator_info-excavator_index")
logger.debug(excavator_index)
logger.debug("extract_excavator_info-excavator_id")
logger.debug(self.excavator_index_to_uuid_dict[excavator_index])
load_ability = session_mysql.query(EquipmentSpec.mining_abililty).\ load_ability = session_mysql.query(EquipmentSpec.mining_abililty).\
join(Equipment, Equipment.equipment_spec == EquipmentSpec.id).\ join(Equipment, Equipment.equipment_spec == EquipmentSpec.id).\
filter(Equipment.id == self.excavator_index_to_uuid_dict[excavator_index]).first() filter(Equipment.id == self.excavator_index_to_uuid_dict[excavator_index]).first()
...@@ -319,10 +318,6 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu ...@@ -319,10 +318,6 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
tra_para = Traffic_para(num_of_load_area, num_of_unload_area, num_of_excavator, num_of_dump, truck,topo) tra_para = Traffic_para(num_of_load_area, num_of_unload_area, num_of_excavator, num_of_dump, truck,topo)
tra_para.period_map_para_load()
tra_para.period_walk_para_load()
tra_para.extract_excavator_info() tra_para.extract_excavator_info()
tra_para.extract_dump_info() tra_para.extract_dump_info()
......
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