Commit 8edf3046 authored by 张晓彤's avatar 张晓彤

代码优化v3

parent c81d437a
......@@ -55,9 +55,9 @@ class Congestion(AlgorithmBase):
task = self.truck.get_truck_current_task()[truck_id]
group_dynamic_excavator_num = len(self.group.dump)
group_dynamic_excavator_num = len(self.group.group_dumps)
group_dynamic_dump_num = len(self.group.excavator)
group_dynamic_dump_num = len(self.group.group_excavators)
except Exception as es:
self.logger.error("车辆调度信息读取异常")
......@@ -158,9 +158,9 @@ class ExpectedTime(AlgorithmBase):
truck_avl_time = self.pre_sch.get_truck_avl_time(truck_id=truck_id)
group_dynamic_excavator_num = len(self.group.excavator)
group_dynamic_excavator_num = len(self.group.group_excavators)
group_dynamic_unload_area_num = len(self.group.unload_area)
group_dynamic_unload_area_num = len(self.group.group_unload_areas)
# except Exception as es:
# self.logger.error("车辆调度信息读取异常")
......@@ -174,7 +174,7 @@ class ExpectedTime(AlgorithmBase):
# try:
self.logger.info(f'矿卡 {truck_id}')
self.logger.info("矿卡状态:矿卡启动或故障恢复")
self.logger.info(f"涉及挖机:{self.group.excavator}")
self.logger.info(f"涉及挖机:{self.group.group_excavators}")
# self.logger.info(f"涉及挖机:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
# except Exception as es:
# self.logger.error(f"矿卡{truck_id}状态不匹配")
......@@ -185,7 +185,7 @@ class ExpectedTime(AlgorithmBase):
excavator_val_time_dict = self.pre_sch.get_excavator_avl_time()
# 局部挖机可用时间 list
group_excavator_avl_time_ls = np.full(len(self.group.excavator), 0.0)
group_excavator_avl_time_ls = np.full(len(self.group.group_excavators), 0.0)
self.logger.info("self.group.excavator_uuid_index_dict")
self.logger.info(self.group.excavator_uuid_index_dict)
......@@ -229,18 +229,18 @@ class ExpectedTime(AlgorithmBase):
# try:
self.logger.info(f'矿卡 {truck_id}')
self.logger.info("矿卡状态:矿卡空载")
self.logger.info(f"涉及卸载设备:{self.group.dump}")
self.logger.info(f"涉及卸载设备:{self.group.group_dumps}")
# 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:
# get dump available time (List) for all
# get group_dumps available time (List) for all
dump_val_time_dict = self.pre_sch.get_dump_avl_time()
# get dump available time (List) within the group
group_dump_val_time_ls = np.full(len(self.group.unload_area), 0.0)
# get group_dumps available time (List) within the group
group_dump_val_time_ls = np.full(len(self.group.group_unload_areas), 0.0)
self.logger.info("self.group.dump_uuid_index_dict")
self.logger.info(self.group.dump_uuid_index_dict)
......@@ -248,17 +248,17 @@ class ExpectedTime(AlgorithmBase):
for dump_id, dump_index in self.group.dump_uuid_index_dict.items():
group_dump_val_time_ls[dump_index] = dump_val_time_dict[dump_id]
# get truck located excavator id (uuid) from truck trip
# get truck located group_excavators id (uuid) from truck trip
if int(trip[1]) < 0 or int(trip[1]) >= len(DeviceMap.excavator_index_to_uuid_dict):
raise CoreException(105, f'车辆 {truck_id} 行程驶往 {int(trip[1])} 号挖机越界')
excavator_id = DeviceMap.excavator_index_to_uuid_dict[int(trip[1])]
# get excavator index (int) within group from group's excavator_group_index
# get group_excavators index (int) within group from group's excavator_group_index
if excavator_id not in self.group.excavator_uuid_index_dict:
raise CoreException(106, f'挖机 {excavator_id} 不存在于分组 {self.group.name} excavator_uuid_index_dict')
excavator_group_index = self.group.excavator_uuid_index_dict[excavator_id]
# get travelling time (List) to each dump
# get travelling time (List) to each group_dumps
truck_reach_time_ls = 60 * self.group.to_unload_area_distance[excavator_group_index, :] \
/ 1000 / self.truck.heavy_speed[truck_id] + truck_avl_time
......@@ -296,18 +296,18 @@ class ExpectedTime(AlgorithmBase):
# try:
self.logger.info(f'矿卡 {truck_id}')
self.logger.info("矿卡状态:矿卡重载")
self.logger.info(f'涉及挖机设备:{self.group.excavator}')
self.logger.info(f'涉及挖机设备:{self.group.group_excavators}')
# 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:
# get excavator available time (List) for all
# get group_excavators available time (List) for all
excavator_val_time = self.pre_sch.get_excavator_avl_time()
# get excavator available time (List) within the group
group_excavator_avl_time_ls = np.full(len(self.group.excavator), 0.0)
# get group_excavators available time (List) within the group
group_excavator_avl_time_ls = np.full(len(self.group.group_excavators), 0.0)
self.logger.info("self.group.excavator_uuid_index_dict")
self.logger.info(self.group.excavator_uuid_index_dict)
......@@ -315,10 +315,10 @@ class ExpectedTime(AlgorithmBase):
for excavator_id, excavator_index in self.group.excavator_uuid_index_dict.items():
group_excavator_avl_time_ls[excavator_index] = excavator_val_time[excavator_id]
# get truck located dump id (uuid) from truck trip
# get truck located group_dumps id (uuid) from truck trip
dump_id = DeviceMap.dump_index_to_uuid_dict[int(trip[1])]
# get unload area id (uuid) from DispatchInfo dump_id to unload_area mapping
# get unload area id (uuid) from DispatchInfo dump_id to group_unload_areas mapping
unload_area_id = DispatchInfo.dump_unload_area_dict[dump_id]
# get unload area id (uuid) from DispatchInfo dump_id to unload
......
......@@ -15,6 +15,9 @@ from data.para_config import get_value
from core.util import *
from typing import Mapping, List
from util import CoreException
from equipment import TruckInfo, ExcavatorInfo, DumpInfo
from core.schedule import PreSchedule
from graph.topo_graph import Topo
class CurrentTruck:
......@@ -31,7 +34,7 @@ class CurrentTruck:
"""
def __init__(self, truck_id, group_id, trip, task, state):
def __init__(self, truck_id: str, group_id: str, trip: List[int], task: int, state: int):
self._truck_id = truck_id
self._group_id = group_id
self._trip = trip
......@@ -58,9 +61,16 @@ class Group:
"""
class for group instance.
"""
def __init__(self, group_id, truck, pre_sch, excavator_info, dump_info, topo):
""" Generate a group obj.
:param group_id: (uuid) group_id
def __init__(self, group_id, truck: TruckInfo, pre_sch: PreSchedule, excavator_info: ExcavatorInfo,
dump_info: DumpInfo, topo: Topo):
"""
Generate a group obj.
:param group_id:
:param truck:
:param pre_sch:
:param excavator_info:
:param dump_info:
:param topo:
"""
self.logger = get_logger("zxt.Group")
# basic info.
......@@ -76,11 +86,10 @@ class Group:
self.topo = topo
# group devices
self.excavator = {} # excavator_id -> unload_area_id
self.unload_area = {} # unload_area_id -> load_area_id
self.dump = {}
self.truck_set = set() # truck_id
self.group_excavators = {}
self.group_unload_areas = {}
self.group_dumps = {}
self.group_trucks = set()
# road network info.
self.to_excavator_distance = None
......@@ -124,17 +133,14 @@ class Group:
"""
# update group devices
# DispatchInfo.update_device_group_structure()
self.excavator = {}
self.unload_area = {}
self.dump = {}
self.truck_set = set()
self.excavator = DispatchInfo.get_excavator(self.group_id)
self.unload_area = DispatchInfo.get_unload_area(self.group_id)
self.dump = DispatchInfo.get_dump(self.group_id)
self.truck_set = DispatchInfo.get_truck_set(self.group_id)
# self.logger.info(f'group excavator {self.excavator}')
# self.logger.info(f'group dump {self.dump}')
self.group_excavators = {}
self.group_unload_areas = {}
self.group_dumps = {}
self.group_trucks = set()
self.group_excavators = DispatchInfo.get_excavator(self.group_id)
self.group_unload_areas = DispatchInfo.get_unload_area(self.group_id)
self.group_dumps = DispatchInfo.get_dump(self.group_id)
self.group_trucks = DispatchInfo.get_truck_set(self.group_id)
def update_group_road_network(self):
"""
......@@ -175,23 +181,10 @@ class Group:
# self.logger.info("物料兼容性")
# self.logger.info(DispatchInfo.group_name[self.group_id])
for dump_id in self.dump:
for excavator_id in self.excavator:
# load_area_id = DispatchInfo.excavator_load_dict[excavator_id]
# unload_area_id = DispatchInfo.dump_unload_area_dict[dump_id]
for dump_id in self.group_dumps:
for excavator_id in self.group_excavators:
excavator_index = self.excavator_uuid_index_dict[excavator_id]
dump_index = self.dump_uuid_index_dict[dump_id]
# load_area_index = get_value("load_area_uuid_to_index_dict")[load_area_id]
# unload_area_index = get_value("unload_area_uuid_to_index_dict")[unload_area_id]
# 两设备处理物料不同, 相关路网不可通行
# self.logger.info(excavator_id)
# self.logger.info(self.excavator_info.excavator_material)
# self.logger.info(self.excavator_info.excavator_material[excavator_id])
# self.logger.info(dump_id)
# self.logger.info(self.dump_info.dump_material)
# self.logger.info(self.dump_info.dump_material[dump_id])
if self.excavator_info.excavator_material[excavator_id] not in self.dump_info.dump_material[dump_id]:
self.group_walk_available[excavator_index][dump_index] = 10
......@@ -263,7 +256,7 @@ class GroupDispatcher:
self.logger.info(f'分组 {self.group.group_name} 调度计算-调度模式 {self.group.group_mode}')
for truck_id in list(self.group.truck_set):
for truck_id in list(self.group.group_trucks):
self.logger.info(f'调度车辆 {truck_id}')
......@@ -433,7 +426,7 @@ class GroupDispatcher:
if i in self.group.truck.truck_excavator_bind:
try:
if i not in self.group.truck.truck_excavator_bind:
raise CoreException(102, f'truck.excavator bind 中不存在 {i}')
raise CoreException(102, f'truck.group_excavators bind 中不存在 {i}')
except CoreException as es:
es.with_traceback_info()
self.logger.error(es)
......@@ -495,11 +488,12 @@ class GroupDispatcher:
self.logger.error(es)
truck_dispatch[i] = [None, None]
elif truck_task == 0:
try:
if i in self.group.truck.get_truck_locate_dict():
truck_locate = self.group.truck.get_truck_locate_dict()[i]
except Exception as es:
self.logger.error("车辆位置信息丢失")
self.logger.error(es)
else:
self.logger.error(f'车辆 {i} 位置信息丢失')
truck_dispatch[i] = [None, None]
return
self.logger.info(self.group.truck.truck_is_temp)
try:
......@@ -543,15 +537,26 @@ class GroupDispatcher:
if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2) \
and (not truck_is_temp):
self.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
def redispatch_to_dump(self, truck_id, truck_dispatch, truck_locate, truck_trip):
"""
redispatch truck to dumps.
:param truck_id:
:param truck_dispatch:
:param truck_locate:
:param truck_trip:
:return:
"""
# 当前绑定装载区
if truck_trip[0] == -1:
next_excavator_id = session_mysql.query(EquipmentPair).filter_by(truck_id=i,
next_excavator_id = session_mysql.query(EquipmentPair).filter_by(truck_id=truck_id,
isdeleted=0).first().exactor_id
else:
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[0]]
# 当前绑定卸载区
if truck_trip[-1] == -1:
item = session_mysql.query(EquipmentPair).filter_by(truck_id=i, isdeleted=0).first()
item = session_mysql.query(EquipmentPair).filter_by(truck_id=truck_id, isdeleted=0).first()
current_dump_id = item.dump_id
current_unload_area_id = item.unload_area_id
else:
......@@ -560,24 +565,18 @@ class GroupDispatcher:
unload_area_dict, unload_area_lane_dict = self.group.topo.get_unload_target_node_real(truck_locate,
current_unload_area_id,
True)
# 获取拥堵路段
congestion_lane_dict = self.get_congestion_lanes()
# 获取当前交叉口下一路段集合
next_lane_list = get_cross_next_lanes(truck_locate)
# 交叉口下一路段可达的装载区
next_lane_load_area_dict = get_lane_reach_load_areas(unload_area_lane_dict,
next_lane_list)
# 排除下一个路段阻塞的装载区
delete_congestion_load_area(congestion_lane_dict, unload_area_dict,
next_lane_load_area_dict)
min_trip_time = 10000000
best_dump_id = current_dump_id
for unload_area, value in unload_area_dict.items():
# 车辆不需要掉头
if value[-1] == 1 and unload_area in DispatchInfo.unload_area_dump_dict:
......@@ -595,16 +594,12 @@ class GroupDispatcher:
if min_trip_time > trip_time:
best_dump_id = dump_id
next_unload_area_id = DispatchInfo.dump_unload_area_dict[best_dump_id]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
truck_dispatch[truck_id] = [next_excavator_id, next_unload_area_id]
# res = redispatch_request(truck_id, next_excavator_id, next_unload_area_id)
# self.logger.info(res)
self.logger.info(f'二次调度结果 {i}')
self.logger.info(truck_dispatch[i])
self.logger.info(f'二次调度结果 {truck_id}')
self.logger.info(truck_dispatch[truck_id])
def redispatch_to_excavator(self, truck_id, truck_dispatch, truck_locate):
"""
......@@ -655,7 +650,7 @@ class GroupDispatcher:
def get_best_excavator(self, current_excavator_id, truck_id, load_area_dict):
"""
get best excavator
get best group_excavators
:param current_excavator_id: 当前车辆配对挖机
:param truck_id:
:param load_area_dict: 备选装载区
......@@ -670,7 +665,7 @@ class GroupDispatcher:
excavator_id = DispatchInfo.load_excavator_dict[load_area]
else:
continue
if value[-1] == 1 and excavator_id in self.group.excavator:
if value[-1] == 1 and excavator_id in self.group.group_excavators:
traveling_time = 60 * (value[0] / 1000) / empty_speed
self.logger.info(f'load_area {load_area}')
......@@ -768,7 +763,7 @@ class ReDispatcher:
def get_best_excavator(self, current_excavator_id, truck_id, load_area_dict):
"""
get best excavator
get best group_excavators
:param current_excavator_id: 当前车辆配对挖机
:param truck_id:
:param load_area_dict: 备选装载区
......@@ -783,7 +778,7 @@ class ReDispatcher:
excavator_id = DispatchInfo.load_excavator_dict[load_area]
else:
continue
if value[-1] == 1 and excavator_id in self.group.excavator:
if value[-1] == 1 and excavator_id in self.group.group_excavators:
traveling_time = 60 * (value[0] / 1000) / empty_speed
self.logger.info(f'load_area {load_area}')
......
......@@ -22,9 +22,9 @@ class PreSchedule:
根据矿卡请求队列及抵达信息,计算设备最早可用时间
Attribute:
equipment class: truck, excavator, dump
equipment class: truck, group_excavators, group_dumps
schedule start time
equipment available time: truck, excavator, dump
equipment available time: truck, group_excavators, group_dumps
"""
......
......@@ -231,9 +231,9 @@ class DispatchSubmission:
"""
self.logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
self.logger.info(f'组内车辆 {group.truck_set}')
self.logger.info(f'组内挖机 {group.excavator}')
self.logger.info(f'组内卸点 {group.dump}')
self.logger.info(f'组内车辆 {group.group_trucks}')
self.logger.info(f'组内挖机 {group.group_excavators}')
self.logger.info(f'组内卸点 {group.group_dumps}')
self.logger.info(f'调度模式 {group.group_mode}')
self.logger.info("dispatch_plan_dict")
self.logger.info(dispatch_plan_dict)
......
......@@ -25,15 +25,15 @@ class DispatchInfo:
load_excavator_dict = {} # 装载区id-->>电铲编号的映射
excavator_load_dict = {} # 电铲编号->>装载区id的映射
# excavator <-> group id
# group_excavators <-> group id
group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值
# unload_area <-> group id
# group_unload_areas <-> group id
group_unload_area_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
unload_area_group_dict = {} # unload_area_id -> team_id
# dump <-> group id
# group_dumps <-> group id
group_dump_dict = {}
dump_group_dict = {}
......@@ -54,7 +54,7 @@ class DispatchInfo:
# truck -> match(excavator_id, unload_area_id)
truck_match_dict = {}
# unload_area <-> dump id
# group_unload_areas <-> group_dumps id
dump_unload_area_dict = {}
unload_area_dump_dict = {}
......@@ -204,7 +204,7 @@ class DispatchInfo:
# update excavator_id <-> group_id && unload_area_id <-> group_id && truck_id <-> group_id
try:
for item in session_mysql.query(DispatchSetting).filter_by(isdeleted=0).all():
# add excavator
# add group_excavators
if item.group_id not in cls.group_excavator_dict.keys():
cls.group_excavator_dict[item.group_id] = [item.exactor_id]
else:
......@@ -212,7 +212,7 @@ class DispatchInfo:
cls.group_excavator_dict[item.group_id].append(item.exactor_id)
cls.excavator_group_dict[item.exactor_id] = item.group_id
# add unload_area
# add group_unload_areas
if item.group_id not in cls.group_unload_area_dict.keys():
cls.group_unload_area_dict[item.group_id] = [item.unload_area_id]
else:
......@@ -220,7 +220,7 @@ class DispatchInfo:
cls.group_unload_area_dict[item.group_id].append(item.unload_area_id)
cls.unload_area_group_dict[item.unload_area_id] = item.group_id
# add dump
# add group_dumps
if item.group_id not in cls.group_dump_dict.keys():
cls.group_dump_dict[item.group_id] = [item.dump_id]
else:
......
......@@ -48,13 +48,13 @@ logger = get_logger("zxt.para")
# excavator_uuid_to_name_dict, dump_uuid_to_name_dict = build_equipment_uuid_name_map()
#
# # 矿卡集合
# truck_set = set(update_total_truck())
# group_trucks = set(update_total_truck())
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 动态派车矿卡集合
# # dynamic_truck_set = truck_set.difference(fixed_truck_set)
# # dynamic_truck_set = group_trucks.difference(fixed_truck_set)
# dynamic_truck_set = update_dynamic_truck()
#
# dynamic_truck_num = len(dynamic_truck_set)
......@@ -472,7 +472,7 @@ def global_period_para_update():
# 矿卡集合
truck_set = set(update_total_truck())
logger.info("truck_set")
logger.info("group_trucks")
logger.info(truck_set)
# 固定派车矿卡集合
......@@ -482,7 +482,7 @@ def global_period_para_update():
logger.info(fixed_truck_set)
# 动态派车矿卡集合
# dynamic_truck_set = truck_set.difference(fixed_truck_set)
# dynamic_truck_set = group_trucks.difference(fixed_truck_set)
dynamic_truck_set = update_dynamic_truck()
dynamic_truck_num = len(dynamic_truck_set)
......
......@@ -3,7 +3,7 @@
# @Time : 2021/8/24 11:28
# @Author : Opfer
# @Site :
# @File : dump.py
# @File : group_dumps.py
# @Software: PyCharm
from data.para_config import *
......@@ -33,7 +33,7 @@ class DumpInfo(WalkManage):
self.dump_strength = np.zeros(self.dynamic_dump_num)
# 日志器
self.logger = get_logger("zxt.dump")
self.logger = get_logger("zxt.group_dumps")
# # 参数初始化
# self.dump_para_period_update()
......
......@@ -3,7 +3,7 @@
# @Time : 2021/8/24 11:28
# @Author : Opfer
# @Site :
# @File : excavator.py
# @File : group_excavators.py
# @Software: PyCharm
from data.para_config import *
......@@ -37,7 +37,7 @@ class ExcavatorInfo(WalkManage):
self.excavator_strength = np.zeros(self.dynamic_excavator_num)
# 日志器
self.logger = get_logger("zxt.excavator")
self.logger = get_logger("zxt.group_excavators")
#
# # 参数初始化
# self.excavator_para_period_update()
......
......@@ -76,7 +76,7 @@ class TruckInfo(WalkManage):
# 日志
self.logger = get_logger("zxt.truck")
# # 初始化读取参数
# self.truck_para_period_update(dump, excavator)
# self.truck_para_period_update(group_dumps, group_excavators)
# # 矿卡所属group
# self.truck_group = {}
# 矿卡禁用列表
......@@ -428,7 +428,7 @@ class TruckInfo(WalkManage):
# 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]
# end_eqp_index = group_excavators.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:
......
......@@ -474,7 +474,7 @@ def get_lanes_between_entrances(closer_node_id, further_node_id):
def get_excavator_state(excavator_id):
"""
get excavator state.
get group_excavators state.
:param excavator_id:
:return: state
"""
......
......@@ -142,7 +142,7 @@ class Topo():
Entrancenode_for_dump = str(session_postgre.query(DumpArea).filter_by(Id=item[0][1]).first().EntranceNodeId)
dump_name = str(session_postgre.query(DumpArea).filter_by(Id=item[0][1]).first().Name)
self.unload_G.add_node(Exitnode_for_digging, name='digging', type=digging_name)
self.unload_G.add_node(Entrancenode_for_dump, name='dump', type=dump_name)
self.unload_G.add_node(Entrancenode_for_dump, name='group_dumps', type=dump_name)
# path_node_for_trip.append(Exitnode_for_digging) # add start node for trip
......@@ -215,7 +215,7 @@ class Topo():
self.load_G_all_nodes.append(Entrancenode_for_digging)
self.load_G_digging_nodes.append(Entrancenode_for_digging)
self.load_G.add_node(Exitnode_for_dump, name='dump', type=digging_name)
self.load_G.add_node(Exitnode_for_dump, name='group_dumps', type=digging_name)
self.load_G.add_node(Entrancenode_for_digging, name='digging', type=dump_name)
try:
......@@ -333,7 +333,7 @@ class Topo():
for (u, wt) in self.unload_G.nodes.data('name'):
# select next reachable target
if wt == 'dump':
if wt == 'group_dumps':
if allow:
target_list.append(u)
else:
......
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