Unverified Commit f6a1750a authored by Allvey's avatar Allvey Committed by GitHub

Merge pull request #2 from Allvey/github

GitHub
parents bbbfd63c 742b6428
This diff is collapsed.
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
# @Time : 2022/1/5 14:14 # @Time : 2022/1/5 14:14
# @Author : Opfer # @Author : Opfer
# @Site : # @Site :
# @File : algorithm.py # @File : alg.py
# @Software: PyCharm # @Software: PyCharm
...@@ -13,7 +13,7 @@ from equipment.dump import DumpInfo ...@@ -13,7 +13,7 @@ from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
class ScheduleAlg(WalkManage): class ScheduleAlg(WalkManage):
""" class for the schedule algorithm. """ class for the schedule alg.
Description: Description:
根据设备状态计算调度价值 根据设备状态计算调度价值
......
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/6/1 16:35
# @Author : Opfer
# @Site :
# @File : dispatcher.py
# @Software: PyCharm
from data.dispatchInfo import DispatchInfo
from core.group import Group
from alg.algorithm import ExpectedTime
from settings import get_logger, session_mysql, redis5
from tables import Dispatch
from para_config import DeviceMap, get_value, global_period_para_update
from equipment import TruckInfo, ExcavatorInfo, DumpInfo
from core.schedule import PreSchedule
import json
import numpy as np
from datetime import datetime, timedelta
class Dispatcher:
"""
class for group dispatch program.
"""
def __init__(self, truck: TruckInfo, dump: DumpInfo, excavator: ExcavatorInfo, pre_sch: PreSchedule, request_mode=False):
self.group_list = []
self.truck = truck
self.dump = dump
self.excavator = excavator
self.submission = DispatchSubmission(dump, excavator, truck)
def period_update(self):
"""
Update global parameter and equipment information.
:return: None
"""
# global_period_para_update()
self.dump.dump_para_period_update()
self.excavator.excavator_para_period_update()
self.truck.truck_para_period_update(self.dump, self.excavator)
self.truck.state_period_update()
def group_generate(self):
"""
Generate and initialize dispatch groups.
:return: None
"""
for group_id in DispatchInfo.group_dump_dict.keys():
group = Group(group_id, self.truck)
self.group_list.append(group)
def group_dispatch(self):
"""
Group dispatching logic.
:return:
"""
for group in self.group_list:
truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
self.submission.group_dispatch_to_redis(group, truck_dispatch_plan_dict)
class DispatchSubmission:
""" class for the submission calculated dispatch.
Description:
将调度结果按照指定格式传递到云端机群
Attribute:
"""
def __init__(self, dump, excavator, truck):
self.logger = self.logger = get_logger("zxt.submission")
self.dump = dump
self.excavator = excavator
self.truck = truck
def truck_dispatch_to_redis(self, truck_id, dispatch_seq):
"""
将truck_id对应矿卡派车计划写入redis
:param truck_id: (uuid) 矿卡uuid
:param dispatch_seq: (List[int]) 矿卡派车计划
:return: None
"""
try:
try:
group_id = self.group.dispatch_truck_group[truck_id]
record = {"truckId": truck_id}
task = self.truck.get_truck_current_task()[truck_id]
except Exception as es:
self.logger.error("调度结果写入异常-读取矿卡信息异常(uuid, group id, task)")
self.logger.error(es)
if task in [0, 1, 2]: # 卡车空载或在装载区出场前, 可变更卸载目的地
try:
item = (
session_mysql.query(Dispatch)
.filter_by(dump_id=DeviceMap.dump_index_to_uuid_dict[dispatch_seq[1]],
exactor_id=DeviceMap.excavator_index_to_uuid_dict[dispatch_seq[0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
self.logger.error(es)
item = (
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
try:
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %I:%M:%S %p")
redis5.set(truck_id, str(json.dumps(record)))
except Exception as es:
self.logger.error("调度结果写入异常-矿卡空载")
elif task in [3, 4, 5]: # 卡车重载或在卸载区出场前, 可变更装载目的地
try:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[dispatch_seq[1]],
dump_id=DeviceMap.dump_index_to_uuid_dict[dispatch_seq[0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
self.logger.error(es)
item = (
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
try:
record["exactorId"] = self.excavator.excavator_index_to_uuid_dict[dispatch_seq[1]]
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %I:%M:%S %p")
redis5.set(truck_id, str(json.dumps(record)))
except Exception as es:
self.logger.error("调度结果写入异常-矿卡重载")
elif task == -2:
try:
try:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[dispatch_seq[1]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
self.logger.info(dispatch_seq)
self.logger.info(dispatch_seq[1])
self.logger.info(DeviceMap.excavator_index_to_uuid_dict[dispatch_seq[1]])
self.logger.info("item")
print(item.id, item.truck_id, item.exactor_id, item.dump_id)
except Exception as es:
self.logger.error(es)
item = (
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0).first())
try:
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %I:%M:%S %p")
redis5.set(truck_id, str(json.dumps(record)))
except Exception as es:
self.logger.error("调度结果写入异常-矿卡故障或备停区-redis写入异常")
self.logger.error(es)
except Exception as es:
self.logger.error("调度结果写入异常-矿卡故障或备停区")
self.logger.error(es)
else:
pass
except Exception as es:
self.logger.error("调度结果写入异常")
self.logger.error(f"调度结果:{dispatch_seq}")
self.logger.error(es)
def group_dispatch_to_redis(self, group: Group, dispatch_plan_dict):
"""
Update the dispatch plan in the group to redis
:param group: (Group)
:param dispatch_plan_dict: (Dict)
:return: None
"""
for truck_id, dispatch_plan in dispatch_plan_dict:
self.truck_dispatch_to_redis(truck_id, dispatch_plan)
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/5/30 15:35
# @Author : Opfer
# @Site :
# @File : group.py
# @Software: PyCharm
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/5/30 15:35
# @Author : Opfer
# @Site :
# @File : group.py
# @Software: PyCharm
from data.dispatchInfo import DispatchInfo
from bidict import bidict
from alg.algorithm import AlgorithmBase
class Group:
"""
class for group instance.
"""
def __init__(self, group_id, truck):
""" Generate a group obj.
:param group_id: (uuid) group_id
"""
self.to_dump_congestion = None
self.group_id = group_id
self.group_mode = 1
self.truck = truck
# group devices
self.excavator_dict = {} # excavator_id -> unload_area_id
self.dump_dict = {} # dump_id -> load_area_id
self.truck_set = set() # truck_id
# road network info.
self.to_excavator_distance = None
self.to_dump_distance = None
self.park_to_excavator_distance = None
# self.to_excavator_congestion = None
# self.to_dump_congestion = None
# self.park_to_excavator_congestion = None
# device map
self.truck_uuid_index_dict = bidict()
self.excavator_uuid_index_dict = bidict()
self.dump_uuid_index_dict = bidict()
def update_group_mode(self):
"""
update group mode.
:param group_mode:
:return:
"""
# DispatchInfo.update_group_mode()
self.group_mode = DispatchInfo.get_group_mode(self.group_id)
def update_group_device(self):
"""
update group devices.
:return:
"""
# update group devices
# DispatchInfo.update_device_group_structure()
self.excavator_dict = DispatchInfo.get_excavator_dict(self.group_id)
self.dump_dict = DispatchInfo.get_dump_dict(self.group_id)
self.truck_set = DispatchInfo.get_truck_set(self.group_id)
def update_group_road_network(self):
"""
update group road network.
:return:
"""
# update group road network
# DispatchInfo.update_route_distance()
self.to_excavator_distance = DispatchInfo.get_to_excavator_distance(self.group_id)
self.to_dump_distance = DispatchInfo.get_to_dump_distance(self.group_id)
self.park_to_excavator_distance = DispatchInfo.get_park_to_excavator_distance(self.group_id)
def update_group_device_map(self):
"""
update group device map.
:return:
"""
# update device map
excavator_index = 0
for i in self.excavator_dict.keys():
self.excavator_uuid_index_dict[i] = excavator_index + 1
dump_index = 0
for i in self.dump_dict.keys():
self.dump_uuid_index_dict[i] = dump_index + 1
truck_index = 0
for i in self.truck_set:
self.truck_uuid_index_dict[i] = truck_index + 1
self.truck_uuid_index_dict = bidict(self.truck_uuid_index_dict)
self.excavator_uuid_index_dict = bidict(self.excavator_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 group_dispatch(self, solver: object):
"""
Receive a alg obj. and output dispatch plan for trucks in this group.
:param solver:
:return:
dispatch plan: Dict({truck_id: match_id})
"""
truck_dispatch = {}
assert issubclass(solver, AlgorithmBase)
s = solver(self) # algorithm init
# update truck task type
for i in self.truck_set:
truck_trip = self.truck.get_truck_current_trip(i)
truck_task = self.truck.get_truck_current_task(i)
if truck_task in [-2, 3, 4]:
next_excavator_list = s.solve(i)
min_index = next_excavator_list.index(min(next_excavator_list)) + 1
next_excavator_id = self.excavator_uuid_index_dict.inverse[min_index]
next_dump_id = truck_trip[-1]
truck_dispatch[i] = [next_excavator_id, next_dump_id]
if truck_task in [0, 1]:
next_dump_list = s.solve(i)
min_index = next_dump_list.index(min(next_dump_list)) + 1
next_dump_id = self.dump_uuid_index_dict.inverse[min_index]
next_excavator_id = truck_trip[-1]
truck_dispatch[i] = [next_excavator_id, next_dump_id]
# return dispatch plan
return truck_dispatch
# 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.dump_dict = {} # dump_id -> load_area_id
# self.truck_set = set() # truck_id
#
# # road network info.
# self.to_excavator_distance = None
# self.to_dump_distance = None
# self.park_to_excavator_distance = None
#
# self.to_excavator_congestion = None
# self.to_dump_congestion = None
# self.park_to_excavator_congestion = None
#
# # device map
# self.truck_uuid_index_dict = bidict()
# self.excavator_uuid_index_dict = bidict()
# self.dump_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
This diff is collapsed.
This diff is collapsed.
...@@ -855,9 +855,12 @@ class PreSchedule: ...@@ -855,9 +855,12 @@ class PreSchedule:
self.truck_reach_excavator = np.zeros(self.truck.get_truck_num()) self.truck_reach_excavator = np.zeros(self.truck.get_truck_num())
self.excavator_avl_time = np.zeros(self.excavator.get_excavator_num()) self.excavator_avl_time = np.zeros(self.excavator.get_excavator_num())
self.dump_avl_time = np.zeros(self.dump.get_dump_num()) self.dump_avl_time = np.zeros(self.dump.get_dump_num())
# 卡车完成装载及卸载时间(矿卡可用时间)
self.truck_avl_time = np.zeros(self.truck.get_truck_num()) self.truck_avl_time = np.zeros(self.truck.get_truck_num())
self.excavator_avl_time_dict = {}
self.dump_avl_time_dict = {}
self.truck_avl_time_dict = {}
self.logger = get_logger("zxt.pre_schedule") self.logger = get_logger("zxt.pre_schedule")
def update_truck_reach_time(self): def update_truck_reach_time(self):
...@@ -925,6 +928,10 @@ class PreSchedule: ...@@ -925,6 +928,10 @@ class PreSchedule:
/ timedelta(hours=0, minutes=1, seconds=0), / timedelta(hours=0, minutes=1, seconds=0),
) )
for excavator_id in get_value("dynamic_excavator_set"):
self.excavator_avl_time_dict[excavator_id] = (datetime.now() - self.start_time) \
/ timedelta(hours=0, minutes=1, seconds=0)
loading_time = self.excavator.get_loading_time() loading_time = self.excavator.get_loading_time()
loading_task_time = self.excavator.get_loading_task_time() loading_task_time = self.excavator.get_loading_task_time()
...@@ -943,14 +950,19 @@ class PreSchedule: ...@@ -943,14 +950,19 @@ class PreSchedule:
reach_ls = np.array(reach_ls) reach_ls = np.array(reach_ls)
tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)] tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)]
for i in range(len(tmp)): for i in range(len(tmp)):
excavator_index = int(tmp[i][2]) excavator_index = int(tmp[i][2])
excavator_id = self.excavator.excavator_index_to_uuid_dict[excavator_index]
self.excavator_avl_time[excavator_index] = ( self.excavator_avl_time[excavator_index] = (
max(tmp[i][0], self.excavator_avl_time[excavator_index]) max(tmp[i][0], self.excavator_avl_time[excavator_index])
+ loading_task_time[excavator_index] + loading_task_time[excavator_index]
) )
self.truck_avl_time[ self.excavator_avl_time_dict[excavator_id] = self.excavator_avl_time[excavator_index]
int(tmp[i][1])
] = self.excavator_avl_time[excavator_index] truck_index = int(tmp[i][1])
truck_id = self.truck.truck_index_to_uuid_dict[truck_index]
self.truck_avl_time[truck_index] = self.excavator_avl_time[excavator_index]
self.truck_avl_time_dict[truck_id] = self.truck_avl_time[truck_index]
# # 若挖机可用时间严重偏离,进行修正 # # 若挖机可用时间严重偏离,进行修正
# if abs(self.excavator_avl_time[excavator_index] - now) > 60: # if abs(self.excavator_avl_time[excavator_index] - now) > 60:
...@@ -961,7 +973,7 @@ class PreSchedule: ...@@ -961,7 +973,7 @@ class PreSchedule:
self.logger.error("挖机可用时间计算异常") self.logger.error("挖机可用时间计算异常")
self.logger.error(es) self.logger.error(es)
return self.excavator_avl_time return self.excavator_avl_time_dict
def update_dump_avl_time(self, dump_avl_ls): def update_dump_avl_time(self, dump_avl_ls):
""" """
...@@ -981,6 +993,10 @@ class PreSchedule: ...@@ -981,6 +993,10 @@ class PreSchedule:
/ timedelta(hours=0, minutes=1, seconds=0), / timedelta(hours=0, minutes=1, seconds=0),
) )
for dump_id in get_value("dynamic_dump_set"):
self.dump_avl_time_dict[dump_id] = (datetime.now() - self.start_time) \
/ timedelta(hours=0, minutes=1, seconds=0)
unloading_time = self.dump.get_unloading_time() unloading_time = self.dump.get_unloading_time()
unloading_task_time = self.dump.get_unloading_task_time() unloading_task_time = self.dump.get_unloading_task_time()
...@@ -997,14 +1013,19 @@ class PreSchedule: ...@@ -997,14 +1013,19 @@ class PreSchedule:
reach_ls = np.array(reach_ls) reach_ls = np.array(reach_ls)
tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)] tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)]
for i in range(len(tmp)): for i in range(len(tmp)):
dump_index = int(tmp[i][2]) dump_index = int(tmp[i][2])
dump_id = self.dump.dump_index_to_uuid_dict[dump_index]
self.dump_avl_time[dump_index] = ( self.dump_avl_time[dump_index] = (
max(tmp[i][0], self.dump_avl_time[dump_index]) max(tmp[i][0], self.dump_avl_time[dump_index])
+ unloading_task_time[dump_index] + unloading_task_time[dump_index]
) )
self.truck_avl_time[ self.dump_avl_time_dict[dump_id] = self.dump_avl_time[dump_index]
int(tmp[i][1])
] = self.dump_avl_time[dump_index] truck_index = int(tmp[i][1])
truck_id = self.truck.truck_index_to_uuid_dict[truck_index]
self.truck_avl_time[truck_index] = self.dump_avl_time[dump_index]
self.truck_avl_time_dict[truck_id] = self.truck_avl_time[truck_index]
# # 若卸载设备可用时间严重偏离,进行修正 # # 若卸载设备可用时间严重偏离,进行修正
# if abs(self.dump_avl_time[dump_index] - now) > 60: # if abs(self.dump_avl_time[dump_index] - now) > 60:
...@@ -1015,7 +1036,7 @@ class PreSchedule: ...@@ -1015,7 +1036,7 @@ class PreSchedule:
self.logger.error("卸载设备可用时间计算异常") self.logger.error("卸载设备可用时间计算异常")
self.logger.error(es) self.logger.error(es)
return self.dump_avl_time return self.dump_avl_time_dict
def _reset(self): def _reset(self):
""" """
...@@ -1027,9 +1048,12 @@ class PreSchedule: ...@@ -1027,9 +1048,12 @@ class PreSchedule:
self.truck_reach_excavator = np.zeros(self.truck.get_truck_num()) self.truck_reach_excavator = np.zeros(self.truck.get_truck_num())
self.excavator_avl_time = np.zeros(self.excavator.get_excavator_num()) self.excavator_avl_time = np.zeros(self.excavator.get_excavator_num())
self.dump_avl_time = np.zeros(self.dump.get_dump_num()) self.dump_avl_time = np.zeros(self.dump.get_dump_num())
# 卡车完成装载及卸载时间(矿卡可用时间)
self.truck_avl_time = np.zeros(self.truck.get_truck_num()) self.truck_avl_time = np.zeros(self.truck.get_truck_num())
self.excavator_avl_time_dict = {}
self.dump_avl_time_dict = {}
self.truck_avl_time_dict = {}
def get_dump_avl_time(self): def get_dump_avl_time(self):
""" """
获取卸载点最早可用时间 获取卸载点最早可用时间
......
...@@ -5,3 +5,7 @@ ...@@ -5,3 +5,7 @@
# @Site : # @Site :
# @File : __init__.py # @File : __init__.py
# @Software: PyCharm # @Software: PyCharm
from .excavator import ExcavatorInfo
from .dump import DumpInfo
from .truck import TruckInfo
...@@ -421,7 +421,6 @@ def get_global_para_from_cache(cache): ...@@ -421,7 +421,6 @@ def get_global_para_from_cache(cache):
global_dict = cache.get("global_dict") global_dict = cache.get("global_dict")
if global_dict is None: if global_dict is None:
print("here2")
global_period_para_update() global_period_para_update()
cache.set("global_dict", global_dict, timeout=5 * 60) cache.set("global_dict", global_dict, timeout=5 * 60)
......
...@@ -14,7 +14,9 @@ from equipment.excavator import ExcavatorInfo ...@@ -14,7 +14,9 @@ from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
import sched import sched
import time import time
from dispatcher import Dispatcher, PreSchedule from core.dispatcher import Dispatcher
from core.schedule import PreSchedule
from data.dispatchInfo import DispatchInfo
def process(dispatcher): def process(dispatcher):
...@@ -24,7 +26,7 @@ def process(dispatcher): ...@@ -24,7 +26,7 @@ def process(dispatcher):
:return: None :return: None
""" """
try: # try:
# 更新周期参数 # 更新周期参数
logger.info("#####################################周期更新开始#####################################") logger.info("#####################################周期更新开始#####################################")
...@@ -45,18 +47,31 @@ def process(dispatcher): ...@@ -45,18 +47,31 @@ def process(dispatcher):
session_postgre.commit() session_postgre.commit()
session_postgre.flush() session_postgre.flush()
# 周期更新 global_period_para_update()
dispatcher.dispatcher_period_update()
# 更新数据
DispatchInfo.renew_set()
DispatchInfo.dispatch_group_init()
DispatchInfo.update_device_group_structure()
DispatchInfo.update_route_distance()
DispatchInfo.update_group_mode()
# 调度计算 # 调度生成
dispatcher.schedule_construct() dispatcher.period_update()
dispatcher.group_generate()
logger.info("#####################################周期更新结束#####################################") dispatcher.group_dispatch()
except Exception as es: # logger.info("#####################################周期更新结束#####################################")
logger.error("最外层异常捕获") #
logger.error(es) # except Exception as es:
# logger.error("最外层异常捕获")
# logger.error(es)
def perform(inc, dispatcher): def perform(inc, dispatcher):
...@@ -103,7 +118,7 @@ if __name__ == "__main__": ...@@ -103,7 +118,7 @@ if __name__ == "__main__":
pre_sch = PreSchedule(truck, excavator, dump) pre_sch = PreSchedule(truck, excavator, dump)
# 实例化矿卡调度器 # 实例化矿卡调度器
dispatcher = Dispatcher(dump, excavator, truck, pre_sch, False) dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False)
logger.info(" ") logger.info(" ")
logger.info("调度系统启动") logger.info("调度系统启动")
......
...@@ -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"
......
...@@ -15,9 +15,11 @@ from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN ...@@ -15,9 +15,11 @@ from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN
from sqlalchemy.orm import sessionmaker, scoped_session from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from urllib.parse import quote from urllib.parse import quote
import json import json, os
json_file = "config.json" relative_path = os.path.dirname(os.path.abspath(__file__)) # 获取当前文件夹的绝对路径
json_file = os.path.join(relative_path, "config.json")
# json_file = "config.json"
with open(json_file) as f: with open(json_file) as f:
mysql_config = json.load(f)["mysql"] mysql_config = json.load(f)["mysql"]
...@@ -207,6 +209,7 @@ class WalkTime(Base): ...@@ -207,6 +209,7 @@ class WalkTime(Base):
# self.walktime_load = walktime_load # self.walktime_load = walktime_load
# self.walktime_unload = walktime_unload # self.walktime_unload = walktime_unload
# class Truck(Base): # class Truck(Base):
# __tablename__ = 'truck_status' # __tablename__ = 'truck_status'
# #
...@@ -262,7 +265,8 @@ class EquipmentPair(Base): ...@@ -262,7 +265,8 @@ class EquipmentPair(Base):
isdeleted = Column(BOOLEAN) isdeleted = Column(BOOLEAN)
createtime = Column(DateTime) createtime = Column(DateTime)
def __init__(self, id, truck_id, exactor_id, dump_id, load_area_id, unload_area_id, dispatch_id, isdeleted, createtime): def __init__(self, id, truck_id, exactor_id, dump_id, load_area_id, unload_area_id, dispatch_id, isdeleted,
createtime):
self.id = id self.id = id
self.truck_id = truck_id self.truck_id = truck_id
self.exactor_id = exactor_id self.exactor_id = exactor_id
...@@ -273,6 +277,7 @@ class EquipmentPair(Base): ...@@ -273,6 +277,7 @@ class EquipmentPair(Base):
self.isdeleted = isdeleted self.isdeleted = isdeleted
self.createtime = createtime self.createtime = createtime
# class Lane(Base): # class Lane(Base):
# # 表的名字 # # 表的名字
# __tablename__ = 'Geo_Node' # __tablename__ = 'Geo_Node'
...@@ -295,6 +300,7 @@ class Lane(Base): ...@@ -295,6 +300,7 @@ class Lane(Base):
self.Length = Length self.Length = Length
self.MaxSpeed = MaxSpeed self.MaxSpeed = MaxSpeed
class Dispatch(Base): class Dispatch(Base):
# 表的名字: # 表的名字:
__tablename__ = 'sys_dispatch_setting' __tablename__ = 'sys_dispatch_setting'
...@@ -317,7 +323,8 @@ class Dispatch(Base): ...@@ -317,7 +323,8 @@ class Dispatch(Base):
deletor = Column(VARCHAR(36)) deletor = Column(VARCHAR(36))
deletetime = Column(DateTime) deletetime = Column(DateTime)
def __init__(self, id, load_area_id, exactor_id, unload_area_id, dump_id, isauto, truck_id, group_id, remark, proportion_id, def __init__(self, id, load_area_id, exactor_id, unload_area_id, dump_id, isauto, truck_id, group_id, remark,
proportion_id,
isdeleted, creator, createtime, updator, updatetime, deletor, deletetime): isdeleted, creator, createtime, updator, updatetime, deletor, deletetime):
self.id = id self.id = id
self.load_area_id = load_area_id self.load_area_id = load_area_id
...@@ -337,6 +344,7 @@ class Dispatch(Base): ...@@ -337,6 +344,7 @@ class Dispatch(Base):
self.deletor = deletor self.deletor = deletor
self.deletetime = deletetime self.deletetime = deletetime
class WalkTimePark(Base): class WalkTimePark(Base):
__tablename__ = 'park_load_distance' __tablename__ = 'park_load_distance'
...@@ -355,6 +363,7 @@ class WalkTimePark(Base): ...@@ -355,6 +363,7 @@ class WalkTimePark(Base):
self.park_load_distance = park_load_distance self.park_load_distance = park_load_distance
self.park_load_lanes = park_load_lanes self.park_load_lanes = park_load_lanes
class Equipment(Base): class Equipment(Base):
__tablename__ = 'sys_equipment' __tablename__ = 'sys_equipment'
...@@ -384,6 +393,7 @@ class Equipment(Base): ...@@ -384,6 +393,7 @@ class Equipment(Base):
self.only_allowed = only_allowed self.only_allowed = only_allowed
self.priority = priority self.priority = priority
class EquipmentSpec(Base): class EquipmentSpec(Base):
__tablename__ = 'sys_equipment_spec' __tablename__ = 'sys_equipment_spec'
...@@ -402,6 +412,7 @@ class EquipmentSpec(Base): ...@@ -402,6 +412,7 @@ class EquipmentSpec(Base):
self.width = width self.width = width
self.max_speed = max_speed self.max_speed = max_speed
class LoadInfo(Base): class LoadInfo(Base):
__tablename__ = 'sys_loadinfo' __tablename__ = 'sys_loadinfo'
...@@ -414,6 +425,7 @@ class LoadInfo(Base): ...@@ -414,6 +425,7 @@ class LoadInfo(Base):
self.dump_id = dump_id self.dump_id = dump_id
self.load_weght = load_weight self.load_weght = load_weight
class JobRecord(Base): class JobRecord(Base):
__tablename__ = 'statistic_job_record' __tablename__ = 'statistic_job_record'
...@@ -430,6 +442,7 @@ class JobRecord(Base): ...@@ -430,6 +442,7 @@ class JobRecord(Base):
self.end_time = end_time self.end_time = end_time
self.work_type = work_type self.work_type = work_type
class WorkRecord(Base): class WorkRecord(Base):
__tablename__ = 'statistic_work_record' __tablename__ = 'statistic_work_record'
...@@ -440,7 +453,8 @@ class WorkRecord(Base): ...@@ -440,7 +453,8 @@ class WorkRecord(Base):
load_exit_time = Column(DateTime) load_exit_time = Column(DateTime)
load_exit_count = Column(Integer) load_exit_count = Column(Integer)
def __init__(self, equipment_id, work_day, load_entrance_time, load_entrance_count, load_exit_time, load_exit_count): def __init__(self, equipment_id, work_day, load_entrance_time, load_entrance_count, load_exit_time,
load_exit_count):
self.equipment_id = equipment_id self.equipment_id = equipment_id
self.work_day = work_day self.work_day = work_day
self.load_entrance_time = load_entrance_time self.load_entrance_time = load_entrance_time
...@@ -456,16 +470,18 @@ class DumpArea(Base): ...@@ -456,16 +470,18 @@ class DumpArea(Base):
BindList = Column(VARCHAR(1000)) BindList = Column(VARCHAR(1000))
UnloadAbililty = Column(Float) UnloadAbililty = Column(Float)
Disabled = Column(Integer) Disabled = Column(Integer)
Material = Column(VARCHAR(36)) Materials = Column(VARCHAR(36))
Priority = Column(Integer) Priority = Column(Integer)
DumpEquipmentId = Column(VARCHAR(36))
def __init__(self, Id, BindList, UnloadAbililty, Disabled, Material, Priority): def __init__(self, Id, BindList, UnloadAbililty, Disabled, Materials, Priority, DumpEquipmentId):
self.Id = Id self.Id = Id
self.BindList = BindList self.BindList = BindList
self.UnloadAbililty = UnloadAbililty self.UnloadAbililty = UnloadAbililty
self.Disabled = Disabled self.Disabled = Disabled
self.Material = Material self.Materials = Materials
self.Priority = Priority self.Priority = Priority
self.DumpEquipmentId = DumpEquipmentId
class DiggingWorkArea(Base): class DiggingWorkArea(Base):
...@@ -473,10 +489,12 @@ class DiggingWorkArea(Base): ...@@ -473,10 +489,12 @@ class DiggingWorkArea(Base):
Id = Column(VARCHAR(50), primary_key=True) Id = Column(VARCHAR(50), primary_key=True)
Material = Column(VARCHAR(36)) Material = Column(VARCHAR(36))
ExactorId = Column(VARCHAR(36))
def __init__(self, Id, Material): def __init__(self, Id, Material, ExactorId):
self.Id = Id self.Id = Id
self.Material = Material self.Material = Material
self.ExactorId = ExactorId
class DispatchRule(Base): class DispatchRule(Base):
...@@ -501,3 +519,71 @@ class Material(Base): ...@@ -501,3 +519,71 @@ class Material(Base):
self.id = id self.id = id
self.name = name self.name = name
class DispatchMode(Base):
__tablename__ = 'sys_dispatch_mode'
id = Column(VARCHAR(36), primary_key=True)
mode_name = Column(VARCHAR(30))
mode_desc = Column(VARCHAR(50))
mode_code = Column(Integer)
def __init__(self, id, mode_name, mode_desc, mode_code):
self.id = id
self.mode_name = mode_name
self.mode_desc = mode_desc
self.mode_code = mode_code
class DispatchGroup(Base):
__tablename__ = 'sys_dispatch_group'
id = Column(VARCHAR(36), primary_key=True)
group_type = Column(Integer)
group_code = Column(VARCHAR(36))
mode_id = Column(VARCHAR(36))
mode_code = Column(Integer)
def __init__(self, id, group_type, group_code, mode_id, mode_code):
self.id = id
self.group_type = group_type
self.group_code = group_code
self.mode_id = mode_id
self.mode_code = mode_code
class DispatchMatch(Base):
__tablename__ = 'sys_dispatch_match'
id = Column(VARCHAR(36), primary_key=True)
group_type = Column(Integer)
group_code = Column(VARCHAR(36))
match_code = Column(VARCHAR(36))
team_id = Column(VARCHAR(36))
unload_area_id = Column(VARCHAR(36))
exactor_id = Column(VARCHAR(36))
def __init__(self, id, group_type, group_code, match_code, team_id, unload_area_id, exactor_id):
self.id = id
self.group_type = group_type
self.group_code = group_code
self.match_code = match_code
self.team_id = team_id
self.unload_area_id = unload_area_id
self.exactor_id = exactor_id
class DispatchEquipment(Base):
__tablename__ = 'sys_dispatch_equipment'
id = Column(VARCHAR(36), primary_key=True)
group_type = Column(Integer)
group_code = Column(VARCHAR(36))
match_code = Column(VARCHAR(36))
isdeleted = Column(Integer)
equipment_id = Column(VARCHAR(36))
def __init__(self, id, group_type, group_code, match_code, isdeleted, equipment_id):
self.id = id
self.group_type = group_type
self.group_code = group_code
self.match_code = match_code
self.isdeleted = isdeleted
self.equipment_id = equipment_id
File added
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/5/30 16:32
# @Author : Opfer
# @Site :
# @File : alg.py
# @Software: PyCharm
class AlgorithmBase:
"""
Base class for dispatch alg.
"""
def __init__(self):
pass
class Congestion(AlgorithmBase):
"""
class for congestion alg.
"""
def __init__(self, group):
super().__init__()
self.group = group
def solve(self):
pass
class ExpectedTime(AlgorithmBase):
"""
class for expected traveling time alg.
"""
def __init__(self, group):
super().__init__()
self.group = group
def solve(self):
pass
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/5/30 15:35
# @Author : Opfer
# @Site :
# @File : group.py
# @Software: PyCharm
from data.dispatchInfo import DispatchInfo
from bidict import bidict
from alg.algorithm import AlgorithmBase
class Group:
"""
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.dump_dict = {} # dump_id -> load_area_id
self.truck_set = set() # truck_id
# road network info.
self.to_excavator_distance = None
self.to_dump_distance = None
self.park_to_excavator_distance = None
self.to_excavator_congestion = None
self.to_dump_congestion = None
self.park_to_excavator_congestion = None
# device map
self.truck_uuid_index_dict = bidict()
self.excavator_uuid_index_dict = bidict()
self.dump_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
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/5/30 14:45
# @Author : Opfer
# @Site :
# @File : dispatchInfo.py
# @Software: PyCharm
class DispatchInfo:
"""
class for dispatch group info.
"""
# dispatch groups
group_num = 1
group_set = set()
# device group structure
group_dump_dict = {} # team_id -> dict {[dump_id, unload_area_id], [dump_id, unload_area_id], ...}
group_excavator_dict = {} # team_id -> dict {[excavator_id, load_area_id], ...}
group_truck_dict = {} # team_id -> dict {truck_id, ...}
dump_group_dict = {} # dump_id -> team_id
excavator_group_dict = {} # excavator_id -> team_id
truck_group_dict = {} # truck_id -> team_id
# group feature
group_mode = {}
@classmethod
def update_device_group_structure(cls):
pass
@classmethod
def update_group_mode(cls):
pass
@classmethod
def dispatch_group_init(cls):
"""
update basic paras (group_set, dict, num ...)
:return:
"""
pass
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