Commit 3031349b authored by 张晓彤's avatar 张晓彤

合并分流配比模块

parent e12cb5f8
......@@ -320,3 +320,77 @@ class ExpectedTime(AlgorithmBase):
return transport_value
class DistributionRatio(object):
"""
@date:2022/7/19 8:49
@author:maqc
@para:
truck_id:分流配比模式下,对应的卡车id
excavator_id:该卡车对应的电铲id
@return:{truck_id:unload_area_id}
@desc:计算分流配比模式下,卡车与卸载区的对应关系
"""
def __init__(self, exactor_id):
self.exactor_id = exactor_id
self.exactor_truck_num = DispatchInfo.get_exactor_truck_nums(exactor_id) # 获取该电铲下的卡车数量
self.exactor_unload_match = DispatchInfo.get_exactor_unload_match(exactor_id) # 获取电铲对应的所有卸载区id
self.unload_ratio = {}
self.logger = get_logger("mqc.DistributionRatio")
def get_unload_ratio(self):
"""
@date:2022/7/19 15:21
@author:maqc
@desc:初始化卸载区的比值
"""
ratio = 0
for value in self.exactor_unload_match:
ratio += DispatchInfo.unload_rate_dict[value]
for item in self.exactor_unload_match:
self.unload_ratio[item] = DispatchInfo.unload_rate_dict[item] / ratio
def get_unload_truck_num(self, unload_area_id):
"""
@date:2022/7/19 16:12
@author:maqc
@desc:计算正在派往当前卸载区的卡车数量
"""
item = session_mysql.query(EquipmentPair).filter_by(unload_area_id=unload_area_id, isdeleted=0).all()
return len(item)
def get_next_unload_id(self):
"""
@date:2022/7/19 15:39
@author:maqc
@desc:计算卡车与下一个卸载区的对应关系
"""
# 无论当前卡车是否在备停区,下一个卸载区选择比值最大值对应的区域
try:
temp = list(self.unload_ratio.values())
next_unload_id = list(self.unload_ratio.keys())[temp.index(max(temp))]
# 更新卸载区对应的比例值
self.logger.info(f"下一个卸载区对应的id:{next_unload_id}")
self.unload_ratio[next_unload_id] -= self.get_unload_truck_num(
next_unload_id) / self.exactor_truck_num
self.logger.info(f"当前卸载区对应的比值:{self.unload_ratio[next_unload_id]}")
except Exception as es:
self.logger.error("卡车与下一个卸载区的配对关系异常")
self.logger.error(es)
return next_unload_id
def ratio_main(self):
"""
@date:2022/7/19 9:10
@author:maqc
@desc:分流配比模式类函数主入口
"""
try:
self.get_unload_ratio()
next_unload_area_id = self.get_next_unload_id()
self.logger.info(f'当前卡车对应的卸载区:{next_unload_area_id}')
except Exception as es:
self.logger.error("分流配比主函数异常")
self.logger.error(es)
return next_unload_area_id
......@@ -17,7 +17,7 @@
from data.dispatchInfo import *
from bidict import bidict
from alg.algorithm import AlgorithmBase
from alg.algorithm import AlgorithmBase,DistributionRatio
import numpy as np
# from settings import get_logger
from para_config import get_value
......@@ -262,9 +262,50 @@ class Group:
self.logger.error("固定派车-计算异常")
self.logger.error(es)
# 分流配比模式
elif self.group_mode == 4:
pass
next_exactor_id = DispatchInfo.get_truck_exactor(i) # 获取该卡车对应的exactor_id
self.logger.info(f"分流配比模式,对应的卡车:{i}")
self.logger.info(f"矿卡对应的铲车:{next_exactor_id}")
next_unload_area_id = None
if truck_task == -2:
next_unload_area_id = "Park"
# 空载模式下,计算下一次卸载区的位置,按照分流配比的模式进行计算
elif truck_task in [0, 1, 2]:
try:
next_unload_area_id = DistributionRatio(next_exactor_id).ratio_main()
except Exception as es:
self.logger.error("分流配比模式-->>空载车辆计算异常")
self.logger.error(es)
# 重载模式下,按照固定派车进行计算
elif truck_task in [3, 4, 5]:
try:
next_unload_area_id = DispatchInfo.get_truck_match(i)[1]
except Exception as es:
self.logger.error("分流配比模式-->>重载车辆计算异常")
self.logger.error(es)
truck_dispatch[i] = [next_exactor_id, next_unload_area_id]
# return dispatch plan
return truck_dispatch
......@@ -57,6 +57,17 @@ class DispatchInfo:
dump_unload_area_dict = {}
unload_area_dump_dict = {}
# 获取电铲与卡车的双映射 -->> exactor_id <-> truck_id
exactor_truck_dict = {}
truck_exactor_dict = {}
# 获取电铲与卸载区的双映射 -->> exactor_id <-> unload_area_id
exactor_unload_dict = {}
unload_exactor_dict = {}
# 获取卸载区与rate之间的关系 -->> unload_area_id -> rate
unload_rate_dict = {}
@classmethod
def reset(cls):
"""
......@@ -91,6 +102,14 @@ class DispatchInfo:
cls.dump_unload_area_dict = {}
cls.unload_area_dump_dict = {}
cls.exactor_truck_dict = {}
cls.truck_exactor_dict = {}
cls.exactor_unload_dict = {}
cls.unload_exactor_dict = {}
cls.unload_rate_dict = {}
# 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.group_excavator_dict = {}
......@@ -137,6 +156,39 @@ class DispatchInfo:
session_postgre.rollback()
session_mysql.rollback()
# update exactor_id <-> truck_id
try:
for item in session_mysql.query(DispatchSetting).all():
if item.exactor_id not in cls.exactor_truck_dict.keys():
cls.exactor_truck_dict[item.exactor_id] = [item.truck_id]
else:
if item.truck_id not in cls.exactor_truck_dict[item.exactor_id]:
cls.exactor_truck_dict[item.exactor_id].append(item.truck_id)
cls.truck_exactor_dict[item.truck_id] = item.exactor_id
except Exception as es:
logger.error("电铲和卡车的映射关系更新异常")
logger.error(es)
# update exactor_id <-> unload_area_id
try:
for item in session_mysql.query(DispatchSetting).all():
if item.exactor_id not in cls.exactor_unload_dict.keys():
cls.exactor_unload_dict[item.exactor_id] = [item.unload_area_id]
else:
if item.unload_area_id not in cls.exactor_unload_dict[item.exactor_id]:
cls.exactor_unload_dict[item.exactor_id].append(item.unload_area_id)
except Exception as es:
logger.error("电铲和卸载区的映射关系更新异常")
logger.error(es)
# update unload_area_id -> rate
try:
for item in session_mysql.query(DispatchSetting).all():
cls.unload_rate_dict[item.unload_area_id] = item.rate
except Exception as es:
logger.error("卸载区和比例值关系更新异常")
logger.error(es)
# update excavator_id <-> group_id && unload_area_id <-> group_id && truck_id <-> group_id
try:
for item in session_mysql.query(DispatchSetting).all():
......@@ -370,6 +422,18 @@ class DispatchInfo:
session_mysql.rollback()
return park_matrix
@classmethod
def get_truck_exactor(cls, truck_id):
return cls.truck_exactor_dict[truck_id]
@classmethod
def get_exactor_truck_nums(cls, exactor_id):
return len(cls.exactor_truck_dict[exactor_id])
@classmethod
def get_exactor_unload_match(cls, exactor_id):
return cls.exactor_unload_dict[exactor_id]
# #!E:\Pycharm Projects\Waytous
# # -*- coding: utf-8 -*-
......
......@@ -350,12 +350,14 @@ class DispatchSetting(Base):
truck_id = Column(VARCHAR(36))
team_id = Column(VARCHAR(36))
isdeleted = Column(BOOLEAN)
rate = Column(Integer)
proportion_id = Column(VARCHAR(36))
def __init__(self, id, mode_name, mode_code, group_name, group_id, group_code, group_type, load_area_id, exactor_id, unload_area_id, dump_id, isauto, truck_id, remark, proportion_id):
def __init__(self, id, mode_name, mode_code, group_name, group_id, group_code, group_type, load_area_id, exactor_id,
unload_area_id, dump_id, isauto, truck_id, remark, proportion_id, rate):
self.id = id
self.mode_name
self.mode_code
self.mode_name = mode_name
self.mode_code = mode_code
self.group_name = group_name
self.group_id = group_id
self.group_code = group_code
......@@ -368,6 +370,7 @@ class DispatchSetting(Base):
self.truck_id = truck_id
self.proportion_id = proportion_id
self.remark = remark
self.rate = rate
class WalkTimePark(Base):
......
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