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

分许调度数据层更新

parent bbee0737
...@@ -8,14 +8,14 @@ ...@@ -8,14 +8,14 @@
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
from bidict import bidict from bidict import bidict
from alg.algorithm import AlgorithmBase from alg.algorithm import AlgorithmBase, Congestion
class Group: class Group:
""" """
class for group instance. class for group instance.
""" """
def __init__(self, group_id): def __init__(self, group_id, truck, dump, excavator):
""" Generate a group obj. """ Generate a group obj.
:param group_id: (uuid) group_id :param group_id: (uuid) group_id
""" """
...@@ -23,8 +23,8 @@ class Group: ...@@ -23,8 +23,8 @@ class Group:
self.group_id = group_id self.group_id = group_id
# group devices # group devices
self.excavator_dict = {} # excavator_id -> unload_area_id self.excavator_dict = {} # excavator_id -> load_area_id
self.dump_dict = {} # dump_id -> load_area_id self.dump_dict = {} # dump_id -> unload_area_id
self.truck_set = set() # truck_id self.truck_set = set() # truck_id
# road network info. # road network info.
...@@ -41,6 +41,11 @@ class Group: ...@@ -41,6 +41,11 @@ class Group:
self.excavator_uuid_index_dict = bidict() self.excavator_uuid_index_dict = bidict()
self.dump_uuid_index_dict = bidict() self.dump_uuid_index_dict = bidict()
# device obj.
self.truck = truck
self.dump =dump
self.excavator = excavator
def update_xx_(self): def update_xx_(self):
""" """
update above parameters. update above parameters.
...@@ -48,6 +53,22 @@ class Group: ...@@ -48,6 +53,22 @@ class Group:
""" """
pass pass
def update_device_map(self):
"""
update above parameters.
:return:
"""
self.truck_uuid_index_dict = DispatchInfo.dump_group_dict
pass
def update_road_network_info(self, para):
"""
:return:
"""
pass
return
def group_dispatch(self, solver): def group_dispatch(self, solver):
""" """
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.
...@@ -57,4 +78,15 @@ class Group: ...@@ -57,4 +78,15 @@ class Group:
""" """
assert isinstance(solver, AlgorithmBase) assert isinstance(solver, AlgorithmBase)
s = solver(self) # algorithm init s = solver(self) # algorithm init
return s.solve() # algorithm solve for truck_id in self.truck_set:
value = s.solve(truck_id) # algorithm solve
return value
def target_2_match_id(self, target):
pass
group = Group("group123")
group.group_dispatch(Congestion)
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# @Time : 2022/5/30 14:45 # @Time : 2022/5/30 14:45
# @Author : Opfer # @Author : Opfer
# @Site : # @Site :
# @File : dispatchInfo.py # @File : dispatchInfo.py
# @Software: PyCharm # @Software: PyCharm
import numpy as np
from settings import * from settings import *
import pandas as pd
logger = get_logger("mqc.dispatchInfo") logger = get_logger("mqc.dispatchInfo")
...@@ -20,23 +22,20 @@ class DispatchInfo: ...@@ -20,23 +22,20 @@ class DispatchInfo:
# device group structure # device group structure
group_dump_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...} group_dump_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
# {group_id:unload_area_id,...} group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
group_excavator_dict = {} # team_id -> dict {[excavator_id, load_area_id], ...} load_exactor_dict = {} # 装载区id-->>电铲编号的映射
# {group_id: [excavator_id, unload_area_id], ...} exactor_load_dict = {} # 电铲编号->>装载区id的映射
group_truck_dict = {} # team_id -> dict {truck_id, ...} group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_id],...}
# {group_id:[truck_id,truck_id],...}
dump_group_dict = {} # unload_area_id -> team_id dump_group_dict = {} # unload_area_id -> team_id
excavator_group_dict = {} # excavator_id -> team_id excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值
truck_group_dict = {} # truck_id -> team_id truck_group_dict = {} # truck_id -> team_id
# group feature # group feature
group_mode = {} # 四种模式:全智能、空车智能、定铲定铲和分流配比模式 group_mode = {} # 数据格式: {team_id:mode_code}
# {mode_name:mode_code}
# route_distance(路网距离) # route_distance(路网距离)
load_excavator_distance = {} # 装载区-挖机(电铲)的距离 数据格式 -->> {load_area_id:[exactor_uuid:to_load_distance],} load_distance = {} # 装载区-挖机(电铲)的距离 数据格式 -->>{team_id:np.array}
unload_excavator_distance = {} # 卸载区-挖机(电铲)的距离 数据格式 -->> {unload_area_id:[exactor_uuid:to_unload_distance],} unload_distance = {} # 卸载区-挖机(电铲)的距离 数据格式 -->>{team_id:np.array}
@classmethod @classmethod
def renew_set(cls): def renew_set(cls):
...@@ -46,16 +45,17 @@ class DispatchInfo: ...@@ -46,16 +45,17 @@ class DispatchInfo:
@desc:实例化对象,可直接访问 @desc:实例化对象,可直接访问
""" """
cls.group_dump_dict = {} cls.group_dump_dict = {} # cls.group_dump_dict.keys() 相当于所有的team_id
cls.dump_group_dict = {} cls.dump_group_dict = {} # cls.dump_group_dict.keys() 相当于所有的卸载区 unload_area_id
cls.group_excavator_dict = {} cls.group_excavator_dict = {}
cls.excavator_group_dict = {} cls.excavator_group_dict = {}
cls.excavator_group_dict = {} cls.load_exactor_dict = {} # cls.load_exactor_dict.keys() 相当于所有的装载区 load_area_id
cls.exactor_load_dict = {}
cls.group_truck_dict = {} cls.group_truck_dict = {}
cls.truck_group_dict = {} cls.truck_group_dict = {}
cls.group_mode = {} cls.group_mode = {}
cls.load_excavator_distance = {} cls.load_distance = {} # to_load_diatance-->>空车模式
cls.unload_excavator_distance = {} cls.unload_distance = {} # to_unload_distance-->>重车模式
@classmethod @classmethod
def update_device_group_structure(cls): def update_device_group_structure(cls):
...@@ -66,7 +66,7 @@ class DispatchInfo: ...@@ -66,7 +66,7 @@ class DispatchInfo:
""" """
logger = get_logger("mqc.update_device_group_structure") logger = get_logger("mqc.update_device_group_structure")
try: try:
# group_dump_dict = {} -->> {group_id:unload_area_id,...} # group_dump_dict = {} -->> {team_id:[unload_area_id,unload_area_id],...}
# dump_group_dict = {} # unload_area_id -> team_id # dump_group_dict = {} # unload_area_id -> team_id
group_code_dict = {} # group_code-->>team_id的映射 group_code_dict = {} # group_code-->>team_id的映射
for valve in session_mysql.query(DispatchMatch).filter_by(group_type=1).all(): for valve in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
...@@ -76,12 +76,15 @@ class DispatchInfo: ...@@ -76,12 +76,15 @@ class DispatchInfo:
else: else:
cls.group_dump_dict[valve.team_id].append(valve.unload_area_id) cls.group_dump_dict[valve.team_id].append(valve.unload_area_id)
cls.dump_group_dict[valve.unload_area_id] = valve.team_id # 一个unload_area_id只对应一个team_id cls.dump_group_dict[valve.unload_area_id] = valve.team_id # 一个unload_area_id只对应一个team_id
# group_excavator_dict = {} -->> {group_id: [excavator_id, unload_area_id], ...} # 一个team_id对应一组excavator_id, unload_area_id # group_excavator_dict = {} -->> {team_id: [excavator_id, excavator_id], ...} # 一个team_id对应一组excavator_id, unload_area_id
# excavator_group_dict = {} -->> excavator_id -> team_id 一个excavator_id只对应一个team_id # excavator_group_dict = {} -->> excavator_id -> team_id 一个excavator_id只对应一个team_id
for item in session_mysql.query(DispatchMatch).filter_by(group_type=1).all(): for item in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
cls.group_excavator_dict[item.team_id] = [item.exactor_id, item.unload_area_id] if item.team_id in cls.group_excavator_dict:
cls.group_excavator_dict[item.team_id].append(item.exactor_id)
else:
cls.group_excavator_dict[item.team_id] = [item.exactor_id]
cls.excavator_group_dict[item.exactor_id] = item.team_id cls.excavator_group_dict[item.exactor_id] = item.team_id
# group_truck_dict = {} -->> {group_id:[truck_id,truck_id],...} # group_truck_dict = {} -->> {team_id:[truck_id,truck_id],...}
# truck_group_dict = {} -->> truck_id -> team_id # truck_group_dict = {} -->> truck_id -> team_id
for key in session_mysql.query(DispatchEquipment).filter_by(group_type=1).all(): for key in session_mysql.query(DispatchEquipment).filter_by(group_type=1).all():
if key.group_code in group_code_dict: if key.group_code in group_code_dict:
...@@ -101,10 +104,18 @@ class DispatchInfo: ...@@ -101,10 +104,18 @@ class DispatchInfo:
@author:maqc @author:maqc
@desc:处理其它类型的数据 @desc:处理其它类型的数据
""" """
# 新增:team_id-->>group_code;group_code-->>mode_code.结果:team_id-->>mode_code
logger = get_logger("mqc.update_group_mode") logger = get_logger("mqc.update_group_mode")
team_group_dict = {} # team_id-->>group_code的一个映射,格式:{team_id:group_code}
group_mode_dict = {} # group-->>mode_code的一个映射,格式:{group_code:mode_code}
try: try:
for value in session_mysql.query(DispatchMode).all(): for pos in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
cls.group_mode[value.mode_name] = value.mode_code team_group_dict[pos.team_id] = pos.group_code
for item in session_mysql.query(DispatchGroup).filter_by(group_type=1).all():
group_mode_dict[item.group_code] = item.mode_code
for key, value in team_group_dict.items():
if value in group_mode_dict:
cls.group_mode[key] = group_mode_dict[value]
except Exception as es: except Exception as es:
logger.error("派车模式数据更新异常") logger.error("派车模式数据更新异常")
logger.error(es) logger.error(es)
...@@ -115,7 +126,13 @@ class DispatchInfo: ...@@ -115,7 +126,13 @@ class DispatchInfo:
update basic paras (group_set, dict, num ...) update basic paras (group_set, dict, num ...)
:return: :return:
""" """
pass try:
for value in session_postgre.query(DiggingWorkArea).all():
cls.load_exactor_dict[value.Id] = value.Exactorld
cls.exactor_load_dict[value.Exactorld] = value.Id
except Exception as es:
logger.error("初始化数据更新异常")
logger.error(es)
@classmethod @classmethod
# 距离-->>数据格式:矩阵-->>to_load_distance # 距离-->>数据格式:矩阵-->>to_load_distance
...@@ -125,17 +142,31 @@ class DispatchInfo: ...@@ -125,17 +142,31 @@ class DispatchInfo:
@author:maqc @author:maqc
@desc:更新路网距离,返回矩阵格式数据 @desc:更新路网距离,返回矩阵格式数据
""" """
load_exactor_dict = {} # 装载区id-->>电铲编号的映射
logger = get_logger("mqc.update_route_distance") logger = get_logger("mqc.update_route_distance")
try: try:
for value in session_postgre.query(DiggingWorkArea).all(): df = pd.DataFrame() # 记录装载区与卸载区之间的距离
load_exactor_dict[value.Id] = value.Exactorld for item in session_postgre.query(WalkTime).all():
for value in session_postgre.query(WalkTime).all(): temp = str(item.load_area_id), str(item.unload_area_id), item.to_load_distance, item.to_unload_distance
if value.load_area_id in load_exactor_dict: df = pd.concat([df, pd.DataFrame([temp])], axis=0, ignore_index=True)
cls.load_excavator_distance[value.load_area_id] = [load_exactor_dict[value.load_area_id], for team_id in list(cls.group_dump_dict.keys()):
value.to_load_distance] unload_nums = list(set(cls.group_dump_dict[team_id])) # 获取同一个team_id对应的卸载区列表
cls.unload_excavator_distance[value.unload_area_id] = [load_exactor_dict[value.load_area_id], exactor_nums = list(set(cls.group_excavator_dict[team_id])) # 获取同一个team_id对应的电铲列表
value.to_unload_distance] unload_exactor_matrix = np.zeros(
(len(unload_nums), len(exactor_nums))) # 初始化距离矩阵,记录从卸载区-->>电铲的距离,即to_load_distance,空车模式
load_exactor_matrix = np.array(
unload_exactor_matrix).T # 初始化距离矩阵,记录从装载区-->>电铲的距离,即to_unload_distance,重车模式
for i in range(len(unload_nums)):
for j in range(len(exactor_nums)):
id = set(df.loc[df[1] == str(unload_nums[i])].index.to_list()) & set(
df.loc[df[0] == str(cls.exactor_load_dict[j])].index.to_list()) # 集合属性
unload_exactor_matrix[i][j] = df.iloc[list(id)[0]][2]
for m in range(len(exactor_nums)):
for n in range(len(unload_nums)):
id = set(df.loc[df[0] == str(cls.exactor_load_dict[m])].index.to_list()) & set(
df.loc[df[1] == str(unload_nums[n])].index.to_list())
load_exactor_matrix[m][n] = df.iloc[list(id)[0]][3]
cls.load_distance[team_id] = unload_exactor_matrix
cls.unload_distance[team_id] = load_exactor_matrix
except Exception as es: except Exception as es:
logger.error("路网数据更新异常") logger.error("路网数据更新异常")
logger.error(es) logger.error(es)
...@@ -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"]
...@@ -519,7 +521,7 @@ class Material(Base): ...@@ -519,7 +521,7 @@ class Material(Base):
class DispatchMode(Base): class DispatchMode(Base):
__tabelname__ = 'sys_dispatch_mode' __tablename__ = 'sys_dispatch_mode'
id = Column(VARCHAR(36), primary_key=True) id = Column(VARCHAR(36), primary_key=True)
mode_name = Column(VARCHAR(30)) mode_name = Column(VARCHAR(30))
...@@ -534,21 +536,24 @@ class DispatchMode(Base): ...@@ -534,21 +536,24 @@ class DispatchMode(Base):
class DispatchGroup(Base): class DispatchGroup(Base):
__tabelname__ = 'sys_dispatch_group' __tablename__ = 'sys_dispatch_group'
id = Column(VARCHAR(36), primary_key=True)
group_type = Column(Integer) group_type = Column(Integer)
group_code = Column(VARCHAR(36)) group_code = Column(VARCHAR(36))
mode_id = Column(VARCHAR(36)) mode_id = Column(VARCHAR(36))
mode_code = Column(Integer)
def __init__(self, group_type, group_code, mode_id): def __init__(self, id, group_type, group_code, mode_id, mode_code):
self.id = id
self.group_type = group_type self.group_type = group_type
self.group_code = group_code self.group_code = group_code
self.mode_id = mode_id self.mode_id = mode_id
self.mode_code = mode_code
class DispatchMatch(Base): class DispatchMatch(Base):
__tabelname__ = 'sys_dispatch_match' __tablename__ = 'sys_dispatch_match'
id = Column(VARCHAR(36), primary_key=True)
group_type = Column(Integer) group_type = Column(Integer)
group_code = Column(VARCHAR(36)) group_code = Column(VARCHAR(36))
match_code = Column(VARCHAR(36)) match_code = Column(VARCHAR(36))
...@@ -556,7 +561,8 @@ class DispatchMatch(Base): ...@@ -556,7 +561,8 @@ class DispatchMatch(Base):
unload_area_id = Column(VARCHAR(36)) unload_area_id = Column(VARCHAR(36))
exactor_id = Column(VARCHAR(36)) exactor_id = Column(VARCHAR(36))
def __init__(self, group_type, group_code, match_code, team_id, unload_area_id, exactor_id): 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_type = group_type
self.group_code = group_code self.group_code = group_code
self.match_code = match_code self.match_code = match_code
...@@ -566,15 +572,16 @@ class DispatchMatch(Base): ...@@ -566,15 +572,16 @@ class DispatchMatch(Base):
class DispatchEquipment(Base): class DispatchEquipment(Base):
__tabelname__ = 'sys_dispatch_equipment' __tablename__ = 'sys_dispatch_equipment'
id = Column(VARCHAR(36), primary_key=True)
group_type = Column(Integer) group_type = Column(Integer)
group_code = Column(VARCHAR(36)) group_code = Column(VARCHAR(36))
match_code = Column(VARCHAR(36)) match_code = Column(VARCHAR(36))
isdeleted = Column(Integer) isdeleted = Column(Integer)
equipment_id = Column(VARCHAR(36)) equipment_id = Column(VARCHAR(36))
def __init__(self, group_type, group_code, match_code, isdeleted, equipment_id): def __init__(self, id, group_type, group_code, match_code, isdeleted, equipment_id):
self.id = id
self.group_type = group_type self.group_type = group_type
self.group_code = group_code self.group_code = group_code
self.match_code = match_code self.match_code = match_code
......
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