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

代码优化623

parent db860cc7
...@@ -140,20 +140,28 @@ class ExpectedTime(AlgorithmBase): ...@@ -140,20 +140,28 @@ class ExpectedTime(AlgorithmBase):
self.pre_sch = pre_sch self.pre_sch = pre_sch
self.logger = get_logger("zxt.algorithm.expected") self.logger = get_logger("zxt.algorithm.expected")
def solve(self, truck_id): def solve(self, truck_info):
""" """
Receive a truck_id and calculate the associated route travelling time. Receive a truck_id and calculate the associated route travelling time.
:param truck_id: (uuid) :param truck_info: (current truck obj)
:return: travel_time_value :return: travel_time_value
""" """
try: try:
# truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
# trip = self.truck.get_truck_current_trip()[truck_index]
#
# task = self.truck.get_truck_current_task()[truck_id]
truck_id = truck_info.get_truck_id()
truck_index = self.truck.truck_uuid_to_index_dict[truck_id] truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
trip = self.truck.get_truck_current_trip()[truck_index] trip = truck_info.get_trip()
task = self.truck.get_truck_current_task()[truck_id] task = truck_info.get_task()
truck_avl_time = self.pre_sch.get_truck_avl_time(truck_id=truck_id) truck_avl_time = self.pre_sch.get_truck_avl_time(truck_id=truck_id)
......
{ {
"para": { "para": {
"log_path": "/Users/guoao/Desktop/work_log/wek46/code_1/integrated-scheduling-v4/Logs", "log_path": "/usr/local/fleet-log/dispatch",
"empty_speed": 17, "empty_speed": 17,
"heavy_speed": 17, "heavy_speed": 17,
"dump_target_mass": 5000, "dump_target_mass": 5000,
...@@ -27,4 +27,4 @@ ...@@ -27,4 +27,4 @@
"host": "192.168.9.152", "host": "192.168.9.152",
"password": "Huituo@123" "password": "Huituo@123"
} }
} }
\ No newline at end of file
...@@ -20,6 +20,38 @@ from bidict import bidict ...@@ -20,6 +20,38 @@ from bidict import bidict
from alg.algorithm import AlgorithmBase from alg.algorithm import AlgorithmBase
import numpy as np import numpy as np
class CurrentTruck:
""" class for the information of current dispatching truck.
Description:
当前请求调度卡车信息
Attribute:
truck_id(uuid)
group_id(uuid)
trip(list)
task(int)
"""
def __init__(self, truck_id, group_id, trip, task):
self._truck_id = truck_id
self._group_id = group_id
self._trip = trip
self._task = task
def get_truck_id(self):
return self._truck_id
def get_trip(self):
return self._trip
def get_task(self):
return self._task
def get_group_id(self):
return self._group_id
class Group: class Group:
""" """
...@@ -29,18 +61,17 @@ class Group: ...@@ -29,18 +61,17 @@ class Group:
""" Generate a group obj. """ Generate a group obj.
:param group_id: (uuid) group_id :param group_id: (uuid) group_id
""" """
self.to_unload_area_congestion = None # basic info.
self.group_id = group_id self.group_id = group_id
self.group_mode = 1 self.group_mode = 1
self.truck = truck self.truck = truck
self.pre_sch = pre_sch self.pre_sch = pre_sch
# group devices # group devices
self.excavator = {} # excavator_id -> unload_area_id self.excavators = {} # excavator_id -> unload_area_id
self.unload_area = {} # unload_area_id -> load_area_id self.unload_areas = {} # unload_area_id -> load_area_id
self.truck_set = set() # truck_id self.truck_set = set() # truck_id
# road network info. # road network info.
self.to_excavator_distance = None self.to_excavator_distance = None
self.to_unload_area_distance = None self.to_unload_area_distance = None
...@@ -71,8 +102,8 @@ class Group: ...@@ -71,8 +102,8 @@ class Group:
""" """
# update group devices # update group devices
# DispatchInfo.update_device_group_structure() # DispatchInfo.update_device_group_structure()
self.excavator = DispatchInfo.get_excavator(self.group_id) self.excavators = DispatchInfo.get_excavator(self.group_id)
self.unload_area = DispatchInfo.get_unload_area(self.group_id) self.unload_areas = DispatchInfo.get_unload_area(self.group_id)
self.truck_set = DispatchInfo.get_truck_set(self.group_id) self.truck_set = DispatchInfo.get_truck_set(self.group_id)
def update_group_road_network(self): def update_group_road_network(self):
...@@ -80,7 +111,6 @@ class Group: ...@@ -80,7 +111,6 @@ class Group:
update group road network. update group road network.
:return: :return:
""" """
# update group road network
# DispatchInfo.update_route_distance() # DispatchInfo.update_route_distance()
self.to_excavator_distance = DispatchInfo.get_to_excavator_distance(self.group_id) self.to_excavator_distance = DispatchInfo.get_to_excavator_distance(self.group_id)
self.to_unload_area_distance = DispatchInfo.get_to_unload_area_distance(self.group_id) self.to_unload_area_distance = DispatchInfo.get_to_unload_area_distance(self.group_id)
...@@ -91,13 +121,12 @@ class Group: ...@@ -91,13 +121,12 @@ class Group:
update group device map. update group device map.
:return: :return:
""" """
# update device map
# excavator_index = 0 # excavator_index = 0
for i in range(len(self.excavator)): for i in range(len(self.excavators)):
self.excavator_uuid_index_dict[list(self.excavator)[i]] = i self.excavator_uuid_index_dict[list(self.excavators)[i]] = i
for i in range(len(self.unload_area)): for i in range(len(self.unload_areas)):
self.unload_area_uuid_index_dict[list(self.unload_area)[i]] = i self.unload_area_uuid_index_dict[list(self.unload_areas)[i]] = i
for i in range(len(self.truck_set)): for i in range(len(self.truck_set)):
self.truck_uuid_index_dict[list(self.truck_set)[i]] = i self.truck_uuid_index_dict[list(self.truck_set)[i]] = i
...@@ -127,6 +156,7 @@ class Group: ...@@ -127,6 +156,7 @@ class Group:
""" """
truck_dispatch = {} truck_dispatch = {}
# 全智能模式
if self.group_mode == 1: if self.group_mode == 1:
assert issubclass(solver, AlgorithmBase) assert issubclass(solver, AlgorithmBase)
s = solver(self, self.truck, self.pre_sch) # algorithm init s = solver(self, self.truck, self.pre_sch) # algorithm init
...@@ -134,8 +164,9 @@ class Group: ...@@ -134,8 +164,9 @@ class Group:
for i in list(self.truck_set): for i in list(self.truck_set):
truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]] truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]]
truck_task = self.truck.get_truck_current_task()[i] truck_task = self.truck.get_truck_current_task()[i]
truck_info = CurrentTruck(i, self.group_id, truck_trip, truck_task)
if truck_task in [-2, 3, 4]: if truck_task in [-2, 3, 4]:
next_excavator_value = s.solve(i) next_excavator_value = s.solve(i, truck_info)
# min_index = next_excavator_list.index(min(next_excavator_list)) # 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]
...@@ -152,15 +183,16 @@ class Group: ...@@ -152,15 +183,16 @@ class Group:
next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]] next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id] truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
# 空车智能模式 # 空车智能模式
if self.group_mode == 2: elif self.group_mode == 2:
assert issubclass(solver, AlgorithmBase) assert issubclass(solver, AlgorithmBase)
s = solver(self, self.truck, self.pre_sch) # algorithm init s = solver(self, self.truck, self.pre_sch) # algorithm init
for i in list(self.truck_set): for i in list(self.truck_set):
truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]] truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]]
truck_task = self.truck.get_truck_current_task()[i] truck_task = self.truck.get_truck_current_task()[i]
truck_info = CurrentTruck(i, self.group_id, truck_trip, truck_task)
if truck_task in [-2, 3, 4]: if truck_task in [-2, 3, 4]:
next_excavator_value = s.solve(i) next_excavator_value = s.solve(i, truck_info)
# min_index = next_excavator_list.index(min(next_excavator_list)) # 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]
...@@ -170,70 +202,14 @@ class Group: ...@@ -170,70 +202,14 @@ class Group:
next_unload_area_id = self.unload_area_uuid_index_dict.inverse[truck_trip[-1]] next_unload_area_id = self.unload_area_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id] truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
if truck_task in [0, 1]: if truck_task in [0, 1]:
truck_dispatch[i] = DispatchInfo.get_truck_team_trip(i) truck_dispatch[i] = DispatchInfo.get_truck_match(i)
# 定铲派车
if self.group_mode == 3: elif self.group_mode == 3:
for i in list(self.truck_set): for i in list(self.truck_set):
truck_dispatch[i] = DispatchInfo.get_truck_team_trip(i) truck_dispatch[i] = DispatchInfo.get_truck_match(i)
if self.group_mode == 4: elif self.group_mode == 4:
pass pass
# return dispatch plan # return dispatch plan
return truck_dispatch return truck_dispatch
\ No newline at end of file
# from data.dispatchInfo import DispatchInfo
# from bidict import bidict
# from alg.algorithm import AlgorithmBase
#
#
# class Group_0:
# """
# class for group instance.
# """
# def __init__(self, group_id):
# """ Generate a group obj.
# :param group_id: (uuid) group_id
# """
#
# self.group_id = group_id
#
# # group devices
# self.excavator_dict = {} # excavator_id -> unload_area_id
# self.unload_area = {} # unload_area_id -> load_area_id
# self.truck_set = set() # truck_id
#
# # road network info.
# self.to_excavator_distance = None
# self.to_unload_area_distance = None
# self.park_to_excavator_distance = None
#
# self.to_excavator_congestion = None
# self.to_unload_area_congestion = None
# self.park_to_excavator_congestion = None
#
# # device map
# self.truck_uuid_index_dict = bidict()
# self.excavator_uuid_index_dict = bidict()
# self.unload_area_uuid_index_dict = bidict()
#
# def update_xx_(self):
# """
# update above parameters.
# :return:
# """
# pass
#
# def group_dispatch(self, solver):
# """
# Receive a alg obj. and output dispatch plan for trucks in this group.
# :param solver:
# :return:
# dispatch plan: Dict({truck_id: match_id})
# """
# assert isinstance(solver, AlgorithmBase)
# s = solver(self) # algorithm init
# return s.solve() # algorithm solve
...@@ -24,16 +24,19 @@ class DispatchInfo: ...@@ -24,16 +24,19 @@ class DispatchInfo:
load_excavator_dict = {} # 装载区id-->>电铲编号的映射 load_excavator_dict = {} # 装载区id-->>电铲编号的映射
excavator_load_dict = {} # 电铲编号->>装载区id的映射 excavator_load_dict = {} # 电铲编号->>装载区id的映射
# excavator <-> team_id
group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...} group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值 excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值
# unload_area <-> team_id
group_unload_area_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...} group_unload_area_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
unload_area_group_dict = {} # unload_area_id -> team_id unload_area_group_dict = {} # unload_area_id -> team_id
# truck_id <-> team_id
group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_id],...} group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_id],...}
truck_group_dict = {} # truck_id -> team_id truck_group_dict = {} # truck_id -> team_id
# group feature # group mode
group_mode = {} # 数据格式: {team_id:mode_code} group_mode = {} # 数据格式: {team_id:mode_code}
# route_distance(路网距离) # route_distance(路网距离)
...@@ -43,10 +46,11 @@ class DispatchInfo: ...@@ -43,10 +46,11 @@ class DispatchInfo:
# group_name <-> group_id # group_name <-> group_id
group_name = {} group_name = {}
truck_team_trip_dict = {} # truck -> match(excavator_id, unload_area_id)
truck_match_dict = {}
@classmethod @classmethod
def renew_set(cls): def reset(cls):
""" """
@date:2022/6/2 19:50 @date:2022/6/2 19:50
@author:maqc @author:maqc
...@@ -71,7 +75,7 @@ class DispatchInfo: ...@@ -71,7 +75,7 @@ class DispatchInfo:
cls.load_distance = {} cls.load_distance = {}
cls.unload_distance = {} cls.unload_distance = {}
cls.truck_team_trip_dict = {} cls.truck_match_dict = {}
# cls.group_unload_area_dict = {} # cls.group_unload_area_dict.keys() 相当于所有的team_id # cls.group_unload_area_dict = {} # cls.group_unload_area_dict.keys() 相当于所有的team_id
# cls.unload_area_group_dict = {} # cls.unload_area_group_dict.keys() 相当于所有的卸载区 unload_area_id # cls.unload_area_group_dict = {} # cls.unload_area_group_dict.keys() 相当于所有的卸载区 unload_area_id
...@@ -93,7 +97,7 @@ class DispatchInfo: ...@@ -93,7 +97,7 @@ class DispatchInfo:
@desc:分组与卸载区、挖机、矿卡的映射和反映射 @desc:分组与卸载区、挖机、矿卡的映射和反映射
""" """
logger = get_logger("mqc.update_device_group_structure") logger = get_logger("mqc.update_device_group_structure")
# build excavator group map # update excavator_id <-> load_area_id
try: try:
for item in session_mysql.query(DispatchSetting).all(): for item in session_mysql.query(DispatchSetting).all():
...@@ -104,7 +108,7 @@ class DispatchInfo: ...@@ -104,7 +108,7 @@ class DispatchInfo:
logger.error("挖机和装载区映射更新异常") logger.error("挖机和装载区映射更新异常")
logger.error(es) logger.error(es)
# update excavator<->group and unload_area<->group map # update excavator_id <-> group_id && unload_area_id <-> group_id && truck_id <-> group_id
try: try:
for item in session_mysql.query(DispatchSetting).filter_by(group_type=1).all(): for item in session_mysql.query(DispatchSetting).filter_by(group_type=1).all():
...@@ -142,13 +146,13 @@ class DispatchInfo: ...@@ -142,13 +146,13 @@ class DispatchInfo:
except Exception as es: except Exception as es:
logger.error(es) logger.error(es)
# update truck->team id dict # update truck_id <-> match_id(excavator_id, unload_area_id)
try: try:
trucks = cls.truck_group_dict.keys() trucks = cls.truck_group_dict.keys()
for i in trucks: for i in trucks:
trip_excavator = session_mysql.query(DispatchSetting).filter_by(truck_id=i).first().exactor_id match_excavator = session_mysql.query(DispatchSetting).filter_by(truck_id=i).first().exactor_id
trip_unload_area = session_mysql.query(DispatchSetting).filter_by(truck_id=i).first().unload_area_id match_unload_area = session_mysql.query(DispatchSetting).filter_by(truck_id=i).first().unload_area_id
cls.truck_team_trip_dict[i] = [trip_excavator, trip_unload_area] cls.truck_match_dict[i] = [match_excavator, match_unload_area]
except Exception as es: except Exception as es:
logger.error(es) logger.error(es)
...@@ -179,7 +183,7 @@ class DispatchInfo: ...@@ -179,7 +183,7 @@ class DispatchInfo:
@author:zxtc @author:zxtc
@desc:处理 group name @desc:处理 group name
""" """
# update group_id->mode_code # update group_id->mode_name
logger = get_logger("zxt.update_group_name") logger = get_logger("zxt.update_group_name")
cls.group_name = {} cls.group_name = {}
try: try:
...@@ -202,16 +206,17 @@ class DispatchInfo: ...@@ -202,16 +206,17 @@ class DispatchInfo:
try: try:
groups = cls.group_excavator_dict.keys() groups = cls.group_excavator_dict.keys()
for item in groups: for item in groups:
# 每个组的 excavator_id
# 每个组的 excavator_id 及对应 load_area_id
excavator_ids = cls.group_excavator_dict[item] excavator_ids = cls.group_excavator_dict[item]
# 每个组的load_areas
load_areas = [] load_areas = []
for excavator_id in excavator_ids: for excavator_id in excavator_ids:
load_areas.append(cls.excavator_load_dict[excavator_id]) load_areas.append(cls.excavator_load_dict[excavator_id])
# 每个组的unload_areas # 每个组的unload_areas
unload_areas = cls.group_unload_area_dict[item] unload_areas = cls.group_unload_area_dict[item]
# unload->load 路网 # unload->load distance
unload_load_distance = np.zeros((len(unload_areas), len(load_areas))) unload_load_distance = np.zeros((len(unload_areas), len(load_areas)))
for i in range(len(unload_areas)): for i in range(len(unload_areas)):
for j in range(len(load_areas)): for j in range(len(load_areas)):
...@@ -219,7 +224,7 @@ class DispatchInfo: ...@@ -219,7 +224,7 @@ class DispatchInfo:
unload_load_distance[i][j] = distance unload_load_distance[i][j] = distance
cls.load_distance[item] = unload_load_distance cls.load_distance[item] = unload_load_distance
# load->unload 路网 # load->unload distance
load_unload_distance = np.zeros((len(load_areas), len(unload_areas))) load_unload_distance = np.zeros((len(load_areas), len(unload_areas)))
for i in range(len(load_areas)): for i in range(len(load_areas)):
for j in range(len(unload_areas)): for j in range(len(unload_areas)):
...@@ -261,8 +266,8 @@ class DispatchInfo: ...@@ -261,8 +266,8 @@ class DispatchInfo:
return cls.unload_distance[group_id] return cls.unload_distance[group_id]
@classmethod @classmethod
def get_truck_team_trip(cls, truck_id): def get_truck_match(cls, truck_id):
return cls.truck_team_trip_dict[truck_id] return cls.truck_match_dict[truck_id]
@classmethod @classmethod
......
...@@ -86,7 +86,7 @@ def process(dispatcher): ...@@ -86,7 +86,7 @@ def process(dispatcher):
global_period_para_update() global_period_para_update()
# 更新调度信息 # 更新调度信息
DispatchInfo.renew_set() DispatchInfo.reset()
DispatchInfo.update_device_group_structure() DispatchInfo.update_device_group_structure()
......
...@@ -60,15 +60,15 @@ def set_log(): ...@@ -60,15 +60,15 @@ def set_log():
# 创建日志目录 # 创建日志目录
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()
# 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, encoding="utf-8") # filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=3*1024*1024, backupCount=10, encoding="utf-8")
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10, encoding="utf-8") filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10, encoding="utf-8")
# 设置后缀名称,跟strftime的格式一样 # 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log" filehandler.suffix = "%Y-%m-%d_%H-%M.log"
......
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