Commit 936b8259 authored by 张晓彤's avatar 张晓彤

修复字典Bug,添加物料管控

parent b4797ca0
......@@ -180,6 +180,7 @@ class ExpectedTime(AlgorithmBase):
################################################ 矿卡启动 ###############################################
try:
self.logger.info(f'矿卡 {truck_id}')
self.logger.info("矿卡状态:矿卡启动或故障恢复")
self.logger.info(f"涉及挖机:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except Exception as es:
......@@ -226,6 +227,7 @@ class ExpectedTime(AlgorithmBase):
################################################ 矿卡空载 ###############################################
try:
self.logger.info(f'矿卡 {truck_id}')
self.logger.info("矿卡状态:矿卡空载")
self.logger.info(f"涉及卸载设备:{list(DeviceMap.dump_uuid_to_index_dict.keys())}")
except Exception as es:
......@@ -279,6 +281,7 @@ class ExpectedTime(AlgorithmBase):
################################################ 矿卡重载 ###############################################
try:
self.logger.info(f'矿卡 {truck_id}')
self.logger.info("矿卡状态:矿卡重载")
self.logger.info(f"涉及挖机设备:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except Exception as es:
......
......@@ -57,7 +57,7 @@ class Dispatcher:
groups = DispatchInfo.get_all_group()
for group_id in groups:
if group_id not in self.group_list:
group = Group(group_id, self.truck, self.pre_sch)
group = Group(group_id, self.truck, self.pre_sch, self.excavator, self.dump)
self.group_list[group_id] = group
def group_info_update(self):
......@@ -86,6 +86,10 @@ class Dispatcher:
self.logger.error(f'分组{group.group_id} 调度异常')
self.logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
self.logger.info("组内挖机")
self.logger.info(group.excavator)
self.logger.info("组内卸点")
self.logger.info(group.dump)
self.submission.group_dispatch_to_redis(group, truck_dispatch_plan_dict)
......
......@@ -59,7 +59,7 @@ class Group:
"""
class for group instance.
"""
def __init__(self, group_id, truck, pre_sch):
def __init__(self, group_id, truck, pre_sch, excavator_info, dump_info):
""" Generate a group obj.
:param group_id: (uuid) group_id
"""
......@@ -69,6 +69,8 @@ class Group:
self.group_mode = 1
self.truck = truck
self.pre_sch = pre_sch
self.excavator_info = excavator_info
self.dump_info = dump_info
# group devices
self.excavator = {} # excavator_id -> unload_area_id
......@@ -95,6 +97,9 @@ class Group:
# truck info.
self.truck_info_list = {}
# material control
self.group_walk_available = None
def update_group_mode(self):
"""
update group mode.
......@@ -121,6 +126,10 @@ class Group:
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}')
def update_group_road_network(self):
"""
update group road network.
......@@ -158,13 +167,58 @@ class Group:
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(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.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):
"""
update group device material.
:return:
"""
# material control
self.group_walk_available = np.ones_like(self.to_unload_area_distance)
# try:
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]
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
self.logger.info("group_walk_available")
self.logger.info(self.group_walk_available)
# except Exception as es:
# self.logger.info(es)
# self.logger.info("error-12")
def info_update(self):
"""
update group info.
......@@ -174,6 +228,7 @@ class Group:
self.update_group_device()
self.update_group_device_map()
self.update_group_road_network()
self.update_device_material()
def group_dispatch(self, solver: object):
"""
......@@ -216,12 +271,28 @@ class Group:
if truck_task in [0, 1, 2]:
try:
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]]
next_unload_area_value = s.solve(truck_info)
self.logger.info(f'车辆 {i}')
self.logger.info(f'group distance {self.to_unload_area_distance}')
self.logger.info(f'walk available {self.group_walk_available}')
self.logger.info(self.unload_area_uuid_index_dict)
self.logger.info(self.excavator_uuid_index_dict)
tmp = self.group_walk_available[
self.excavator_uuid_index_dict[next_excavator_id], :].flatten()
self.logger.info(f'group_walk_available_pick {tmp}')
self.logger.info(f'next_excavator_id {next_excavator_id}')
self.logger.info(next_unload_area_value)
next_unload_area_value *= self.group_walk_available[
self.excavator_uuid_index_dict[next_excavator_id], :].flatten()
self.logger.info(next_unload_area_value)
min_index = np.argmin(next_unload_area_value)
next_unload_area_id = self.unload_area_uuid_index_dict.inverse[min_index]
# next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
except Exception as es:
......
......@@ -9,6 +9,7 @@ import numpy as np
from settings import *
import pandas as pd
from tables import DispatchMatch, DispatchEquipment
import bidict
logger = get_logger("zxt.dispatchInfo")
......@@ -68,6 +69,12 @@ class DispatchInfo:
# 获取卸载区与rate之间的关系 -->> unload_area_id -> rate
unload_rate_dict = {}
# 各分组设备映射
excavator_uuid_to_index_dict = {}
dump_uuid_to_index_dict = {}
load_area_uuid_to_index_dict = {}
unload_area_uuid_to_index_dict = {}
@classmethod
def reset(cls):
"""
......@@ -110,6 +117,11 @@ class DispatchInfo:
cls.unload_rate_dict = {}
cls.excavator_uuid_to_index_dict = {}
cls.dump_uuid_to_index_dict = {}
cls.load_area_uuid_to_index_dict = {}
cls.unload_area_uuid_to_index_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 = {}
......@@ -209,7 +221,7 @@ class DispatchInfo:
cls.unload_area_group_dict[item.unload_area_id] = item.group_id
# add dump
if item.dump_id not in cls.group_dump_dict.keys():
if item.group_id not in cls.group_dump_dict.keys():
cls.group_dump_dict[item.group_id] = [item.dump_id]
else:
if item.dump_id not in cls.group_dump_dict[item.group_id]:
......@@ -304,61 +316,117 @@ class DispatchInfo:
@desc:更新路网距离,返回矩阵格式数据
"""
logger = get_logger("zxt.update_route_distance")
try:
groups = cls.group_excavator_dict.keys()
for item in groups:
try:
# 每个组的 excavator_id 及对应 load_area_id
excavator_ids = cls.group_excavator_dict[item]
load_areas = []
for excavator_id in excavator_ids:
load_areas.append(cls.excavator_load_dict[excavator_id])
# 每个组的unload_areas
unload_areas = cls.group_unload_area_dict[item]
except Exception as es:
logger.error("装卸载区统计异常")
logger.error(es)
try:
# unload->load distance
unload_load_distance = np.zeros((len(unload_areas), len(load_areas)))
for i in range(len(unload_areas)):
for j in range(len(load_areas)):
distance = int(session_postgre.query(WalkTime).filter_by(unload_area_id=unload_areas[i], load_area_id=load_areas[j]).first().to_load_distance)
unload_load_distance[i][j] = distance
cls.load_distance[item] = unload_load_distance
except Exception as es:
logger.error(f'{item} 分组装载路网异常')
cls.load_distance[item] = np.full((len(unload_areas), len(load_areas)), 10000)
logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
try:
# load->unload distance
load_unload_distance = np.zeros((len(load_areas), len(unload_areas)))
for i in range(len(load_areas)):
for j in range(len(unload_areas)):
distance = int(session_postgre.query(WalkTime).filter_by(load_area_id=load_areas[i], unload_area_id=unload_areas[j]).first().to_unload_distance)
load_unload_distance[i][j] = distance
cls.unload_distance[item] = load_unload_distance
except Exception as es:
logger.error(f'{item} 分组卸载路网异常')
cls.unload_distance[item] = np.full((len(load_areas), len(unload_areas)), 10000)
logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
except Exception as es:
logger.error("路网距离更新异常-调度部分和路网部分不一致")
logger.error(es)
cls.excavator_uuid_to_index_dict = {}
cls.dump_uuid_to_index_dict = {}
cls.load_area_uuid_to_index_dict = {}
cls.unload_area_uuid_to_index_dict = {}
# try:
groups = cls.group_excavator_dict.keys()
for item in groups:
try:
# 每个组的 excavator_id 及对应 load_area_id
excavator_ids = cls.group_excavator_dict[item]
load_areas = []
for excavator_id in excavator_ids:
load_areas.append(cls.excavator_load_dict[excavator_id])
# 每个组的unload_areas
unload_areas = cls.group_unload_area_dict[item]
except Exception as es:
logger.error("装卸载区统计异常")
logger.error(es)
group_excavator_uuid_to_index = {}
group_dump_uuid_to_index = {}
group_load_area_uuid_to_index = {}
group_unload_area_uuid_to_index = {}
try:
# # unload->load distance
# unload_load_distance = np.zeros((len(unload_areas), len(load_areas)))
# for i in range(len(unload_areas)):
# for j in range(len(load_areas)):
# distance = int(session_postgre.query(WalkTime).filter_by(unload_area_id=unload_areas[i], load_area_id=load_areas[j]).first().to_load_distance)
# unload_load_distance[i][j] = distance
# cls.load_distance[item] = unload_load_distance
group_excavator_count = 0
group_dump_count = 0
group_load_area_count = 0
group_unload_area_count = 0
# unload->load distance
unload_load_distance = np.zeros((len(cls.group_dump_dict[item]), len(cls.group_excavator_dict[item])))
for excavator_id in cls.group_excavator_dict[item]:
group_dump_count = 0
group_unload_area_count = 0
for dump_id in cls.group_dump_dict[item]:
unload_area_id = cls.dump_unload_area_dict[dump_id]
load_area_id = cls.excavator_load_dict[excavator_id]
distance = int(session_postgre.query(WalkTime).filter_by(
unload_area_id=unload_area_id,
load_area_id=load_area_id).first().to_load_distance)
unload_load_distance[group_dump_count][group_excavator_count] = distance
if excavator_id not in group_excavator_uuid_to_index:
group_excavator_uuid_to_index[excavator_id] = group_excavator_count
if dump_id not in group_dump_uuid_to_index:
group_dump_uuid_to_index[dump_id] = group_dump_count
if load_area_id not in group_load_area_uuid_to_index:
group_load_area_uuid_to_index[load_area_id] = group_load_area_count
if unload_area_id not in group_unload_area_uuid_to_index:
group_unload_area_uuid_to_index[unload_area_id] = group_unload_area_count
cls.excavator_uuid_to_index_dict[item] = group_excavator_uuid_to_index
cls.dump_uuid_to_index_dict[item] = group_dump_uuid_to_index
cls.load_area_uuid_to_index_dict[item] = group_load_area_uuid_to_index
cls.unload_area_uuid_to_index_dict[item] = group_unload_area_uuid_to_index
group_dump_count += 1
group_unload_area_count += 1
group_excavator_count += 1
group_load_area_count += 1
cls.load_distance[item] = unload_load_distance
except Exception as es:
logger.error(f'{item} 分组装载路网异常')
cls.load_distance[item] = np.full((len(unload_areas), len(load_areas)), 10000)
logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
try:
# load->unload distance
load_unload_distance = np.zeros((len(load_areas), len(unload_areas)))
for i in range(len(load_areas)):
for j in range(len(unload_areas)):
distance = int(session_postgre.query(WalkTime).filter_by(load_area_id=load_areas[i], unload_area_id=unload_areas[j]).first().to_unload_distance)
load_unload_distance[i][j] = distance
cls.unload_distance[item] = load_unload_distance
except Exception as es:
logger.error(f'{item} 分组卸载路网异常')
cls.unload_distance[item] = np.full((len(load_areas), len(unload_areas)), 10000)
logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
# except Exception as es:
# logger.error("路网距离更新异常-调度部分和路网部分不一致")
# logger.error(es)
@classmethod
def get_all_group(cls):
......
......@@ -117,16 +117,21 @@ class DumpInfo(WalkManage):
def update_dump_material(self):
self.dump_material = {}
for dump_id in get_value("dynamic_dump_set"):
try:
# unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isauto=1, isdeleted=0).first().unload_area_id
unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isdeleted=0).first().unload_area_id
dump_material_id = list(session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Materials)
self.dump_material[dump_id] = dump_material_id
except Exception as es:
self.logger.error("卸点物料更新异常")
self.logger.error(es)
session_mysql.rollback()
session_postgre.rollback()
# try:
# unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isauto=1, isdeleted=0).first().unload_area_id
unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isdeleted=0).first().unload_area_id
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Materials
if dump_material_id is None:
dump_material_id = []
else:
dump_material_id = list(dump_material_id)
self.dump_material[dump_id] = dump_material_id
# except Exception as es:
# self.logger.error("卸点物料更新异常")
# self.dump_material[dump_id] = {}
# self.logger.error(es)
# session_mysql.rollback()
# session_postgre.rollback()
def update_dump_priority(self):
unload_area_index_to_uuid_dict = get_value("unload_area_index_to_uuid_dict")
......
......@@ -171,6 +171,7 @@ class ExcavatorInfo(WalkManage):
self.logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
def update_mining_ability(self):
try:
try:
......
......@@ -9,7 +9,7 @@
from equipment.truck import TruckInfo, DumpInfo, ExcavatorInfo
# from path_plan.priority_control import PriorityController
from path_plan.priority_control import PriorityController
from path_plan.topo_graph import *
from redispatch.topo_graph import *
from para_config import *
from tables import *
......
......@@ -282,11 +282,15 @@ class Lane(Base):
Id = Column(VARCHAR(36), primary_key=True)
Length = Column(Float)
MaxSpeed = Column(Float)
StartNodeId = Column(VARCHAR(36))
EndNodeId = Column(VARCHAR(36))
def __init__(self, Id, Length, MaxSpeed):
def __init__(self, Id, Length, MaxSpeed, StartNodeId, EndNodeId):
self.Id = Id
self.Length = Length
self.MaxSpeed = MaxSpeed
self.StartNodeId = StartNodeId
self.EndNodeId = EndNodeId
class Dispatch(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