Commit 670e5b13 authored by 张晓彤's avatar 张晓彤

修复无派车计划算法终止异常

parent 435b229f
...@@ -29,6 +29,8 @@ class DumpInfo(WalkManage): ...@@ -29,6 +29,8 @@ class DumpInfo(WalkManage):
self.dump_material = {} self.dump_material = {}
# 卸点优先级 # 卸点优先级
self.dump_priority_coefficient = np.ones(self.dynamic_dump_num) self.dump_priority_coefficient = np.ones(self.dynamic_dump_num)
# 卸点卸载能力
self.dump_strength = np.zeros(self.dynamic_dump_num)
# 初始化读取映射及路网 # 初始化读取映射及路网
self.period_map_para_load() self.period_map_para_load()
...@@ -136,6 +138,25 @@ class DumpInfo(WalkManage): ...@@ -136,6 +138,25 @@ class DumpInfo(WalkManage):
logger.error("无动态派车计划可用") logger.error("无动态派车计划可用")
logger.error(es) logger.error(es)
def update_unload_ability(self):
try:
rule3 = session_mysql.query(DispatchRule).filter_by(id=3).first()
if not rule3.disabled:
for dump_index in range(dynamic_dump_num):
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 # 卸载设备最大卸载能力,单位吨/小时
if unload_ability < 200:
raise Exception("卸载点卸载能力异常")
else:
self.dump_strength = np.full(self.num_of_dump, 5000)
except Exception as es:
logger.error(es)
logger.error("卸载点卸载信息读取异常")
def reset(self): def reset(self):
# 卸载设备数量 # 卸载设备数量
self.dynamic_dump_num = get_value("dynamic_dump_num") self.dynamic_dump_num = get_value("dynamic_dump_num")
...@@ -151,6 +172,8 @@ class DumpInfo(WalkManage): ...@@ -151,6 +172,8 @@ class DumpInfo(WalkManage):
self.dump_material = {} self.dump_material = {}
# 卸点优先级 # 卸点优先级
self.dump_priority_coefficient = np.ones(self.dynamic_dump_num) self.dump_priority_coefficient = np.ones(self.dynamic_dump_num)
# 卸点卸载能力
self.dump_strength = np.zeros(self.dynamic_dump_num)
def para_period_update(self): def para_period_update(self):
...@@ -176,6 +199,9 @@ class DumpInfo(WalkManage): ...@@ -176,6 +199,9 @@ class DumpInfo(WalkManage):
# 更新设备优先级 # 更新设备优先级
self.update_dump_priority() self.update_dump_priority()
# 更新卸点卸载能力
self.update_unload_ability()
# #
# # 卸载目标产量 # # 卸载目标产量
# self.dump_target_mass = np.full(self.dynamic_dump_num, dump_target_mass) # self.dump_target_mass = np.full(self.dynamic_dump_num, dump_target_mass)
\ No newline at end of file
...@@ -33,6 +33,8 @@ class ExcavatorInfo(WalkManage): ...@@ -33,6 +33,8 @@ class ExcavatorInfo(WalkManage):
self.excavator_priority_coefficient = np.ones(self.dynamic_excavator_num) self.excavator_priority_coefficient = np.ones(self.dynamic_excavator_num)
# 挖机物料优先级 # 挖机物料优先级
self.excavator_material_priority = np.ones(self.dynamic_excavator_num) self.excavator_material_priority = np.ones(self.dynamic_excavator_num)
# 挖机装载能力
self.excavator_strength = np.zeros(self.dynamic_excavator_num)
# 初始化读取映射及路网 # 初始化读取映射及路网
self.period_map_para_load() self.period_map_para_load()
...@@ -162,6 +164,25 @@ class ExcavatorInfo(WalkManage): ...@@ -162,6 +164,25 @@ class ExcavatorInfo(WalkManage):
if self.excavator_material[excavator_id] == '81bb175d-50fe-4be3-937e-6791ac4d6fec': if self.excavator_material[excavator_id] == '81bb175d-50fe-4be3-937e-6791ac4d6fec':
self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5 self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
def update_mining_ability(self):
try:
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)):
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()
self.excavator_strength[excavator_index] = load_ability.mining_abililty
if load_ability.mining_abililty < 200:
raise Exception("挖机装载能力异常")
else:
self.excavator_strength = np.full(self.num_of_excavator, 5000)
except Exception as es:
logger.error(es)
logger.error("挖机装载信息信息读取异常")
def reset(self): def reset(self):
# 装载设备数量 # 装载设备数量
...@@ -180,7 +201,8 @@ class ExcavatorInfo(WalkManage): ...@@ -180,7 +201,8 @@ class ExcavatorInfo(WalkManage):
self.excavator_priority_coefficient = np.ones(self.dynamic_excavator_num) self.excavator_priority_coefficient = np.ones(self.dynamic_excavator_num)
# 挖机物料优先级 # 挖机物料优先级
self.excavator_material_priority = np.ones(self.dynamic_excavator_num) self.excavator_material_priority = np.ones(self.dynamic_excavator_num)
# 挖机装载能力
self.excavator_strength = np.zeros(get_value("dynamic_excavator_num"))
def para_period_update(self): def para_period_update(self):
...@@ -214,3 +236,6 @@ class ExcavatorInfo(WalkManage): ...@@ -214,3 +236,6 @@ class ExcavatorInfo(WalkManage):
# 更新挖机优先级 # 更新挖机优先级
self.update_excavator_priority() self.update_excavator_priority()
# 更新挖机装载能力
self.update_mining_ability()
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:38
# @Author : Opfer
# @Site :
# @File : __init__.py
# @Software: PyCharm
\ No newline at end of file
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:34
# @Author : Opfer
# @Site :
# @File : group_control.py
# @Software: PyCharm
from settings import *
from para_config import *
from path_plan.path_plannner import PathPlanner
from traffic_flow.traffic_flow_planner import traffic_flow_plan
class Group(WalkManage):
def __init__(self, dump, excavator, truck, traffic_flow):
self.dump = dump
self.excavator = excavator
self.truck = truck
self.traffic_flow = traffic_flow
self.dispatch_truck_group = {}
self.group_num = 1
self.group_set = set()
self.device_group = {}
self.group_walk_to_excavator_cost = {}
self.group_walk_to_dump_cost = {}
self.group_park_to_excavator = {}
self.group_opt_goto_dump_traffic_flow = {}
self.group_opt_goto_excavator_traffic_flow = {}
self.group_actual_goto_dump_traffic_flow = {}
self.group_actual_goto_excavator_traffic_flow = {}
self.group_excavator_uuid_to_index_dict = {}
self.group_dump_uuid_to_index_dict = {}
self.group_excavator_index_to_uuid_dict = {}
self.group_dump_index_to_uuid_dict = {}
self.group_excavator_exclude_modify = {}
self.group_excavator_material_bind_modify = {}
self.group_dump_material_bind_modify = {}
self.path = PathPlanner()
def update_dispatch_truck_group(self):
# 更新矿卡-调度分组隶属关系
self.dispatch_truck_group = {}
dynamic_truck_set = get_value("dynamic_truck_set")
print("dispatch_truck_group-dynamic_truck_set")
print(dynamic_truck_set)
# 动态派车数量没变,但是此时某条派车计划被删除,dispatch_truck_group 就会缺失矿卡
for truck_id in dynamic_truck_set:
item = session_mysql.query(Dispatch).filter_by(truck_id=truck_id, isauto=1, isdeleted=0).first()
if item is None:
print(truck_id)
continue
self.dispatch_truck_group[truck_id] = item.group_id
print(self.dispatch_truck_group)
def update_group_set(self):
# 更新调度组
self.group_set = set()
for item in session_mysql.query(Dispatch).filter_by(isauto=1, isdeleted=0).all():
if item.group_id is not None:
self.group_set.add(item.group_id)
self.group_num = len(self.group_set)
def update_device_group(self):
# 更新设备分组group_id -> {set(dump_id), set(excavator_id)}
self.device_group = {}
for group_id in self.get_group_set():
if group_id not in self.device_group:
self.device_group[group_id] = [set(), set()]
else:
continue
for item in session_mysql.query(Dispatch).filter_by(group_id=group_id, isauto=1, isdeleted=0).all():
self.device_group[group_id][0].add(item.dump_id)
self.device_group[group_id][1].add(item.exactor_id)
# 更新实际交通流
def update_actual_traffic_flow(self):
loading_task_time = self.excavator.get_loading_task_time()
unloading_task_time = self.dump.get_unloading_task_time()
truck_current_task = self.truck.get_truck_current_task()
truck_current_trip = self.truck.get_truck_current_trip()
payload = self.truck.get_payload()
dynamic_dump_num = get_value("dynamic_dump_num")
dynamic_excavator_num = get_value("dynamic_excavator_num")
dynamic_truck_num = get_value("dynamic_truck_num")
self.goto_dump_truck_num = np.zeros((dynamic_excavator_num, dynamic_dump_num))
self.actual_goto_dump_traffic_flow = np.zeros(
(dynamic_excavator_num, dynamic_dump_num)
)
self.goto_excavator_truck_num = np.zeros(
(dynamic_dump_num, dynamic_excavator_num)
)
self.actual_goto_excavator_traffic_flow = np.zeros(
(dynamic_dump_num, dynamic_excavator_num)
)
# try:
logger.info("dynamic_truck_num")
logger.info(dynamic_truck_num)
print("truck.truck_index_to_uuid_dict")
print(self.truck.truck_index_to_uuid_dict)
print("truck_current_task")
print(truck_current_task)
for i in range(dynamic_truck_num):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1]
start_area_index = truck_current_trip[i][0]
if task in heavy_task_set:
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])
self.actual_goto_dump_traffic_flow = self.actual_goto_dump_traffic_flow / (
self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num)
/ (1000 * empty_speed)
+ np.expand_dims(unloading_task_time, axis=0).repeat(
dynamic_excavator_num, axis=0
)
)
self.actual_goto_excavator_traffic_flow = (
self.actual_goto_excavator_traffic_flow
/ (
self.distance_to_excavator.reshape(
dynamic_dump_num, dynamic_excavator_num
)
/ (1000 * heavy_speed)
+ np.expand_dims(loading_task_time, axis=0).repeat(
dynamic_dump_num, axis=0
)
)
)
def update_group_truck_flow(self):
# 更新调度分组内车实时/最佳车流
global dispatcher
actual_goto_excavator_traffic_flow, actual_goto_dump_traffic_flow = \
self.traffic_flow.actual_goto_excavator_traffic_flow, self.traffic_flow.actual_goto_dump_traffic_flow
opt_goto_dump_traffic_flow, opt_goto_excavator_traffic_flow = traffic_flow_plan(self.truck)
try:
# print("uuid_to_index_dict")
# print(dump.dump_uuid_to_index_dict)
# print(excavator.excavator_uuid_to_index_dict)
for group_id in self.group_set:
dump_group = self.device_group[group_id][0] # group 类最后更新,读取派车计划及分组情况,和前面的uuid 可能不一致
excavator_group = self.device_group[group_id][1]
print("group")
print(self.device_group)
local_opt_goto_dump_traffic_flow = np.zeros((len(excavator_group), len(dump_group)))
local_opt_goto_excavator_traffic_flow = np.zeros((len(dump_group), len(excavator_group)))
local_actual_goto_dump_traffic_flow = np.zeros((len(excavator_group), len(dump_group)))
local_actual_goto_excavator_traffic_flow = np.zeros((len(dump_group), len(excavator_group)))
for excavator_id in excavator_group:
for dump_id in dump_group:
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]]
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]]
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]]
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]]
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_actual_goto_dump_traffic_flow[group_id] = local_actual_goto_dump_traffic_flow
self.group_actual_goto_excavator_traffic_flow[group_id] = local_actual_goto_excavator_traffic_flow
except Exception as es:
logger.error(es)
logger.error("分组车流更新异常")
logger.info("group_opt_traffic_flow")
logger.info(self.group_opt_goto_dump_traffic_flow)
logger.info(self.group_opt_goto_excavator_traffic_flow)
def update_group_walk_cost(self):
# 更新调度分组路网行驶成本
walk_to_excavator_cost, walk_to_dump_cost, park_to_excavator_cost = self.path.walk_cost()
try:
for group_id in self.group_set:
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_park_to_excavator_cost = np.zeros((park_num, len(excavator_group)))
for excavator_id in excavator_group:
for dump_id in dump_group:
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]
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]]
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]]
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]]
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_park_to_excavator[group_id] = local_park_to_excavator_cost
except Exception as es:
logger.info(es)
logger.info("error-11")
def update_group_device_map(self):
# 更新调度分组内设备映射
self.group_excavator_uuid_to_index_dict = {}
self.group_dump_uuid_to_index_dict = {}
self.group_excavator_index_to_uuid_dict = {}
self.group_dump_index_to_uuid_dict = {}
for group_id in self.group_set:
excavator_num = 0
dump_num = 0
dump_group = self.device_group[group_id][0]
excavator_group = self.device_group[group_id][1]
self.group_excavator_uuid_to_index_dict[group_id] = {}
self.group_excavator_index_to_uuid_dict[group_id] = {}
self.group_dump_uuid_to_index_dict[group_id] = {}
self.group_dump_index_to_uuid_dict[group_id] = {}
for excavator_id in excavator_group:
if excavator_id not in self.group_excavator_uuid_to_index_dict:
self.group_excavator_index_to_uuid_dict[group_id][excavator_num] = excavator_id
self.group_excavator_uuid_to_index_dict[group_id][excavator_id] = excavator_num
excavator_num = excavator_num + 1
for dump_id in dump_group:
if dump_id not in self.group_dump_uuid_to_index_dict:
self.group_dump_index_to_uuid_dict[group_id][dump_num] = dump_id
self.group_dump_uuid_to_index_dict[group_id][dump_id] = dump_num
dump_num = dump_num + 1
logger.info("group_map")
logger.info(self.group_dump_uuid_to_index_dict)
logger.info(self.group_excavator_uuid_to_index_dict)
def update_modify(self):
try:
dynamic_truck_set = get_value("dynamic_truck_set")
print("update_modify")
print(dynamic_truck_set)
print("self.dispatch_truck_group")
print(self.dispatch_truck_group)
self.group_excavator_exclude_modify = {}
self.group_excavator_material_bind_modify = {}
self.group_dump_material_bind_modify = {}
for truck_id in dynamic_truck_set:
group_id = self.dispatch_truck_group[truck_id]
group_dump_num = len(self.device_group[group_id][0])
group_excavator_num = len(self.device_group[group_id][1])
excavator_exclude_modify = np.zeros(group_excavator_num)
excavator_material_bind_modify = np.zeros(group_excavator_num)
dump_material_bind_modify = np.zeros(group_dump_num)
truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
for group_excavator_index in range(group_excavator_num):
excavator_index = self.excavator.excavator_uuid_to_index_dict[self.group_excavator_index_to_uuid_dict[group_id][group_excavator_index]]
excavator_exclude_modify[group_excavator_index] = self.truck.excavator_exclude_modify[truck_index][excavator_index]
for group_excavator_index in range(group_excavator_num):
excavator_index = self.excavator.excavator_uuid_to_index_dict[
self.group_excavator_index_to_uuid_dict[group_id][group_excavator_index]]
excavator_material_bind_modify[group_excavator_index] = self.truck.excavator_material_bind_modify[truck_index][excavator_index]
for group_dump_index in range(group_dump_num):
dump_index = self.dump.dump_uuid_to_index_dict[self.group_dump_index_to_uuid_dict[group_id][group_dump_index]]
print(self.truck.dump_material_bind_modify, truck_index, dump_index)
print(self.truck.dump_material_bind_modify[truck_index][dump_index], truck_index, dump_index)
dump_material_bind_modify[group_dump_index] = self.truck.dump_material_bind_modify[truck_index][dump_index]
self.group_excavator_exclude_modify[truck_id] = excavator_exclude_modify
self.group_excavator_material_bind_modify[truck_id] = excavator_material_bind_modify
self.group_dump_material_bind_modify[truck_id] = dump_material_bind_modify
except Exception as es:
logger.error(es)
logger.error("modify update 异常")
def period_update(self):
self.reset()
self.update_dispatch_truck_group()
self.update_group_set()
self.update_device_group()
self.update_group_device_map()
self.update_group_walk_cost()
self.update_group_truck_flow()
self.update_modify()
def get_diaptch_truck_group(self):
return self.dispatch_truck_group
def get_group_num(self):
return self.group_num
def get_group_set(self):
return self.group_set
def reset(self):
self.dispatch_truck_group = {}
self.group_num = 1
self.group_set = set()
self.device_group = {}
self.group_walk_to_excavator_cost = {}
self.group_walk_to_dump_cost = {}
self.group_park_to_excavator = {}
self.group_opt_goto_dump_traffic_flow = {}
self.group_opt_goto_excavator_traffic_flow = {}
self.group_actual_goto_dump_traffic_flow = {}
self.group_actual_goto_excavator_traffic_flow = {}
self.group_excavator_uuid_to_index_dict = {}
self.group_dump_uuid_to_index_dict = {}
self.group_excavator_index_to_uuid_dict = {}
self.group_dump_index_to_uuid_dict = {}
self.group_excavator_exclude_modify = {}
self.group_excavator_material_bind_modify = {}
self.group_dump_material_bind_modify = {}
\ No newline at end of file
...@@ -33,7 +33,11 @@ class PathPlanner(WalkManage): ...@@ -33,7 +33,11 @@ class PathPlanner(WalkManage):
# 路段集合 # 路段集合
self.lane_set = {} self.lane_set = {}
# 车辆长度(暂) # 车辆长度(暂)
try:
self.truck_length = float(sum(self.truck.get_length().values())) / len(self.truck.get_length()) self.truck_length = float(sum(self.truck.get_length().values())) / len(self.truck.get_length())
except Exception as es:
logger.error("无矿卡数据")
logger.error(es)
self.truck_length = 3 self.truck_length = 3
# 装载区数量 # 装载区数量
self.num_of_load_area = len(set(update_load_area())) self.num_of_load_area = len(set(update_load_area()))
......
...@@ -16,6 +16,7 @@ from equipment.excavator import ExcavatorInfo ...@@ -16,6 +16,7 @@ from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
import sched import sched
import time import time
from group_control.group_control import Group
dump = DumpInfo() dump = DumpInfo()
excavator = ExcavatorInfo() excavator = ExcavatorInfo()
...@@ -51,37 +52,12 @@ class Dispatcher(WalkManage): ...@@ -51,37 +52,12 @@ class Dispatcher(WalkManage):
self.start_time = datetime.now() self.start_time = datetime.now()
# self.relative_now_time = datetime.now() - self.start_time # self.relative_now_time = datetime.now() - self.start_time
# 下面是交通流调度部分 self.path = PathPlanner()
# 驶往挖机的实际车流
self.actual_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.actual_goto_dump_traffic_flow = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往挖机的实际车次
self.goto_dump_truck_num = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往卸载设备的实际车次
self.goto_excavator_truck_num = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的理想车流 self.traffic_flow = Traffic_flow(dump, excavator, truck)
self.opt_goto_dump_traffic_flow = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往卸载设备的实际车流
self.opt_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
self.path = PathPlanner() self.group = Group(dump, excavator, truck, self.traffic_flow)
self.group = Group()
# 更新矿卡预计抵达目的地时间 # 更新矿卡预计抵达目的地时间
def update_truck_reach_time(self): def update_truck_reach_time(self):
...@@ -215,151 +191,6 @@ class Dispatcher(WalkManage): ...@@ -215,151 +191,6 @@ class Dispatcher(WalkManage):
logger.error("卸载设备可用时间计算异常") logger.error("卸载设备可用时间计算异常")
logger.error(es) logger.error(es)
# 更新实际交通流
def update_actual_traffic_flow(self):
loading_task_time = excavator.get_loading_task_time()
unloading_task_time = dump.get_unloading_task_time()
truck_current_task = truck.get_truck_current_task()
truck_current_trip = truck.get_truck_current_trip()
payload = truck.get_payload()
dynamic_dump_num = get_value("dynamic_dump_num")
dynamic_excavator_num = get_value("dynamic_excavator_num")
dynamic_truck_num = get_value("dynamic_truck_num")
self.goto_dump_truck_num = np.zeros((dynamic_excavator_num, dynamic_dump_num))
self.actual_goto_dump_traffic_flow = np.zeros(
(dynamic_excavator_num, dynamic_dump_num)
)
self.goto_excavator_truck_num = np.zeros(
(dynamic_dump_num, dynamic_excavator_num)
)
self.actual_goto_excavator_traffic_flow = np.zeros(
(dynamic_dump_num, dynamic_excavator_num)
)
# try:
logger.info("dynamic_truck_num")
logger.info(dynamic_truck_num)
print("truck.truck_index_to_uuid_dict")
print(truck.truck_index_to_uuid_dict)
print("truck_current_task")
print(truck_current_task)
for i in range(dynamic_truck_num):
task = truck_current_task[truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1]
start_area_index = truck_current_trip[i][0]
if task in heavy_task_set:
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])
self.actual_goto_dump_traffic_flow = self.actual_goto_dump_traffic_flow / (
self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num)
/ (1000 * empty_speed)
+ np.expand_dims(unloading_task_time, axis=0).repeat(
dynamic_excavator_num, axis=0
)
)
self.actual_goto_excavator_traffic_flow = (
self.actual_goto_excavator_traffic_flow
/ (
self.distance_to_excavator.reshape(
dynamic_dump_num, dynamic_excavator_num
)
/ (1000 * heavy_speed)
+ np.expand_dims(loading_task_time, axis=0).repeat(
dynamic_dump_num, axis=0
)
)
)
logger.info("self.goto_dump_truck_num")
logger.info(self.goto_dump_truck_num)
logger.info("self.actual_goto_dump_traffic_flow")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("self.goto_excavator_truck_num")
logger.info(self.goto_excavator_truck_num)
logger.info("self.actual_goto_excavator_traffic_flow")
logger.info(self.actual_goto_excavator_traffic_flow)
# except Exception as es:
# logger.error("未知错误001")
# logger.error(es)
# print("驶往卸点实际载重")
# print(self.actual_goto_dump_traffic_flow)
# print("卸点路段行驶时间(h)")
# print((self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num) / (1000 * empty_speed)))
# print("驶往卸点实际车流")
# print(self.actual_goto_dump_traffic_flow)
logger.info("驶往卸点实际载重")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("卸点路段行驶时间(h)")
logger.info(
(
self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num)
/ (1000 * empty_speed)
)
)
logger.info("驶往卸点实际车流")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("________________loading_task_time__________")
logger.info(loading_task_time)
# self.actual_goto_excavator_traffic_flow = (
# self.actual_goto_excavator_traffic_flow
# / (
# self.distance_to_excavator.reshape(
# dynamic_dump_num, dynamic_excavator_num
# )
# / (1000 * heavy_speed)
# + np.expand_dims(loading_task_time, axis=0).repeat(
# dynamic_dump_num, axis=0
# )
# )
# )
# print("驶往挖机实际载重")
# print(self.actual_goto_excavator_traffic_flow)
# print("挖机路段行驶时间(h)")
# print((self.distance_to_excavator.reshape(dynamic_excavator_num, dynamic_dump_num) / (1000 * heavy_speed)))
# print("驶往挖机实际车流")
# print(self.actual_goto_excavator_traffic_flow)
logger.info("驶往挖机实际载重")
logger.info(self.actual_goto_excavator_traffic_flow)
logger.info("挖机路段行驶时间(h)")
logger.info(
(
self.distance_to_excavator.reshape(
dynamic_excavator_num, dynamic_dump_num
)
/ (1000 * heavy_speed)
)
)
logger.info("驶往挖机实际车流")
logger.info(self.actual_goto_excavator_traffic_flow)
def dispatcher_period_update(self): def dispatcher_period_update(self):
# 装载映射参数及 # 装载映射参数及
...@@ -379,10 +210,8 @@ class Dispatcher(WalkManage): ...@@ -379,10 +210,8 @@ class Dispatcher(WalkManage):
truck.state_period_update() truck.state_period_update()
# 更新实时车流 # 更新实时车流
self.update_actual_traffic_flow() # self.update_actual_traffic_flow()
self.traffic_flow.update_actual_traffic_flow()
# 计算理想车流
(self.opt_goto_dump_traffic_flow, self.opt_goto_excavator_traffic_flow,) = traffic_flow_plan(truck)
# 矿卡抵达时间 # 矿卡抵达时间
excavator_reach_list, dump_reach_list = self.update_truck_reach_time() excavator_reach_list, dump_reach_list = self.update_truck_reach_time()
...@@ -428,83 +257,61 @@ class Dispatcher(WalkManage): ...@@ -428,83 +257,61 @@ class Dispatcher(WalkManage):
# 维护一个矿卡调度表 # 维护一个矿卡调度表
self.Seq = [[] for _ in range(truck.get_truck_num())] self.Seq = [[] for _ in range(truck.get_truck_num())]
# 下面是交通流调度部分
# 驶往挖机的实际车流
self.actual_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.actual_goto_dump_traffic_flow = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往挖机的实际车次
self.goto_dump_truck_num = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往卸载设备的实际车次
self.goto_excavator_truck_num = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的理想车流
self.opt_goto_dump_traffic_flow = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往卸载设备的实际车流
self.opt_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
def truck_schedule(self, truck_id): def truck_schedule(self, truck_id):
# 规则读取
rule3 = session_mysql.query(DispatchRule).filter_by(id=3).first().disabled rule3 = session_mysql.query(DispatchRule).filter_by(id=3).first().disabled
rule4 = session_mysql.query(DispatchRule).filter_by(id=4).first().disabled rule4 = session_mysql.query(DispatchRule).filter_by(id=4).first().disabled
# cost_to_excavator, cost_to_dump, cost_park_to_excavator = self.path.walk_cost() # 读取优先级设置
# try:
excavator_priority_coefficient = excavator.excavator_priority_coefficient excavator_priority_coefficient = excavator.excavator_priority_coefficient
excavator_material_priority = excavator.excavator_material_priority excavator_material_priority = excavator.excavator_material_priority
# 矿卡对应序号 # 矿卡对应序号
truck_index = truck.truck_uuid_to_index_dict[truck_id] truck_index = truck.truck_uuid_to_index_dict[truck_id]
# 矿卡行程 # 矿卡行程
trip = truck.get_truck_current_trip()[truck_index] trip = truck.get_truck_current_trip()[truck_index]
# 矿卡当前任务 # 矿卡当前任务
task = truck.get_truck_current_task()[truck.truck_index_to_uuid_dict[truck_index]] task = truck.get_truck_current_task()[truck.truck_index_to_uuid_dict[truck_index]]
# 挖机装载时间
loading_time = excavator.get_loading_time()
# 路网信息
walk_time_park_to_excavator = walk_manage.get_walk_time_park_to_excavator() \
* (empty_speed / float(truck.empty_speed[truck_id]))
if truck_id not in self.group.dispatch_truck_group: if truck_id not in self.group.dispatch_truck_group:
logger.error("无该矿卡") logger.error("无该矿卡")
return -1 return -1
# 矿卡调度分组 # 矿卡调度分组
group_id = self.group.dispatch_truck_group[truck_id] group_id = self.group.dispatch_truck_group[truck_id]
dynamic_dump_num = dump.get_dump_num() dynamic_dump_num = dump.get_dump_num()
dynamic_excavator_num = excavator.get_excavator_num() dynamic_excavator_num = excavator.get_excavator_num()
now = float( target = 0
(datetime.now() - self.start_time)
/ timedelta(hours=0, minutes=1, seconds=0)) # 是否启用挖机均衡
rule_ex = True
# 车流计算
# 驶往卸载设备的实际车流
actual_goto_dump_traffic_flow = self.traffic_flow.actual_goto_dump_traffic_flow
# 驶往挖机的实际车流
actual_goto_excavator_traffic_flow = self.traffic_flow.actual_goto_excavator_traffic_flow
# 计算理想车流
opt_goto_dump_traffic_flow, opt_goto_excavator_traffic_flow = traffic_flow_plan(truck)
logger.info("==========================================================") logger.info("==========================================================")
logger.info(f"调度矿卡 {truck_id} {truck_index} {truck_uuid_to_name_dict[truck_id]}") logger.info(f"调度矿卡 {truck_id} {truck_index} {truck_uuid_to_name_dict[truck_id]}")
target = 0
if task == -2: if task == -2:
try: try:
logger.info("矿卡状态:矿卡启动或故障恢复") logger.info("矿卡状态:矿卡启动或故障恢复")
logger.info("矿卡行程:无") logger.info("矿卡行程:无")
logger.info(f"涉及挖机:{list(excavator.excavator_uuid_to_index_dict.keys())}") logger.info(f"涉及挖机:{list(excavator.excavator_uuid_to_index_dict.keys())}")
logger.info(
f"行程时间:{(np.maximum(self.sim_excavator_ava_time, now + walk_time_park_to_excavator[0, :]) + loading_time - now)}")
logger.info(f"行驶时间:{walk_time_park_to_excavator[0, :] + loading_time}")
logger.info("物料类型") logger.info("物料类型")
if truck_id in truck.truck_material_bind: if truck_id in truck.truck_material_bind:
logger.info(truck.truck_material_bind[truck_id]) logger.info(truck.truck_material_bind[truck_id])
...@@ -525,25 +332,28 @@ class Dispatcher(WalkManage): ...@@ -525,25 +332,28 @@ class Dispatcher(WalkManage):
try: try:
if truck_id in truck.truck_excavator_bind: if truck_id in truck.truck_excavator_bind:
target = excavator.excavator_uuid_to_index_dict[truck.truck_excavator_bind[truck_id]] target = excavator.excavator_uuid_to_index_dict[truck.truck_excavator_bind[truck_id]]
else: elif not rule_ex:
transport_value = self.group.group_park_to_excavator[group_id] transport_value = self.group.group_park_to_excavator[group_id]
excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id] excavator_exclude_modify = self.group.group_excavator_exclude_modify[truck_id]
excavator_material_bind_modify = self.group.group_excavator_material_bind_modify[truck_id] # excavator_material_bind_modify = self.group.group_excavator_material_bind_modify[truck_id]
logger.info("transport_value") logger.info("transport_value")
# logger.info(transport_value)
# target = np.argmin(
# transport_value
# + truck.excavator_exclude_modify[truck_index]
# + truck.excavator_material_bind_modify[truck_index])
logger.info(transport_value) logger.info(transport_value)
target = np.argmin( target = np.argmin(
transport_value transport_value
+ excavator_exclude_modify) + excavator_exclude_modify)
# + excavator_material_bind_modify) # + excavator_material_bind_modify)
target = self.excavator_uuid_to_index_dict[self.group.group_excavator_index_to_uuid_dict[group_id][target]] target = self.excavator_uuid_to_index_dict[self.group.group_excavator_index_to_uuid_dict[group_id][target]]
else:
actual_flow_to_excavator = truck.excavator_hold_truck_num * truck.payload / self.group.group_park_to_excavator[group_id].reshape(1, -1)
allow_flow_to_excavator = excavator.excavator_strength
target = np.argmin(actual_flow_to_excavator / allow_flow_to_excavator)
target = self.excavator_uuid_to_index_dict[self.group.group_excavator_index_to_uuid_dict[group_id][target]]
logger.info(f"目的地:{excavator.excavator_index_to_uuid_dict[target]}") logger.info(f"目的地:{excavator.excavator_index_to_uuid_dict[target]}")
except Exception as es: except Exception as es:
...@@ -558,34 +368,35 @@ class Dispatcher(WalkManage): ...@@ -558,34 +368,35 @@ class Dispatcher(WalkManage):
logger.error(es) logger.error(es)
try: try:
assert np.array(self.actual_goto_dump_traffic_flow).shape == ( assert np.array(actual_goto_dump_traffic_flow).shape == (
dynamic_excavator_num, dynamic_excavator_num,
dynamic_dump_num,) dynamic_dump_num,)
assert np.array(self.opt_goto_dump_traffic_flow).shape == ( assert np.array(opt_goto_dump_traffic_flow).shape == (
dynamic_excavator_num, dynamic_excavator_num,
dynamic_dump_num,) dynamic_dump_num,)
except Exception as es: except Exception as es:
logger.warning(es) logger.warning(es)
self.actual_goto_dump_traffic_flow = np.array( actual_goto_dump_traffic_flow = np.array(
self.actual_goto_dump_traffic_flow).reshape((dynamic_excavator_num, dynamic_dump_num)) actual_goto_dump_traffic_flow).reshape((dynamic_excavator_num, dynamic_dump_num))
self.opt_goto_dump_traffic_flow = np.array( opt_goto_dump_traffic_flow = np.array(
self.opt_goto_dump_traffic_flow).reshape((dynamic_excavator_num, dynamic_dump_num)) opt_goto_dump_traffic_flow).reshape((dynamic_excavator_num, dynamic_dump_num))
self.actual_goto_dump_traffic_flow = np.array(self.actual_goto_dump_traffic_flow) actual_goto_dump_traffic_flow = np.array(actual_goto_dump_traffic_flow)
self.opt_goto_dump_traffic_flow = np.array(self.opt_goto_dump_traffic_flow) opt_goto_dump_traffic_flow = np.array(opt_goto_dump_traffic_flow)
# 日志记录部分
try: try:
logger.info("挖机id:") logger.info("挖机id:")
logger.info(excavator.excavator_uuid_to_index_dict) logger.info(excavator.excavator_uuid_to_index_dict)
logger.info("卸点id:") logger.info("卸点id:")
logger.info(dump.dump_uuid_to_index_dict) logger.info(dump.dump_uuid_to_index_dict)
logger.info(f"卸载点实际车流:") logger.info(f"卸载点实际车流:")
logger.info(self.actual_goto_dump_traffic_flow) logger.info(actual_goto_dump_traffic_flow)
logger.info(f"卸载点理想车流:") logger.info(f"卸载点理想车流:")
logger.info(self.opt_goto_dump_traffic_flow) logger.info(self.opt_goto_dump_traffic_flow)
logger.info("卸载点实际车流") logger.info("卸载点实际车流")
logger.info(self.actual_goto_dump_traffic_flow[int(trip[1]), :]) logger.info(actual_goto_dump_traffic_flow[int(trip[1]), :])
logger.info("卸载点理想车流") logger.info("卸载点理想车流")
logger.info(self.opt_goto_dump_traffic_flow[int(trip[1]), :]) logger.info(self.opt_goto_dump_traffic_flow[int(trip[1]), :])
...@@ -611,7 +422,7 @@ class Dispatcher(WalkManage): ...@@ -611,7 +422,7 @@ class Dispatcher(WalkManage):
target = key target = key
break break
else: elif not rule_ex:
try: try:
excavator_index = int(trip[1]) excavator_index = int(trip[1])
excavator_id = self.excavator_index_to_uuid_dict[excavator_index] excavator_id = self.excavator_index_to_uuid_dict[excavator_index]
...@@ -642,10 +453,10 @@ class Dispatcher(WalkManage): ...@@ -642,10 +453,10 @@ class Dispatcher(WalkManage):
else: else:
try: try:
# 提取group actual traffic flow # 计算 group actual traffic flow
group_actual_goto_dump_traffic_flow = self.group.group_actual_goto_dump_traffic_flow[group_id] group_actual_goto_dump_traffic_flow = self.group.group_actual_goto_dump_traffic_flow[group_id]
# 提取group actual traffic flow # 计算 group actual traffic flow
group_opt_goto_dump_traffic_flow = self.group.group_opt_goto_dump_traffic_flow[group_id] group_opt_goto_dump_traffic_flow = self.group.group_opt_goto_dump_traffic_flow[group_id]
logger.info("驶往卸点分组车流") logger.info("驶往卸点分组车流")
...@@ -662,12 +473,11 @@ class Dispatcher(WalkManage): ...@@ -662,12 +473,11 @@ class Dispatcher(WalkManage):
except Exception as es: except Exception as es:
logger.error("error11") logger.error("error11")
logger.error(es) logger.error(es)
# transport_value = (self.actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) \
# / (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001)
logger.info("transport_value") logger.info("transport_value")
logger.info(transport_value) logger.info(transport_value)
logger.info("dump_material_bind_modify") logger.info("dump_material_bind_modify")
logger.info(truck.dump_material_bind_modify[truck_index]) logger.info(truck.dump_material_bind_modify[truck_index])
try: try:
dump_material_bind_modify = self.group.group_dump_material_bind_modify[truck_id] dump_material_bind_modify = self.group.group_dump_material_bind_modify[truck_id]
except Exception as es: except Exception as es:
...@@ -700,8 +510,8 @@ class Dispatcher(WalkManage): ...@@ -700,8 +510,8 @@ class Dispatcher(WalkManage):
try: try:
logger.info("车流比:") logger.info("车流比:")
logger.info((self.actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) \ logger.info((actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) \
/ (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001)) / (opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001))
except Exception as es: except Exception as es:
logger.error("error08") logger.error("error08")
logger.error(es) logger.error(es)
...@@ -710,8 +520,18 @@ class Dispatcher(WalkManage): ...@@ -710,8 +520,18 @@ class Dispatcher(WalkManage):
except Exception as es: except Exception as es:
logger.error("error06") logger.error("error06")
logger.error(es) logger.error(es)
else:
excavator_index = int(trip[1])
actual_flow_to_dump = truck.dump_hold_truck_num * truck.payload / \
self.group.group_walk_to_dump_cost[group_id][:, excavator_index].reshape(1,
-1)
allow_flow_to_dump = dump.dump_strength
target = np.argmin(actual_flow_to_dump / allow_flow_to_dump)
target = self.dump_uuid_to_index_dict[
self.group.group_dump_index_to_uuid_dict[group_id][target]]
elif task in [3, 4, 5]: elif task in [3, 4, 5]:
...@@ -733,15 +553,15 @@ class Dispatcher(WalkManage): ...@@ -733,15 +553,15 @@ class Dispatcher(WalkManage):
except Exception as es: except Exception as es:
logger.warning(es) logger.warning(es)
self.actual_goto_excavator_traffic_flow = np.array( actual_goto_excavator_traffic_flow = np.array(
self.actual_goto_excavator_traffic_flow).reshape((dynamic_dump_num, dynamic_excavator_num)) actual_goto_excavator_traffic_flow).reshape((dynamic_dump_num, dynamic_excavator_num))
self.opt_goto_excavator_traffic_flow = np.array( opt_goto_excavator_traffic_flow = np.array(
self.opt_goto_excavator_traffic_flow).reshape((dynamic_dump_num, dynamic_excavator_num)) opt_goto_excavator_traffic_flow).reshape((dynamic_dump_num, dynamic_excavator_num))
# 不知道为什么,偶尔变成了list # 不知道为什么,偶尔变成了list
self.actual_goto_excavator_traffic_flow = np.array(self.actual_goto_excavator_traffic_flow) actual_goto_excavator_traffic_flow = np.array(actual_goto_excavator_traffic_flow)
self.opt_goto_excavator_traffic_flow = np.array(self.opt_goto_excavator_traffic_flow) opt_goto_excavator_traffic_flow = np.array(opt_goto_excavator_traffic_flow)
try: try:
logger.info("挖机id:") logger.info("挖机id:")
...@@ -749,23 +569,11 @@ class Dispatcher(WalkManage): ...@@ -749,23 +569,11 @@ class Dispatcher(WalkManage):
logger.info("卸点id:") logger.info("卸点id:")
logger.info(dump.dump_uuid_to_index_dict) logger.info(dump.dump_uuid_to_index_dict)
logger.info(f"挖机实际车流:") logger.info(f"挖机实际车流:")
logger.info(self.actual_goto_excavator_traffic_flow) logger.info(actual_goto_excavator_traffic_flow)
logger.info(f"挖机理想车流:") logger.info(f"挖机理想车流:")
logger.info(self.opt_goto_excavator_traffic_flow) logger.info(opt_goto_excavator_traffic_flow)
logger.info("重载trip") logger.info("重载trip")
logger.info(trip) logger.info(trip)
try:
logger.info("挖机实际车流_行")
logger.info(self.actual_goto_excavator_traffic_flow[trip[1], :])
logger.info("挖机理想车流_行")
logger.info(self.opt_goto_excavator_traffic_flow[trip[1], :])
except Exception as es:
logger.info("trip出错")
logger.info(trip)
logger.info(es)
logger.info("物料类型") logger.info("物料类型")
if truck_id in truck.truck_material_bind: if truck_id in truck.truck_material_bind:
logger.info(truck.truck_material_bind[truck_id]) logger.info(truck.truck_material_bind[truck_id])
...@@ -784,7 +592,7 @@ class Dispatcher(WalkManage): ...@@ -784,7 +592,7 @@ class Dispatcher(WalkManage):
if truck_id in truck.truck_excavator_bind: if truck_id in truck.truck_excavator_bind:
target = excavator.excavator_uuid_to_index_dict[truck.truck_excavator_bind[truck_id]] target = excavator.excavator_uuid_to_index_dict[truck.truck_excavator_bind[truck_id]]
logger.info("矿卡已绑定挖机") logger.info("矿卡已绑定挖机")
else: elif not rule_ex:
logger.info("cost_to_excavator") logger.info("cost_to_excavator")
logger.info(self.cost_to_excavator) logger.info(self.cost_to_excavator)
...@@ -833,6 +641,19 @@ class Dispatcher(WalkManage): ...@@ -833,6 +641,19 @@ class Dispatcher(WalkManage):
# + excavator_material_bind_modify) # + excavator_material_bind_modify)
target = self.excavator_uuid_to_index_dict[self.group.group_excavator_index_to_uuid_dict[target]] target = self.excavator_uuid_to_index_dict[self.group.group_excavator_index_to_uuid_dict[target]]
else:
dump_index = int(trip[1])
actual_flow_to_excavator = truck.excavator_hold_truck_num * truck.payload / \
self.group.group_walk_to_excavator_cost[group_id][dump_index, :].reshape(
1, -1)
allow_flow_to_excavator = excavator.excavator_strength
target = np.argmin(actual_flow_to_excavator / allow_flow_to_excavator)
target = self.excavator_uuid_to_index_dict[
self.group.group_excavator_index_to_uuid_dict[group_id][target]]
except Exception as es: except Exception as es:
logger.info("trip出错1") logger.info("trip出错1")
logger.info(es) logger.info(es)
...@@ -841,8 +662,8 @@ class Dispatcher(WalkManage): ...@@ -841,8 +662,8 @@ class Dispatcher(WalkManage):
try: try:
logger.info("车流比:") logger.info("车流比:")
logger.info( logger.info(
(self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001) (actual_goto_excavator_traffic_flow[trip[1], :] + 0.001)
/ (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001)) / (opt_goto_excavator_traffic_flow[trip[1], :] + 0.001))
except Exception as es: except Exception as es:
logger.info("trip出错2") logger.info("trip出错2")
logger.info(es) logger.info(es)
...@@ -990,14 +811,6 @@ class Dispatcher(WalkManage): ...@@ -990,14 +811,6 @@ class Dispatcher(WalkManage):
elif task in heavy_task_set: elif task in heavy_task_set:
target_area_index = (excavator.excavator_index_to_load_area_index_dict[target_eq_index]) target_area_index = (excavator.excavator_index_to_load_area_index_dict[target_eq_index])
end_area_index = dump.dump_index_to_unload_area_index_dict[end_eq_index] end_area_index = dump.dump_index_to_unload_area_index_dict[end_eq_index]
# 更新变量,预计产量更新
self.sim_excavator_real_mass[target_eq_index] = (self.sim_excavator_real_mass[target_eq_index]
+ payload[truck_index])
# 预计装载点可用时间更新
self.sim_excavator_ava_time[target_eq_index] = (
max(self.sim_excavator_ava_time[target_eq_index], self.sim_truck_ava_time[truck_index]
+ walk_time_to_unload_area[end_area_index][target_area_index],) \
+ loading_task_time[target_eq_index])
else: else:
pass pass
except Exception as es: except Exception as es:
...@@ -1106,338 +919,10 @@ class Dispatcher(WalkManage): ...@@ -1106,338 +919,10 @@ class Dispatcher(WalkManage):
return Seq return Seq
class Group(WalkManage):
def __init__(self):
self.dispatch_truck_group = {}
self.group_num = 1
self.group_set = set()
self.device_group = {}
self.group_walk_to_excavator_cost = {}
self.group_walk_to_dump_cost = {}
self.group_park_to_excavator = {}
self.group_opt_goto_dump_traffic_flow = {}
self.group_opt_goto_excavator_traffic_flow = {}
self.group_actual_goto_dump_traffic_flow = {}
self.group_actual_goto_excavator_traffic_flow = {}
self.group_excavator_uuid_to_index_dict = {}
self.group_dump_uuid_to_index_dict = {}
self.group_excavator_index_to_uuid_dict = {}
self.group_dump_index_to_uuid_dict = {}
self.group_excavator_exclude_modify = {}
self.group_excavator_material_bind_modify = {}
self.group_dump_material_bind_modify = {}
self.path = PathPlanner()
def update_dispatch_truck_group(self):
# 更新矿卡-调度分组隶属关系
self.dispatch_truck_group = {}
dynamic_truck_set = get_value("dynamic_truck_set")
print("dispatch_truck_group-dynamic_truck_set")
print(dynamic_truck_set)
# 动态派车数量没变,但是此时某条派车计划被删除,dispatch_truck_group 就会缺失矿卡
for truck_id in dynamic_truck_set:
item = session_mysql.query(Dispatch).filter_by(truck_id=truck_id, isauto=1, isdeleted=0).first()
if item is None:
print(truck_id)
continue
self.dispatch_truck_group[truck_id] = item.group_id
print(self.dispatch_truck_group)
def update_group_set(self):
# 更新调度组
self.group_set = set()
for item in session_mysql.query(Dispatch).filter_by(isauto=1, isdeleted=0).all():
if item.group_id is not None:
self.group_set.add(item.group_id)
self.group_num = len(self.group_set)
def update_device_group(self):
# 更新设备分组group_id -> {set(dump_id), set(excavator_id)}
self.device_group = {}
for group_id in self.get_group_set():
if group_id not in self.device_group:
self.device_group[group_id] = [set(), set()]
else:
continue
for item in session_mysql.query(Dispatch).filter_by(group_id=group_id, isauto=1, isdeleted=0).all():
self.device_group[group_id][0].add(item.dump_id)
self.device_group[group_id][1].add(item.exactor_id)
def update_group_truck_flow(self):
# 更新调度分组内车实时/最佳车流
global dispatcher
actual_goto_excavator_traffic_flow, actual_goto_dump_traffic_flow = \
dispatcher.actual_goto_excavator_traffic_flow, dispatcher.actual_goto_dump_traffic_flow
opt_goto_dump_traffic_flow, opt_goto_excavator_traffic_flow = traffic_flow_plan(truck)
try:
print("uuid_to_index_dict")
print(dump.dump_uuid_to_index_dict)
print(excavator.excavator_uuid_to_index_dict)
for group_id in self.group_set:
dump_group = self.device_group[group_id][0] # group 类最后更新,读取派车计划及分组情况,和前面的uuid 可能不一致
excavator_group = self.device_group[group_id][1]
print("group")
print(self.device_group)
local_opt_goto_dump_traffic_flow = np.zeros((len(excavator_group), len(dump_group)))
local_opt_goto_excavator_traffic_flow = np.zeros((len(dump_group), len(excavator_group)))
local_actual_goto_dump_traffic_flow = np.zeros((len(excavator_group), len(dump_group)))
local_actual_goto_excavator_traffic_flow = np.zeros((len(dump_group), len(excavator_group)))
for excavator_id in excavator_group:
for dump_id in dump_group:
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[excavator.excavator_uuid_to_index_dict[excavator_id]][dump.dump_uuid_to_index_dict[dump_id]]
local_opt_goto_excavator_traffic_flow[dump_group_index][excavator_group_index] = \
opt_goto_excavator_traffic_flow[dump.dump_uuid_to_index_dict[dump_id]][excavator.excavator_uuid_to_index_dict[excavator_id]]
local_actual_goto_dump_traffic_flow[excavator_group_index][dump_group_index] = \
actual_goto_dump_traffic_flow[excavator.excavator_uuid_to_index_dict[excavator_id]][dump.dump_uuid_to_index_dict[dump_id]]
local_actual_goto_excavator_traffic_flow[dump_group_index][excavator_group_index] = \
actual_goto_excavator_traffic_flow[dump.dump_uuid_to_index_dict[dump_id]][excavator.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
self.group_actual_goto_dump_traffic_flow[group_id] = local_actual_goto_dump_traffic_flow
self.group_actual_goto_excavator_traffic_flow[group_id] = local_actual_goto_excavator_traffic_flow
except Exception as es:
logger.error(es)
logger.error("分组车流更新异常")
logger.info("group_opt_traffic_flow")
logger.info(self.group_opt_goto_dump_traffic_flow)
logger.info(self.group_opt_goto_excavator_traffic_flow)
def update_group_walk_cost(self):
# 更新调度分组路网行驶成本
walk_to_excavator_cost, walk_to_dump_cost, park_to_excavator_cost = self.path.walk_cost()
try:
for group_id in self.group_set:
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_park_to_excavator_cost = np.zeros((park_num, len(excavator_group)))
for excavator_id in excavator_group:
for dump_id in dump_group:
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]
print("dump_group")
print(dump_group)
local_walk_to_excavator_cost[dump_group_index][excavator_group_index] = \
walk_to_excavator_cost[dump.dump_uuid_to_index_dict[dump_id]][excavator.excavator_uuid_to_index_dict[excavator_id]]
local_walk_to_dump_cost[dump_group_index][excavator_group_index] = \
walk_to_dump_cost[dump.dump_uuid_to_index_dict[dump_id]][excavator.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][excavator.excavator_uuid_to_index_dict[excavator_id]]
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_park_to_excavator[group_id] = local_park_to_excavator_cost
except Exception as es:
logger.info(es)
logger.info("error-11")
def update_group_device_map(self):
# 更新调度分组内设备映射
self.group_excavator_uuid_to_index_dict = {}
self.group_dump_uuid_to_index_dict = {}
self.group_excavator_index_to_uuid_dict = {}
self.group_dump_index_to_uuid_dict = {}
for group_id in self.group_set:
excavator_num = 0
dump_num = 0
dump_group = self.device_group[group_id][0]
excavator_group = self.device_group[group_id][1]
self.group_excavator_uuid_to_index_dict[group_id] = {}
self.group_excavator_index_to_uuid_dict[group_id] = {}
self.group_dump_uuid_to_index_dict[group_id] = {}
self.group_dump_index_to_uuid_dict[group_id] = {}
for excavator_id in excavator_group:
if excavator_id not in self.group_excavator_uuid_to_index_dict:
self.group_excavator_index_to_uuid_dict[group_id][excavator_num] = excavator_id
self.group_excavator_uuid_to_index_dict[group_id][excavator_id] = excavator_num
excavator_num = excavator_num + 1
for dump_id in dump_group:
if dump_id not in self.group_dump_uuid_to_index_dict:
self.group_dump_index_to_uuid_dict[group_id][dump_num] = dump_id
self.group_dump_uuid_to_index_dict[group_id][dump_id] = dump_num
dump_num = dump_num + 1
logger.info("group_map")
logger.info(self.group_dump_uuid_to_index_dict)
logger.info(self.group_excavator_uuid_to_index_dict)
def update_modify(self):
try:
dynamic_truck_set = get_value("dynamic_truck_set")
print("update_modify")
print(dynamic_truck_set)
print("self.dispatch_truck_group")
print(self.dispatch_truck_group)
self.group_excavator_exclude_modify = {}
self.group_excavator_material_bind_modify = {}
self.group_dump_material_bind_modify = {}
for truck_id in dynamic_truck_set:
group_id = self.dispatch_truck_group[truck_id]
group_dump_num = len(self.device_group[group_id][0])
group_excavator_num = len(self.device_group[group_id][1])
excavator_exclude_modify = np.zeros(group_excavator_num)
excavator_material_bind_modify = np.zeros(group_excavator_num)
dump_material_bind_modify = np.zeros(group_dump_num)
truck_index = truck.truck_uuid_to_index_dict[truck_id]
for group_excavator_index in range(group_excavator_num):
excavator_index = excavator.excavator_uuid_to_index_dict[self.group_excavator_index_to_uuid_dict[group_id][group_excavator_index]]
excavator_exclude_modify[group_excavator_index] = truck.excavator_exclude_modify[truck_index][excavator_index]
for group_excavator_index in range(group_excavator_num):
excavator_index = excavator.excavator_uuid_to_index_dict[
self.group_excavator_index_to_uuid_dict[group_id][group_excavator_index]]
excavator_material_bind_modify[group_excavator_index] = truck.excavator_material_bind_modify[truck_index][excavator_index]
for group_dump_index in range(group_dump_num):
dump_index = dump.dump_uuid_to_index_dict[self.group_dump_index_to_uuid_dict[group_id][group_dump_index]]
print(truck.dump_material_bind_modify, truck_index, dump_index)
print(truck.dump_material_bind_modify[truck_index][dump_index], truck_index, dump_index)
dump_material_bind_modify[group_dump_index] = truck.dump_material_bind_modify[truck_index][dump_index]
self.group_excavator_exclude_modify[truck_id] = excavator_exclude_modify
self.group_excavator_material_bind_modify[truck_id] = excavator_material_bind_modify
self.group_dump_material_bind_modify[truck_id] = dump_material_bind_modify
except Exception as es:
logger.error(es)
logger.error("modify update 异常")
def period_update(self):
self.reset()
self.update_dispatch_truck_group()
self.update_group_set()
self.update_device_group()
self.update_group_device_map()
self.update_group_walk_cost()
self.update_group_truck_flow()
self.update_modify()
def get_diaptch_truck_group(self):
return self.dispatch_truck_group
def get_group_num(self):
return self.group_num
def get_group_set(self):
return self.group_set
def reset(self):
self.dispatch_truck_group = {}
self.group_num = 1
self.group_set = set()
self.device_group = {}
self.group_walk_to_excavator_cost = {}
self.group_walk_to_dump_cost = {}
self.group_park_to_excavator = {}
self.group_opt_goto_dump_traffic_flow = {}
self.group_opt_goto_excavator_traffic_flow = {}
self.group_actual_goto_dump_traffic_flow = {}
self.group_actual_goto_excavator_traffic_flow = {}
self.group_excavator_uuid_to_index_dict = {}
self.group_dump_uuid_to_index_dict = {}
self.group_excavator_index_to_uuid_dict = {}
self.group_dump_index_to_uuid_dict = {}
self.group_excavator_exclude_modify = {}
self.group_excavator_material_bind_modify = {}
self.group_dump_material_bind_modify = {}
# def para_process(dispatcher):
#
# logger.info("papa_process!")
#
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 清空数据库缓存
# session_postgre.commit()
# session_postgre.flush()
#
# # 周期更新
# dispatcher.para_period_update()
#
#
# def state_process(dispatcher):
#
# print("state_process!")
#
# logger.info("state_process!")
#
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 清空数据库缓存
# session_postgre.commit()
# session_postgre.flush()
#
# # 周期更新
# dispatcher.state_period_update()
#
# # 参数重置
# dispatcher.sim_para_reset()
#
# # try:
#
# # 调度计算
# dispatcher.schedule_construct()
#
# # except Exception as es:
# # logger.error("更新不及时")
# # logger.error(es)
# 下面三个函数保证程序定期执行,不用管他 # 下面三个函数保证程序定期执行,不用管他
def process(dispatcher): def process(dispatcher):
# try: try:
# 更新周期参数 # 更新周期参数
logger.info("#####################################周期更新开始#####################################") logger.info("#####################################周期更新开始#####################################")
...@@ -1480,8 +965,9 @@ def process(dispatcher): ...@@ -1480,8 +965,9 @@ def process(dispatcher):
logger.info("#####################################周期更新结束#####################################") logger.info("#####################################周期更新结束#####################################")
# except Exception as es: except Exception as es:
# logger.error(es) logger.error("最外层异常捕获")
logger.error(es)
period_para_update() period_para_update()
scheduler = sched.scheduler(time.time, time.sleep) scheduler = sched.scheduler(time.time, time.sleep)
......
...@@ -55,8 +55,8 @@ log_path = para_config["log_path"] ...@@ -55,8 +55,8 @@ log_path = para_config["log_path"]
# 创建日志目录 # 创建日志目录
if not os.path.exists(log_path): # if not os.path.exists(log_path):
os.mkdir(log_path) # os.mkdir(log_path)
# logging初始化工作 # logging初始化工作
logging.basicConfig() logging.basicConfig()
...@@ -65,8 +65,8 @@ logger.setLevel(logging.INFO) ...@@ -65,8 +65,8 @@ logger.setLevel(logging.INFO)
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60) # 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(log_path + "/dispatch.log", maxBytes=3*1024*1024, backupCount=10)
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10) filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样 # 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log" filehandler.suffix = "%Y-%m-%d_%H-%M.log"
......
...@@ -14,6 +14,154 @@ from equipment.dump import DumpInfo ...@@ -14,6 +14,154 @@ from equipment.dump import DumpInfo
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
class Traffic_flow(WalkManage):
def __init__(self, dump, excavator, truck):
self.dump = dump
self.excavator = excavator
self.truck = truck
# 驶往挖机的实际车流
self.actual_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.actual_goto_dump_traffic_flow = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往挖机的实际车次
self.goto_dump_truck_num = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往卸载设备的实际车次
self.goto_excavator_truck_num = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的理想车流
self.opt_goto_dump_traffic_flow = np.zeros(
(excavator.get_excavator_num(), dump.get_dump_num())
)
# 驶往卸载设备的实际车流
self.opt_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 更新实际交通流
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()
truck_current_task = self.truck.get_truck_current_task()
truck_current_trip = self.truck.get_truck_current_trip()
payload = self.truck.get_payload()
dynamic_dump_num = get_value("dynamic_dump_num")
dynamic_excavator_num = get_value("dynamic_excavator_num")
dynamic_truck_num = get_value("dynamic_truck_num")
self.goto_dump_truck_num = np.zeros((dynamic_excavator_num, dynamic_dump_num))
self.actual_goto_dump_traffic_flow = np.zeros(
(dynamic_excavator_num, dynamic_dump_num)
)
self.goto_excavator_truck_num = np.zeros(
(dynamic_dump_num, dynamic_excavator_num)
)
self.actual_goto_excavator_traffic_flow = np.zeros(
(dynamic_dump_num, dynamic_excavator_num)
)
# try:
logger.info("dynamic_truck_num")
logger.info(dynamic_truck_num)
print("truck.truck_index_to_uuid_dict")
print(self.truck.truck_index_to_uuid_dict)
print("truck_current_task")
print(truck_current_task)
for i in range(dynamic_truck_num):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1]
start_area_index = truck_current_trip[i][0]
if task in heavy_task_set:
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])
self.actual_goto_dump_traffic_flow = self.actual_goto_dump_traffic_flow / (
self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num)
/ (1000 * empty_speed)
+ np.expand_dims(unloading_task_time, axis=0).repeat(
dynamic_excavator_num, axis=0
)
)
self.actual_goto_excavator_traffic_flow = (
self.actual_goto_excavator_traffic_flow
/ (
self.distance_to_excavator.reshape(
dynamic_dump_num, dynamic_excavator_num
)
/ (1000 * heavy_speed)
+ np.expand_dims(loading_task_time, axis=0).repeat(
dynamic_dump_num, axis=0
)
)
)
logger.info("self.goto_dump_truck_num")
logger.info(self.goto_dump_truck_num)
logger.info("self.actual_goto_dump_traffic_flow")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("self.goto_excavator_truck_num")
logger.info(self.goto_excavator_truck_num)
logger.info("self.actual_goto_excavator_traffic_flow")
logger.info(self.actual_goto_excavator_traffic_flow)
# except Exception as es:
# logger.error("未知错误001")
# logger.error(es)
# print("驶往卸点实际载重")
# print(self.actual_goto_dump_traffic_flow)
# print("卸点路段行驶时间(h)")
# print((self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num) / (1000 * empty_speed)))
# print("驶往卸点实际车流")
# print(self.actual_goto_dump_traffic_flow)
logger.info("驶往卸点实际载重")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("卸点路段行驶时间(h)")
logger.info(
(
self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num)
/ (1000 * empty_speed)
)
)
logger.info("驶往卸点实际车流")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("________________loading_task_time__________")
logger.info(loading_task_time)
# 车流规划类 # 车流规划类
class Traffic_para(WalkManage): class Traffic_para(WalkManage):
def __init__(self, num_of_load_area, num_of_unload_area, num_of_excavator, num_of_dump, truck): def __init__(self, num_of_load_area, num_of_unload_area, num_of_excavator, num_of_dump, truck):
......
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