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

代码优化

parent ea6385f4
...@@ -19,6 +19,7 @@ import uuid ...@@ -19,6 +19,7 @@ import uuid
from tables import session_mysql, session_postgre from tables import session_mysql, session_postgre
from graph.graph_load import graph_construct from graph.graph_load import graph_construct
from core.util import POST from core.util import POST
from graph.topo_graph import Topo
class Dispatcher: class Dispatcher:
...@@ -36,15 +37,12 @@ class Dispatcher: ...@@ -36,15 +37,12 @@ class Dispatcher:
self.submission = DispatchSubmission(dump, excavator, truck, self.topo) self.submission = DispatchSubmission(dump, excavator, truck, self.topo)
self.logger = get_logger("zxt.dispatcher") self.logger = get_logger("zxt.dispatcher")
def period_update(self): def period_update(self):
""" """
Update global parameter and equipment information. Update equipment information.
:return: None :return: None
""" """
# global_period_para_update()
self.dump.dump_para_period_update() self.dump.dump_para_period_update()
self.excavator.excavator_para_period_update() self.excavator.excavator_para_period_update()
self.truck.truck_para_period_update(self.dump, self.excavator) self.truck.truck_para_period_update(self.dump, self.excavator)
...@@ -76,8 +74,6 @@ class Dispatcher: ...@@ -76,8 +74,6 @@ class Dispatcher:
Group dispatching logic. Group dispatching logic.
:return: :return:
""" """
a = len(self.group_list)
aa = self.group_list
for group in self.group_list.values(): for group in self.group_list.values():
try: try:
...@@ -105,7 +101,7 @@ class DispatchSubmission: ...@@ -105,7 +101,7 @@ class DispatchSubmission:
Attribute: Attribute:
""" """
def __init__(self, dump, excavator, truck, topo): def __init__(self, dump: DumpInfo, excavator: ExcavatorInfo, truck: TruckInfo, topo: Topo):
self.logger = get_logger("zxt.submission") self.logger = get_logger("zxt.submission")
self.dump = dump self.dump = dump
self.excavator = excavator self.excavator = excavator
......
...@@ -13,6 +13,8 @@ import numpy as np ...@@ -13,6 +13,8 @@ import numpy as np
# from settings import get_logger # from settings import get_logger
from data.para_config import get_value from data.para_config import get_value
from core.util import * from core.util import *
from typing import Mapping, List
from util import CoreException
class CurrentTruck: class CurrentTruck:
...@@ -155,29 +157,6 @@ class Group: ...@@ -155,29 +157,6 @@ class Group:
# self.truck_uuid_index_dict = DispatchInfo.get_group_truck_dict(self.group_id) # self.truck_uuid_index_dict = DispatchInfo.get_group_truck_dict(self.group_id)
self.dump_uuid_index_dict = DispatchInfo.get_group_dump_dict(self.group_id) self.dump_uuid_index_dict = DispatchInfo.get_group_dump_dict(self.group_id)
# for i in range(len(self.excavator)):
# self.excavator_uuid_index_dict[list(self.excavator)[i]] = i
#
# for i in range(len(self.unload_area)):
# self.unload_area_uuid_index_dict[list(self.unload_area)[i]] = i
#
# for i in range(len(self.dump)):
# self.dump_uuid_index_dict[list(self.dump)[i]] = i
#
# for i in range(len(self.truck_set)):
# self.truck_uuid_index_dict[list(self.truck_set)[i]] = i
#
# # self.excavator_uuid_index_dict = bidict(DispatchInfo.excavator_uuid_to_index_dict[self.group_id])
# # self.unload_area_uuid_index_dict = bidict(DispatchInfo.unload_area_uuid_to_index_dict[self.group_id])
# # self.dump_uuid_index_dict = bidict(DispatchInfo.dump_uuid_to_index_dict[self.group_id])
#
# self.excavator_uuid_index_dict = bidict(self.excavator_uuid_index_dict)
# self.unload_area_uuid_index_dict = bidict(self.unload_area_uuid_index_dict)
# self.truck_uuid_index_dict = bidict(self.truck_uuid_index_dict)
# self.dump_uuid_index_dict = bidict(self.dump_uuid_index_dict)
# group_excavator_dict = {group_1: {excavator_1: load_area_1}, group_2: {excavator_2: load_area_2}}
def update_device_material(self): def update_device_material(self):
""" """
update group device material. update group device material.
...@@ -258,56 +237,89 @@ class Group: ...@@ -258,56 +237,89 @@ class Group:
self.update_group_road_network() self.update_group_road_network()
self.update_device_material() self.update_device_material()
def group_dispatch(self, solver: object): def group_dispatch(self, Solver) -> Mapping[str, List[str, str]]:
""" """
Receive a alg obj. and output dispatch plan for trucks in this group. Receive a Alg obj. and output dispatch plan for trucks in this group.
:param solver: :param Solver:
:return: :return:
dispatch plan: Dict({truck_id: match_id}) dispatch plan: Dict({truck_id: match_id})
""" """
truck_dispatch = {} truck_dispatch = {}
self.truck_info_list = {} self.truck_info_list = {}
assert issubclass(solver, AlgorithmBase) assert issubclass(Solver, AlgorithmBase)
s = solver(self, self.truck, self.pre_sch) # algorithm init solver = Solver(self, self.truck, self.pre_sch) # solver algorithm init
self.logger.info(f'分组 {self.group_name} 调度计算 调度模式 {self.group_mode}') self.logger.info(f'分组 {self.group_name} 调度计算-调度模式 {self.group_mode}')
for i in list(self.truck_set): for truck_id in list(self.truck_set):
self.logger.info(f'调度车辆 {i}') self.logger.info(f'调度车辆 {truck_id}')
# try:
try: try:
truck_trip = self.truck.get_truck_current_trip()[self.truck.truck_uuid_to_index_dict[i]] if truck_id not in self.truck.truck_uuid_to_index_dict:
truck_task = self.truck.get_truck_current_task()[i] raise CoreException(102, f'truck.truck dict 中不存在 {truck_id}')
truck_info = CurrentTruck(i, self.group_id, truck_trip, truck_task)
self.truck_info_list[i] = truck_info
# truck_task = 0 truck_idx = self.truck.truck_uuid_to_index_dict[truck_id]
# if i != "f704aa5e-24d9-4822-b634-ae81ca5ff0be": except CoreException as es:
# self.truck.get_truck_locate_dict()[i] = "8961f641-c134-8be8-f4eb-95e6e2c374b7" self.logger.error(es)
# self.truck.truck_is_temp[i] = False continue
# self.truck.truck_current_state[i] = 2
except Exception as es: try:
self.logger.error("车辆调度信息读取异常") truck_trip_info_list = self.truck.get_truck_current_trip()
if truck_idx >= len(truck_trip_info_list):
raise CoreException(103, f'truck.truck trip 中不存在 {truck_idx} 号矿卡 {truck_id}')
truck_trip = self.truck.get_truck_current_trip()[truck_idx]
except CoreException as es:
self.logger.error(es) self.logger.error(es)
continue
# TODO: 怎么知道异常行数
try:
truck_task_list = self.truck.get_truck_current_task()
if truck_id not in truck_task_list:
raise CoreException(102, f'truck.truck task 中不存在矿卡 {truck_id}')
truck_task = truck_task_list[truck_id]
except CoreException as ce:
self.logger.error(ce)
continue
# Construct a truck obj.
truck_info = CurrentTruck(truck_id, self.group_id, truck_trip, truck_task)
self.truck_info_list[truck_id] = truck_info
# Construct a test case for redispatch
# truck_task = 0
# if truck_id != "f704aa5e-24d9-4822-b634-ae81ca5ff0be":
# self.truck.get_truck_locate_dict()[truck_id] = "8961f641-c134-8be8-f4eb-95e6e2c374b7"
# self.truck.truck_is_temp[truck_id] = False
# self.truck.truck_current_state[truck_id] = 2
# except Exception as es:
# self.logger.error("车辆调度信息读取异常")
# self.logger.error(es)
try: try:
# 全智能模式 # 全智能模式
if self.group_mode == 1: if self.group_mode == 1:
self.logger.info("全智能模式调度") self.logger.info("全智能模式调度")
self.full_dynamic_mode(i, s, truck_dispatch, truck_info, truck_task, truck_trip) self.full_dynamic_mode(truck_id, solver, truck_dispatch, truck_info, truck_task, truck_trip)
# 空车智能模式 # 空车智能模式
elif self.group_mode == 2: elif self.group_mode == 2:
self.logger.info("空车智能模式调度") self.logger.info("空车智能模式调度")
self.semi_dynamic_mode(i, s, truck_dispatch, truck_info, truck_task, truck_trip) self.semi_dynamic_mode(truck_id, solver, truck_dispatch, truck_info, truck_task, truck_trip)
# 定铲派车 # 定铲派车
elif self.group_mode == 3: elif self.group_mode == 3:
self.logger.info("固定模式调度") self.logger.info("固定模式调度")
try: try:
truck_dispatch[i] = DispatchInfo.get_truck_match(i) truck_dispatch[truck_id] = DispatchInfo.get_truck_match(truck_id)
except Exception as es: except Exception as es:
self.logger.error("固定派车-计算异常") self.logger.error("固定派车-计算异常")
self.logger.error(es) self.logger.error(es)
...@@ -315,7 +327,7 @@ class Group: ...@@ -315,7 +327,7 @@ class Group:
# 分流配比模式 # 分流配比模式
elif self.group_mode == 4: elif self.group_mode == 4:
self.logger.info("分流配比模式调度") self.logger.info("分流配比模式调度")
self.ratio_mode(i, truck_dispatch, truck_task) self.ratio_mode(truck_id, truck_dispatch, truck_task)
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
...@@ -395,7 +407,8 @@ class Group: ...@@ -395,7 +407,8 @@ class Group:
self.logger.error("空载车辆空车智能模式-计算异常") self.logger.error("空载车辆空车智能模式-计算异常")
self.logger.error(es) self.logger.error(es)
def full_dynamic_mode(self, i, s, truck_dispatch, truck_info, truck_task, truck_trip): def full_dynamic_mode(self, i: str, s: AlgorithmBase, truck_dispatch: Mapping[str, List[str, str]],
truck_info: CurrentTruck, truck_task: int, truck_trip: List[int, int]):
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区 # 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
if truck_task in [-2, 4, 5]: if truck_task in [-2, 4, 5]:
try: try:
...@@ -403,8 +416,6 @@ class Group: ...@@ -403,8 +416,6 @@ class Group:
next_excavator_id = self.truck.truck_excavator_bind[i] next_excavator_id = self.truck.truck_excavator_bind[i]
else: else:
next_excavator_value = s.solve(truck_info) next_excavator_value = s.solve(truck_info)
# next_excavator_value = s.solve(i, truck_task, truck_trip)
# min_index = next_excavator_list.index(min(next_excavator_list))
min_index = np.argmin(next_excavator_value) min_index = np.argmin(next_excavator_value)
next_excavator_id = self.excavator_uuid_index_dict.inverse[min_index] next_excavator_id = self.excavator_uuid_index_dict.inverse[min_index]
......
...@@ -17,6 +17,7 @@ import time ...@@ -17,6 +17,7 @@ import time
from core.dispatcher import Dispatcher from core.dispatcher import Dispatcher
from core.schedule import PreSchedule from core.schedule import PreSchedule
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
from util import CoreException
def direct2redis(): def direct2redis():
...@@ -36,25 +37,20 @@ def direct2redis(): ...@@ -36,25 +37,20 @@ def direct2redis():
truck_disp = {} truck_disp = {}
for item in session_mysql.query(DispatchSetting).filter_by(isdeleted=0, ).all(): for item in session_mysql.query(DispatchSetting).filter_by(isdeleted=0, ).all():
if item is None:
raise CoreException(101, "无可用派车计划")
if item.truck_id not in truck_disp: if item.truck_id not in truck_disp:
record = {"truckId": item.truck_id} record = {"truckId": item.truck_id, "dispatchId": item.id, "exactorId": item.exactor_id,
record["dispatchId"] = item.id "dumpId": item.dump_id, "loadAreaId": item.load_area_id, "unloadAreaId": item.unload_area_id,
record["exactorId"] = item.exactor_id "groupId": item.group_id, "isdeleted": False, "isTemp": False, "haulFlag": -1,
record["dumpId"] = item.dump_id "groupName": DispatchInfo.group_name[item.group_id]}
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id logger.info(f'写入redis调度结果: {record}')
record["groupId"] = item.group_id # 写入redis
record["isdeleted"] = False
record["isTemp"] = False
record["haulFlag"] = -1
record["groupName"] = DispatchInfo.group_name[item.group_id]
logger.info("调度结果")
logger.info(record)
redis5.set(item.truck_id, str(json.dumps(record))) redis5.set(item.truck_id, str(json.dumps(record)))
except Exception as es: except CoreException as ce:
logger.error(es) logger.error(ce)
session_postgre.rollback() session_postgre.rollback()
session_mysql.rollback() session_mysql.rollback()
...@@ -75,12 +71,12 @@ def process(dispatcher): ...@@ -75,12 +71,12 @@ def process(dispatcher):
global_period_para_update() global_period_para_update()
# if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0: if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0:
# raise Exception("无动态派车计划可用") raise CoreException(101, "无可用派车计划")
# return
# if get_value("dynamic_truck_num") == 0: if get_value("dynamic_truck_num") == 0:
# raise Exception("无动态派车可用矿卡") raise CoreException(101, "无可用调度车辆")
# return
# 清空数据库缓存 # 清空数据库缓存
session_mysql.commit() session_mysql.commit()
...@@ -103,28 +99,6 @@ def process(dispatcher): ...@@ -103,28 +99,6 @@ def process(dispatcher):
DispatchInfo.update_group_name() DispatchInfo.update_group_name()
# logger.info
# group_set = set()
#
# # device group structure
# load_excavator_dict = {} # 装载区id-->>电铲编号的映射
# excavator_load_dict = {} # 电铲编号->>装载区id的映射
#
# group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
# excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值
#
# group_dump_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
# dump_group_dict = {} # unload_area_id -> team_id
#
# group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_id],...}
# truck_group_dict = {} # truck_id -> team_id
#
# # group feature
# group_mode = {} # 数据格式: {team_id:mode_code}
#
# # route_distance(路网距离)
# load_distance = {}
# unload_distance = {}
logger.info("Dispatchinfo,更新后信息") logger.info("Dispatchinfo,更新后信息")
logger.info("group_set") logger.info("group_set")
logger.info(DispatchInfo.group_set) logger.info(DispatchInfo.group_set)
......
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/10/8 11:32
# @Author : Opfer
# @Site :
# @File : __init__.py
# @Software: PyCharm
from util.core_exception import CoreException
\ No newline at end of file
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/10/8 11:33
# @Author : Opfer
# @Site :
# @File : core_exception.py
# @Software: PyCharm
code_msg = {101: "调度失败",
102: "车辆不存在或信息缺失",
103: "数组越界异常"}
class CoreException(Exception):
""" class for my exception."""
def __init__(self, Code=None, ErrorInfo=None):
super().__init__(self, ErrorInfo)
self.error_info = ErrorInfo
self.code = Code
def __str__(self):
return '{0:}-{1:}'.format(code_msg[self.code], self.error_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