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

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

parent 8ec9eb1f
......@@ -41,4 +41,13 @@ Changelog for package Dispatch
[fix ]:
[TODO ]:
[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 @@
from para_config import *
from equipment.truck import TruckInfo
from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo
class ScheduleAlg(WalkManage):
""" class for the schedule algorithm.
......@@ -19,13 +22,15 @@ class ScheduleAlg(WalkManage):
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._excavator = excavator
self._truck = truck
self._group = group
# 获取日志器
self.logger = get_logger("zxt.alg")
# 行程预测对象
self._pre_sch = pre_sch
def truck_schedule(self, current_truck, alg):
"""
......@@ -35,27 +40,43 @@ class ScheduleAlg(WalkManage):
: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:
return None
else:
return None
except Exception as es:
self.logger.error("调度算法计算异常")
self.logger.error(es)
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
truck_id = current_truck.get_truck_id()
group_id = current_truck.get_group_id()
task = current_truck.get_task()
......@@ -70,7 +91,7 @@ class ScheduleAlg(WalkManage):
################################################ 矿卡启动 ###############################################
try:
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:
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
......@@ -87,7 +108,7 @@ class ScheduleAlg(WalkManage):
try:
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:
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
......@@ -104,7 +125,7 @@ class ScheduleAlg(WalkManage):
try:
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:
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
......@@ -119,6 +140,151 @@ class ScheduleAlg(WalkManage):
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):
#
# traffic_value = None
......@@ -324,4 +490,4 @@ class ScheduleAlg(WalkManage):
self.logger.info(f'饱和度价值 {saturation_value}')
# self.logger.info(saturation_value)
return saturation_value
\ No newline at end of file
return saturation_value
{
"para": {
<<<<<<< HEAD
"log_path": "/Users/guoao/Desktop/work_log/wek33/integrated-scheduling-v3-master/dispatch",
=======
"log_path": "E:\\Pycharm Projects\\Waytous\\",
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
"empty_speed": 25,
"heavy_speed": 22,
"dump_target_mass": 5000,
......@@ -9,7 +13,7 @@
},
"mysql": {
"host": "192.168.28.111",
"host": "192.168.9.152",
"port": "3306",
"user": "root",
"password": "Huituo@123",
......@@ -17,7 +21,7 @@
},
"postgresql": {
"host": "192.168.28.111",
"host": "192.168.9.152",
"port": "5432",
"user": "postgres",
"password": "Huituo@123",
......@@ -25,7 +29,7 @@
},
"redis": {
"host": "192.168.28.111",
"host": "192.168.9.152",
"password": "Huituo@123"
}
}
......@@ -14,6 +14,19 @@ from algorithm import ScheduleAlg
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):
self._truck_id = truck_id
self._group_id = group_id
......@@ -168,7 +181,8 @@ class Dispatcher(WalkManage):
# 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)
......@@ -182,31 +196,28 @@ class Dispatcher(WalkManage):
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")
def dispatcher_period_update(self,topo):
# 装载映射参数及
self.period_map_para_load()
self.period_walk_para_load()
global_period_para_update()
# 更新卸载设备对象
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.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()
......@@ -265,6 +276,7 @@ class Dispatcher(WalkManage):
################################################ 矿卡启动 ###############################################
try:
self.logger.info(datetime.now())
self.logger.info("矿卡状态:矿卡启动或故障恢复")
self.logger.info("矿卡行程:无")
self.logger.info(f"涉及挖机:{list(self.excavator.excavator_uuid_to_index_dict.keys())}")
......@@ -276,44 +288,61 @@ class Dispatcher(WalkManage):
self.logger.error(f"矿卡{truck_id}状态不匹配")
self.logger.error(es)
# try:
# 1. 绑定调度
if truck_id in self.truck.truck_excavator_bind:
self.logger.info("绑定调度")
target = self.excavator.excavator_uuid_to_index_dict[self.truck.truck_excavator_bind[truck_id]]
try:
# 1. 绑定调度
if truck_id in self.truck.truck_excavator_bind:
self.logger.info("绑定调度")
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. 正常调度
elif rule3 and rule4:
self.logger.info("正常调度")
target = np.argmin(
transport_value
+ 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(
transport_value
+ excavator_exclude_modify)
target = self.excavator.excavator_uuid_to_index_dict[
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
# 3. 启用饱和度调度
else:
self.logger.info("饱和度调度")
self.logger.info(f'行驶成本-含拥堵度的路径长度 {self.excavator.excavator_uuid_to_index_dict}')
# saturation_value = self._schedule_alg.saturation_schedule(current_truck)
# 3. 启用饱和度调度
else:
self.logger.info("饱和度调度")
saturation_value = self._schedule_alg.truck_schedule(current_truck, "saturation")
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[
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
except Exception as es:
self.logger.error(f"矿卡{truck_id}调度指令生成异常")
self.logger.error(es)
self.logger.info(self.excavator.excavator_uuid_to_index_dict)
self.logger.info(self.group.group_excavator_uuid_to_index_dict)
......@@ -345,45 +374,54 @@ class Dispatcher(WalkManage):
self.logger.info("矿卡行程信息异常")
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. 正常调度
elif rule3 and rule4:
try:
# 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")
self.logger.info(f'行驶成本-含拥堵度的路径长度 {transport_value}')
dump_material_bind_modify = self.group.group_dump_material_bind_modify[truck_id]
self.logger.info(f'卸点物料禁止因子 {dump_material_bind_modify}')
dump_material_bind_modify = self.group.group_dump_material_bind_modify[truck_id]
self.logger.info(f'卸点物料禁止因子 {dump_material_bind_modify}')
target = np.argmin(transport_value.T + 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[
self.group.group_dump_index_to_uuid_dict[group_id][target]]
# 3. 饱和度调度
else:
# 卸载点处理能力及产量约束 or 电铲采装能力及产量约束 启用
# 3. 饱和度调度
else:
self.logger.info("饱和度调度")
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[
self.group.group_dump_index_to_uuid_dict[group_id][target]]
except Exception as es:
self.logger.error(f"矿卡{truck_id}调度指令生成异常")
self.logger.error(es)
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]]}")
......@@ -431,7 +469,7 @@ class Dispatcher(WalkManage):
elif rule3 and rule4:
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}')
excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id]
......@@ -461,11 +499,11 @@ class Dispatcher(WalkManage):
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
except Exception as es:
self.logger.error("trip出错1")
self.logger.error(f"矿卡{truck_id}调度指令生成异常")
self.logger.info(es)
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("==========================================================")
......@@ -589,8 +627,8 @@ class Dispatcher(WalkManage):
item = (
session_mysql.query(Dispatch)
.filter_by(dump_id=self.dump.dump_index_to_uuid_dict[Seq[i][1]],
exactor_id=self.excavator.excavator_index_to_uuid_dict[Seq[i][0]],
.filter_by(dump_id=DeviceMap.dump_index_to_uuid_dict[Seq[i][1]],
exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
......@@ -609,8 +647,8 @@ class Dispatcher(WalkManage):
elif task in heavy_task_set:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=self.excavator.excavator_index_to_uuid_dict[Seq[i][1]],
dump_id=self.dump.dump_index_to_uuid_dict[Seq[i][0]],
.filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]],
dump_id=DeviceMap.dump_index_to_uuid_dict[Seq[i][0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
......@@ -630,11 +668,15 @@ class Dispatcher(WalkManage):
try:
item = (
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,
group_id=group_id,
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.id, item.truck_id, item.exactor_id, item.dump_id)
except Exception as es:
......@@ -683,7 +725,7 @@ class PreSchedule:
Description:
Calculate and update the prediction item.
复杂处理所有预测项的计算与更新
负责处理所有预测项的计算与更新
基于矿卡最近一次装卸载时间预测其抵达目的地时间
根据矿卡请求队列及抵达信息,计算设备最早可用时间
......@@ -711,6 +753,8 @@ class PreSchedule:
# 卡车完成装载及卸载时间(矿卡可用时间)
self.truck_avl_time = np.zeros(self.truck.get_truck_num())
self.logger = get_logger("zxt.pre_schedule")
def update_truck_reach_time(self):
"""
更新矿卡预计抵达目的地时间
......@@ -733,9 +777,13 @@ class PreSchedule:
excavator_avl_ls = [[] for _ in range(dynamic_excavator_num)]
dump_avl_ls = [[] for _ in range(dumps)]
self.logger.info("update_truck_reach_time-trucks")
self.logger.info(trucks)
for i in range(trucks):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]]
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]:
reach_time = truck_reach_excavator[i]
excavator_avl_ls[end_area_index].append(
......@@ -784,6 +832,8 @@ class PreSchedule:
)
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:
reach_ls = np.array(reach_ls)
tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)]
......@@ -886,24 +936,33 @@ class PreSchedule:
dump_avl_time = self.update_dump_avl_time(dump_avl_ls)
return dump_avl_time
def get_excavator_avl_time(self):
def get_excavator_avl_time(self, excavator_id=None):
"""
获取挖机最早可用时间
:param excavator_id: 挖机编号uuid
:return:
excavator_avl_time: (array) 各挖机完成所有已分配矿卡装载的时间
"""
self._reset()
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:
truck_avl_time: (array) 各矿卡完成当前装载或卸载任务的时间
:param truck_id: 矿卡编号uuid
:return: truck_avl_time: (array) 各矿卡完成当前装载或卸载任务的时间
"""
self._reset()
excavator_avl_ls, dump_avl_ls = self.update_truck_reach_time()
self.update_excavator_avl_time(excavator_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):
# 卸点卸载能力
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.para_period_update()
# # 参数初始化
# self.dump_para_period_update()
def get_unloading_time(self):
......@@ -89,7 +85,7 @@ class DumpInfo(WalkManage):
# except Exception as es:
# self.logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
# 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]])
# 更新卸载设备出入时间
......@@ -127,7 +123,7 @@ class DumpInfo(WalkManage):
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
self.dump_material[dump_id] = dump_material_id
except Exception as es:
self.logger.error("无动态派车计划可用")
self.logger.error("卸点物料更新异常")
self.logger.error(es)
def update_dump_priority(self):
......@@ -136,10 +132,14 @@ class DumpInfo(WalkManage):
try:
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]
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()
self.dump_priority_coefficient[self.dump_uuid_to_index_dict[dump_id]] += item.Priority
except Exception as es:
self.logger.error("无动态派车计划可用")
self.logger.error("卸点优先级更新异常")
self.logger.error(es)
def update_unload_ability(self):
......@@ -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_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:
# raise Exception("卸载点卸载能力异常")
if unload_ability < 200:
raise Exception("卸载点卸载能力异常")
else:
self.dump_strength = np.full(self.dynamic_dump_num, 5000)
......@@ -179,7 +179,7 @@ class DumpInfo(WalkManage):
# 卸点卸载能力
self.dump_strength = np.zeros(self.dynamic_dump_num)
def para_period_update(self):
def dump_para_period_update(self):
self.reset()
......@@ -187,11 +187,6 @@ class DumpInfo(WalkManage):
self.logger.info("Dump update!")
# 装载周期参数
self.period_map_para_load()
self.period_walk_para_load()
# 计算平均卸载时间
self.update_dump_unloadtime()
......
......@@ -36,15 +36,11 @@ class ExcavatorInfo(WalkManage):
# 挖机装载能力
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.para_period_update()
#
# # 参数初始化
# self.excavator_para_period_update()
def get_loading_time(self):
return self.loading_time
......@@ -87,7 +83,7 @@ class ExcavatorInfo(WalkManage):
self.logger.info(self.loading_time)
self.logger.info("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):
......@@ -208,7 +204,7 @@ class ExcavatorInfo(WalkManage):
# 挖机装载能力
self.excavator_strength = np.zeros(get_value("dynamic_excavator_num"))
def para_period_update(self):
def excavator_para_period_update(self):
self.reset()
......@@ -219,14 +215,8 @@ class ExcavatorInfo(WalkManage):
self.logger.info("物料优先级规则")
self.logger.info(rule7)
# 装载周期参数
self.period_map_para_load()
print("truck.excavator_uuid_index_dict")
print(self.excavator_uuid_to_index_dict)
self.period_walk_para_load()
# # 用于动态调度的挖机设备
# self.dynamic_excavator_set = set(update_autodisp_excavator())
#
......
......@@ -12,8 +12,6 @@ from equipment.excavator import ExcavatorInfo
from typing import List
# 矿卡设备类
class TruckInfo(WalkManage):
def __init__(self, dump, excavator):
......@@ -71,20 +69,17 @@ class TruckInfo(WalkManage):
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.period_map_para_load()
self.period_walk_para_load()
# 日志
self.logger = get_logger("zxt.truck")
# 初始化读取参数
self.para_period_update(dump, excavator)
# # 初始化读取参数
# self.truck_para_period_update(dump, excavator)
# # 矿卡所属group
# self.truck_group = {}
# 矿卡禁用列表
self.truck_disable_list = []
# 对象域
self.dump = dump
self.excavator = excavator
self._dump = dump
self._excavator = excavator
def get_truck_current_trip(self):
return self.truck_current_trip
......@@ -132,13 +127,6 @@ class TruckInfo(WalkManage):
self.truck_current_task = {}
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:
try:
item = item.decode(encoding="utf-8")
......@@ -264,8 +252,8 @@ class TruckInfo(WalkManage):
def update_truck_trip(self):
walk_time_to_load_area = walk_manage.get_walk_time_to_load_area()
walk_time_to_unload_area = walk_manage.get_walk_time_to_unload_area()
walk_time_to_load_area = WalkManage.walk_time_to_load_area
walk_time_to_unload_area = WalkManage.walk_time_to_unload_area
# 初始化矿卡行程, -1代表备停区
self.truck_current_trip = np.full((self.dynamic_truck_num, 2), -1)
......@@ -287,77 +275,91 @@ class TruckInfo(WalkManage):
self.logger.error(es)
continue
# try:
# 若矿卡状态为空运
if task in empty_task_set:
last_unload_time = self.relative_last_unload_time[
self.truck_index_to_uuid_dict[i]
]
# 开始区域id
start_area_id = self.dump_uuid_to_unload_area_uuid_dict[
item.dump_id
]
# 开始区域序号
start_area_index = unload_area_uuid_to_index_dict[start_area_id]
end_area_id = self.excavator_uuid_to_load_area_uuid_dict[
item.exactor_id
]
# # 结束设备index
# end_eqp_index = self.excavator_uuid_to_index_dict[item.exactor_id]
end_area_index = load_area_uuid_to_index_dict[end_area_id]
self.truck_current_trip[i] = [
self.dump_uuid_to_index_dict[item.dump_id],
self.excavator_uuid_to_index_dict[item.exactor_id],
]
self.cur_truck_reach_excavator[i] = (
last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index]
)
try:
# 若矿卡状态为空运
if task in empty_task_set:
last_unload_time = self.relative_last_unload_time[
self.truck_index_to_uuid_dict[i]
]
if item.dump_id in DeviceMap.dump_uuid_to_unload_area_uuid_dict:
start_area_id = self.dump_uuid_to_unload_area_uuid_dict[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 = -1
start_eq_index = -1
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]
end_area_index = load_area_uuid_to_index_dict[end_area_id]
end_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
end_area_index = -1
end_eq_index = -1
self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.cur_truck_reach_excavator[i] = (
last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index]
)
# # 目的地矿卡数加一
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
# 若矿卡状态为重载
elif task in heavy_task_set:
# print("读取重载行程")
# print(item.exactor_id, item.dump_id)
last_load_time = self.relative_last_load_time[
self.truck_index_to_uuid_dict[i]
]
# 开始区域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]
# 结束区域id
end_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
# 结束区域序号
end_area_index = unload_area_uuid_to_index_dict[end_area_id]
# # 结束设备index
# end_eqp_index = self.dump_uuid_to_index_dict[item.dump_id]
self.truck_current_trip[i] = [
self.excavator_uuid_to_index_dict[item.exactor_id],
self.dump_uuid_to_index_dict[item.dump_id],
]
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_unload_time')
self.logger.info(last_unload_time)
self.logger.info(f'update_truck_trip-walk_time_to_load_area')
self.logger.info(walk_time_to_load_area[start_area_index][end_area_index])
# # 目的地矿卡数加一
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
# 若矿卡状态为重载
elif task in heavy_task_set:
# print("读取重载行程")
# print(item.exactor_id, item.dump_id)
last_load_time = self.relative_last_load_time[
self.truck_index_to_uuid_dict[i]
]
if item.exactor_id in DeviceMap.excavator_uuid_to_load_area_uuid_dict:
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]
start_eq_index = self.excavator_uuid_to_index_dict[item.exactor_id]
else:
start_area_index = -1
start_eq_index = -1
if item.dump_id in DeviceMap.dump_uuid_to_index_dict:
end_area_id = self.dump_uuid_to_unload_area_uuid_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]
else:
end_area_index = -1
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.dump_hold_truck_num[end_eqp_index] = self.dump_hold_truck_num[end_eqp_index] + 1
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
else:
# 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)
self.logger.info(f'update_truck_trip-{truck_id}-last_load_time')
self.logger.info(last_load_time)
self.logger.info(f'update_truck_trip-walk_time_to_unload_area')
self.logger.info(walk_time_to_unload_area[end_area_index][start_area_index])
# 目的地矿卡数加一
# self.dump_hold_truck_num[end_eqp_index] = self.dump_hold_truck_num[end_eqp_index] + 1
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
else:
# 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)
......@@ -366,8 +368,8 @@ class TruckInfo(WalkManage):
# print(self.excavator_hold_truck_num)
self.truck_current_trip.flatten()
# print("当前矿卡行程:")
# print(self.truck_current_trip)
print("当前矿卡行程:")
print(self.truck_current_trip)
def update_eqp_hold_truck(self):
......@@ -547,8 +549,8 @@ class TruckInfo(WalkManage):
if truck_id in self.truck_excavator_bind:
excavator_id = self.truck_excavator_bind[truck_id]
# print(self.excavator.excavator_material)
excavator_material_id = self.excavator.excavator_material[excavator_id]
# print(self._excavator.excavator_material)
excavator_material_id = self._excavator.excavator_material[excavator_id]
self.truck_material_bind[truck_id] = excavator_material_id
for truck_id in self.dynamic_truck_set:
......@@ -560,14 +562,14 @@ class TruckInfo(WalkManage):
material = self.truck_material_bind[truck_id]
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]
print(truck_index, excavator_index)
if excavator_material_id != material:
self.excavator_material_bind_modify[truck_index][excavator_index] = 1000000
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]
if dump_material_id != material:
self.dump_material_bind_modify[truck_index][dump_index] = 1000000
......@@ -633,7 +635,7 @@ class TruckInfo(WalkManage):
self.dump = dump
self.excavator = excavator
def para_period_update(self, dump, excavator):
def truck_para_period_update(self, dump, excavator):
# 初始化参数
self.truck_reset(dump, excavator)
......@@ -705,11 +707,6 @@ class TruckInfo(WalkManage):
self.logger.info("Para truck update!")
# 装载周期参数
self.period_map_para_update()
self.period_walk_para_update()
# 更新有效载重
self.update_truck_payload()
......
......@@ -114,7 +114,7 @@ class Group(WalkManage):
print(truck_current_task)
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]
start_area_index = truck_current_trip[i][0]
......@@ -122,8 +122,6 @@ class Group(WalkManage):
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])
# logger.info("debug2")
if task in empty_task_set:
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])
......@@ -181,16 +179,16 @@ class Group(WalkManage):
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]
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] = \
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] = \
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] = \
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_excavator_traffic_flow[group_id] = local_opt_goto_excavator_traffic_flow
......@@ -204,7 +202,6 @@ class Group(WalkManage):
logger.info(self.group_opt_goto_dump_traffic_flow)
logger.info(self.group_opt_goto_excavator_traffic_flow)
def update_group_walk_cost(self):
# 更新调度分组路网行驶成本
......@@ -217,7 +214,7 @@ class Group(WalkManage):
dump_group = self.device_group[group_id][0]
excavator_group = self.device_group[group_id][1]
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)))
for excavator_id in excavator_group:
for dump_id in dump_group:
......@@ -226,16 +223,19 @@ class Group(WalkManage):
print("dump_group")
print(dump_group)
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] = \
walk_to_dump_cost[self.dump.dump_uuid_to_index_dict[dump_id]][self.excavator.excavator_uuid_to_index_dict[excavator_id]]
local_walk_to_dump_cost[excavator_group_index][dump_group_index] = \
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 excavator_id in excavator_group:
excavator_group_index = self.group_excavator_uuid_to_index_dict[group_id][excavator_id]
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_dump_cost[group_id] = local_walk_to_dump_cost
......@@ -358,6 +358,42 @@ class Group(WalkManage):
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):
group_allow_flow_to_excavator = {}
......@@ -391,7 +427,11 @@ class Group(WalkManage):
self.update_device_group()
self.update_group_device_map()
self.update_group_walk_cost()
<<<<<<< HEAD
self.update_group_truck_flow(topo)
=======
# self.update_group_truck_flow()
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
self.update_modify()
def get_diaptch_truck_group(self):
......
......@@ -85,221 +85,249 @@ 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
excavator_uuid_to_index_dict = {}
dump_uuid_to_index_dict = {}
excavator_index_to_uuid_dict = {}
dump_index_to_uuid_dict = {}
dump_uuid_to_unload_area_uuid_dict = {}
excavator_uuid_to_load_area_uuid_dict = {}
excavator_index_to_load_area_index_dict = {}
dump_index_to_unload_area_index_dict = {}
truck_uuid_to_index_dict = {}
truck_index_to_uuid_dict = {}
# def __init__(cls):
# cls.excavator_uuid_to_index_dict = {}
# cls.dump_uuid_to_index_dict = {}
# cls.excavator_index_to_uuid_dict = {}
# cls.dump_index_to_uuid_dict = {}
#
# cls.dump_uuid_to_unload_area_uuid_dict = {}
# cls.excavator_uuid_to_load_area_uuid_dict = {}
# cls.excavator_index_to_load_area_index_dict = {}
# cls.dump_index_to_unload_area_index_dict = {}
#
# cls.truck_uuid_to_index_dict = {}
# cls.truck_index_to_uuid_dict = {}
def 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 = {}
# def get_excavator_uuid_to_index_dict(cls):
# return cls.excavator_uuid_to_index_dict
#
# def get_dump_uuid_to_index_dict(cls):
# return cls.dump_uuid_to_index_dict
#
# def get_excavator_index_to_uuid_dict(cls):
# return cls.excavator_index_to_uuid_dict
#
# def get_dump_index_to_uuid_dict(cls):
# return cls.dump_index_to_uuid_dict
#
# def get_dump_uuid_to_unload_area_uuid_dict(cls):
# return cls.dump_uuid_to_unload_area_uuid_dict
#
# def get_excavator_uuid_to_load_area_uuid_dict(cls):
# return cls.excavator_uuid_to_load_area_uuid_dict
#
# def get_excavator_index_to_load_area_index_dict(cls):
# return cls.excavator_index_to_load_area_index_dict
#
# def get_dump_index_to_unload_area_index_dict(cls):
# return cls.dump_index_to_unload_area_index_dict
#
# def get_truck_uuid_to_index_dict(cls):
# return cls.truck_uuid_to_index_dict
#
# def get_truck_index_to_uuid_dict(cls):
# return cls.truck_index_to_uuid_dict
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 = {}
@classmethod
def reset(cls):
cls.excavator_uuid_to_index_dict = {}
cls.dump_uuid_to_index_dict = {}
cls.excavator_index_to_uuid_dict = {}
cls.dump_index_to_uuid_dict = {}
self.truck_uuid_to_index_dict = {}
self.truck_index_to_uuid_dict = {}
cls.dump_uuid_to_unload_area_uuid_dict = {}
cls.excavator_uuid_to_load_area_uuid_dict = {}
cls.excavator_index_to_load_area_index_dict = {}
cls.dump_index_to_unload_area_index_dict = {}
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(
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"
]
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[
cls.dump_uuid_to_index_dict = device_map_dict["dump_uuid_to_index_dict"]
cls.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"]
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"
]
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"
]
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"
]
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"
]
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"]
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
)
cls.truck_index_to_uuid_dict = truck_map_dict["truck_index_to_uuid_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
# def period_map_para_load(cls):
# # 装载关系映射
# cls.excavator_uuid_to_index_dict = device_map.excavator_uuid_to_index_dict
# cls.dump_uuid_to_index_dict = device_map.dump_uuid_to_index_dict
# cls.excavator_index_to_uuid_dict = device_map.excavator_index_to_uuid_dict
# cls.dump_index_to_uuid_dict = device_map.dump_index_to_uuid_dict
#
# cls.dump_uuid_to_unload_area_uuid_dict = (
# device_map.dump_uuid_to_unload_area_uuid_dict
# )
# cls.excavator_uuid_to_load_area_uuid_dict = (
# device_map.excavator_uuid_to_load_area_uuid_dict
# )
# cls.excavator_index_to_load_area_index_dict = (
# device_map.excavator_index_to_load_area_index_dict
# )
# cls.dump_index_to_unload_area_index_dict = (
# device_map.dump_index_to_unload_area_index_dict
# )
#
# cls.truck_uuid_to_index_dict = device_map.truck_uuid_to_index_dict
# cls.truck_index_to_uuid_dict = device_map.truck_index_to_uuid_dict
# 路网信息类
class WalkManage(DeviceMap):
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 __init__(cls):
# # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
#
# # 路网真实距离
# cls.walk_time_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
# cls.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# cls.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
#
# # 路网行驶时间
# cls.distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
# cls.distance_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# cls.distance_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
# 路网真实距离
walk_time_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
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)
walk_time_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# 路网行驶时间
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)
distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
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)
distance_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# def get_walk_time_to_load_area(cls):
# return cls.walk_time_to_load_area
#
# def get_walk_time_to_unload_area(cls):
# return cls.walk_time_to_unload_area
#
# def get_walk_time_to_excavator(cls):
# return cls.walk_time_to_excavator
#
# def get_walk_time_to_dump(cls):
# return cls.walk_time_to_dump
#
# def get_walk_time_park_to_load_area(cls):
# return cls.walk_time_park_to_load_area
#
# def get_walk_time_park_to_excavator(cls):
# return cls.walk_time_park_to_excavator
#
# def get_distance_to_load_area(cls):
# return cls.distance_to_load_area
#
# def get_distance_to_unload_area(cls):
# return cls.distance_to_unload_area
#
# def get_distance_to_excavator(cls):
# return cls.distance_to_excavator
#
# def get_distance_to_dump(cls):
# return cls.distance_to_dump
#
# def get_distance_park_to_load_area(cls):
# return cls.distance_park_to_load_area
#
# def get_distance_park_to_excavator(cls):
# return cls.distance_park_to_excavator
def reset(self):
@classmethod
def reset(cls):
# dynamic_excavator_num
# dynamic_dump_num
# park_num
# 路网真实距离
self.walk_time_to_excavator = np.full(
cls.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)
cls.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
cls.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
cls.walk_time_park_to_load_area = np.full((park_num, load_area_num), M)
cls.walk_time_to_load_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)
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)
cls.distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M)
cls.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
cls.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
cls.distance_park_to_load_area = np.full((park_num, load_area_num), M)
cls.distance_to_load_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:
......@@ -309,16 +337,16 @@ class WalkManage(DeviceMap):
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(
cls.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(
cls.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][
cls.distance_to_unload_area[unload_area_index][
load_area_index
] = 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
] = float(60 / 1000 * item.to_unload_distance / heavy_speed)
except Exception as es:
......@@ -329,18 +357,18 @@ class WalkManage(DeviceMap):
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]]
cls.distance_to_excavator[i][j] = cls.distance_to_load_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_excavator[i][j] = cls.walk_time_to_load_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.distance_to_dump[i][j] = cls.distance_to_unload_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_dump[i][j] = cls.walk_time_to_unload_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
except Exception as es:
logger.error("设备路网信息异常异常")
logger.error(es)
......@@ -351,10 +379,10 @@ class WalkManage(DeviceMap):
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(
cls.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(
cls.walk_time_park_to_load_area[park_index][load_area_index] = float(
60 / 1000 * item.park_load_distance / empty_speed
)
except Exception as es:
......@@ -363,52 +391,23 @@ class WalkManage(DeviceMap):
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[
cls.distance_park_to_excavator[i][j] = cls.distance_park_to_load_area[
i
][self.excavator_index_to_load_area_index_dict[j]]
self.walk_time_park_to_excavator[i][
][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_park_to_excavator[i][
j
] = self.walk_time_park_to_load_area[i][
self.excavator_index_to_load_area_index_dict[j]
] = cls.walk_time_park_to_load_area[i][
cls.excavator_index_to_load_area_index_dict[j]
]
except Exception as es:
logger.error("备停区设备路网信息异常")
logger.error(es)
logger.info("distance_park_to_excavator")
logger.info(self.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
logger.info(cls.distance_park_to_excavator)
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():
def global_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
......@@ -471,9 +470,13 @@ def period_para_update():
dynamic_dump_set = set(update_autodisp_dump())
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_num"] = dynamic_truck_num
......@@ -493,9 +496,9 @@ def period_para_update():
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["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
global_dict["distance_to_excavator"] = WalkManage.distance_to_excavator
global_dict["distance_park_to_excavator"] = WalkManage.distance_park_to_excavator
global_dict["distance_to_dump"] = WalkManage.distance_to_dump
# logger.info("walk_manage_para")
# logger.info("distance_to_excavator")
......@@ -515,522 +518,3 @@ def period_para_update():
# logger.info(walk_manage.truck_index_to_uuid_dict)
# logger.info("walk_manage.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):
# weighted_distance = weighted_walk_cost()
# 修正因子
weight = 60
weight = 10
# 阻塞成本权重
alpha = 1
alpha = 0
# 距离成本权重
beta = 1
......@@ -87,9 +87,11 @@ class PathPlanner(WalkManage):
if rule2.disabled == 0:
alpha = rule2.rule_weight
beta /= beta
alpha = alpha / beta * weight
if alpha > 0:
beta /= (beta + 0.001)
alpha = alpha / beta * weight
else:
beta = 1
try:
......@@ -154,18 +156,14 @@ class PathPlanner(WalkManage):
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.period_walk_para_load()
self.period_map_para_load()
# self.controller.period_update(self.dump, self.excavator, self.truck)
# 计算行驶成本前,更新路网速度信息
......@@ -187,6 +185,9 @@ class PathPlanner(WalkManage):
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.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:
logger.error('路网信息计成本计算异常')
logger.error(es)
......@@ -234,6 +235,7 @@ class PathPlanner(WalkManage):
for j in range(get_value("dynamic_excavator_num")):
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]
print()
logger.info("真实路网距离-驶往挖机:")
logger.info(self.distance_to_excavator)
......@@ -284,25 +286,25 @@ class LaneInfo:
def update_truck_loacate(self):
# 读取矿卡所在路段信息
try:
truck_locate_dict = {}
device_name_set = redis2.keys()
for item in device_name_set:
item = item.decode(encoding='utf-8')
# json_value = json.loads(redis2.get(item))
key_value_dict = redis2.hgetall(item)
device_type = key_value_dict[str_to_byte('type')]
is_online = key_value_dict[str_to_byte('online')]
key_set = key_value_dict.keys()
if (device_type == str_to_byte("1")) \
and (str_to_byte('online') in key_set) \
and (bytes.decode(is_online) in ["true" or "True"]) \
and (str_to_byte('laneId') in key_set):
truck_locate = key_value_dict[str_to_byte('laneId')]
truck_locate_dict[truck_name_to_uuid_dict[item]] = eval(truck_locate)
except Exception as es:
logger.error(f'矿卡{item}所在路段信息读取异常')
logger.error(es)
# try:
truck_locate_dict = {}
device_name_set = redis2.keys()
for item in device_name_set:
item = item.decode(encoding='utf-8')
# json_value = json.loads(redis2.get(item))
key_value_dict = redis2.hgetall(item)
device_type = key_value_dict[str_to_byte('type')]
is_online = key_value_dict[str_to_byte('online')]
key_set = key_value_dict.keys()
if (device_type == str_to_byte("1")) \
and (str_to_byte('online') in key_set) \
and (bytes.decode(is_online) in ["true" or "True"]) \
and (str_to_byte('laneId') in key_set):
truck_locate = key_value_dict[str_to_byte('laneId')]
truck_locate_dict[truck_name_to_uuid_dict[item]] = eval(truck_locate)
# except Exception as es:
# logger.error(f'矿卡{item}所在路段信息读取异常')
# logger.error(es)
print("truck_locate_dict")
print(truck_locate_dict)
......@@ -348,47 +350,45 @@ class LaneInfo:
# used lane, 存在行驶矿卡的路段
tmp_lane_set = []
try:
# 初始化
for lane_id in lane_set:
self.lane_speed_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]
# try:
# 初始化
for lane_id in lane_set:
self.lane_speed_dict[str(lane_id)] = 0
lane_trucks_dict[str(lane_id)] = 0
except Exception as es:
logger.error("路段实时速度计算异常")
logger.error(es)
# 对于各路段信息
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 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
......
......@@ -76,7 +76,7 @@ class PriorityController():
park_walk_weight = park_walk_weight - (park_walk_weight.min() - 1)
except Exception as es:
self.logger.errro(es)
self.logger.error(es)
self.logger.error("优先级归一化异常")
return walk_to_excavator_weight, walk_to_dump_weight, park_walk_weight
......@@ -152,11 +152,9 @@ class PriorityController():
dynamic_excavator_num = get_value("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 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
return walk_available
......@@ -8,8 +8,6 @@
# 实时调度模块
from traffic_flow.traffic_flow_planner import *
from para_config import *
from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo
......@@ -23,10 +21,16 @@ from dispatcher import Dispatcher, PreSchedule
def process(dispatcher):
# try:
<<<<<<< HEAD
# 更新周期参数
logger.info("#####################################周期更新开始#####################################")
period_para_update()
=======
# 更新周期参数
logger.info("#####################################周期更新开始#####################################")
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0:
raise Exception("无动态派车计划可用")
return
......@@ -43,7 +47,11 @@ def process(dispatcher):
session_postgre.flush()
# 周期更新
<<<<<<< HEAD
dispatcher.dispatcher_period_update(topo)
=======
dispatcher.dispatcher_period_update()
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
# try:
......@@ -92,7 +100,7 @@ if __name__ == "__main__":
logger = get_logger("zxt.main")
# 全局参数更新
period_para_update()
global_period_para_update()
# 实例化设备对象
dump = DumpInfo()
......@@ -119,4 +127,4 @@ if __name__ == "__main__":
logger.info(" ")
logger.info("调度系统启动")
main(10, dispatcher)
main(30, dispatcher)
......@@ -48,6 +48,7 @@ dump_target_mass = para_config["dump_target_mass"]
excavator_target_mass = para_config["excavator_target_mass"]
<<<<<<< HEAD
# def set_log():
#
# # 创建日志
......@@ -80,6 +81,40 @@ excavator_target_mass = para_config["excavator_target_mass"]
# def get_logger(module_name):
# logger = logging.getLogger(module_name)
# 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
......
......@@ -39,6 +39,7 @@ with open(json_file) as f:
with open(json_file) as f:
postgre_config = json.load(f)["postgresql"]
<<<<<<< HEAD
with open(json_file) as f:
redis_config = json.load(f)["redis"]
......@@ -80,6 +81,9 @@ json_file = "config.json"
logger = get_logger("zxt.tables")
=======
# logger = get_logger("zxt.tables")
>>>>>>> 4905484 (添加等待时间算法,修复部分BUG)
# # 创建对象的基类:
# Base = declarative_base()
......@@ -161,8 +165,9 @@ try:
session_postgre.expire_on_commit = False
except Exception as es:
logger.error("数据库连接失败")
logger.error(es)
# logger.error("数据库连接失败")
# logger.error(es)
pass
# 定义对象:
......
......@@ -53,11 +53,6 @@ class Traffic_flow(WalkManage):
# 更新实际交通流
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()
unloading_task_time = self.dump.get_unloading_task_time()
......@@ -231,6 +226,10 @@ class Traffic_para(WalkManage):
rule4 = session_mysql.query(DispatchRule).filter_by(id=4).first()
if not rule4.disabled:
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).\
join(Equipment, Equipment.equipment_spec == EquipmentSpec.id).\
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
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_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