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

分许调度数据层更新

parent bbee0737
......@@ -8,14 +8,14 @@
from data.dispatchInfo import DispatchInfo
from bidict import bidict
from alg.algorithm import AlgorithmBase
from alg.algorithm import AlgorithmBase, Congestion
class Group:
"""
class for group instance.
"""
def __init__(self, group_id):
def __init__(self, group_id, truck, dump, excavator):
""" Generate a group obj.
:param group_id: (uuid) group_id
"""
......@@ -23,8 +23,8 @@ class Group:
self.group_id = group_id
# group devices
self.excavator_dict = {} # excavator_id -> unload_area_id
self.dump_dict = {} # dump_id -> load_area_id
self.excavator_dict = {} # excavator_id -> load_area_id
self.dump_dict = {} # dump_id -> unload_area_id
self.truck_set = set() # truck_id
# road network info.
......@@ -41,6 +41,11 @@ class Group:
self.excavator_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):
"""
update above parameters.
......@@ -48,6 +53,22 @@ class Group:
"""
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):
"""
Receive a alg obj. and output dispatch plan for trucks in this group.
......@@ -57,4 +78,15 @@ class Group:
"""
assert isinstance(solver, AlgorithmBase)
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 -*-
# @Time : 2022/5/30 14:45
# @Author : Opfer
# @Site :
# @File : dispatchInfo.py
# @Software: PyCharm
import numpy as np
from settings import *
import pandas as pd
logger = get_logger("mqc.dispatchInfo")
......@@ -20,23 +22,20 @@ class DispatchInfo:
# device group structure
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, load_area_id], ...}
# {group_id: [excavator_id, unload_area_id], ...}
group_truck_dict = {} # team_id -> dict {truck_id, ...}
# {group_id:[truck_id,truck_id],...}
group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
load_exactor_dict = {} # 装载区id-->>电铲编号的映射
exactor_load_dict = {} # 电铲编号->>装载区id的映射
group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_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
# group feature
group_mode = {} # 四种模式:全智能、空车智能、定铲定铲和分流配比模式
# {mode_name:mode_code}
group_mode = {} # 数据格式: {team_id:mode_code}
# route_distance(路网距离)
load_excavator_distance = {} # 装载区-挖机(电铲)的距离 数据格式 -->> {load_area_id:[exactor_uuid:to_load_distance],}
unload_excavator_distance = {} # 卸载区-挖机(电铲)的距离 数据格式 -->> {unload_area_id:[exactor_uuid:to_unload_distance],}
load_distance = {} # 装载区-挖机(电铲)的距离 数据格式 -->>{team_id:np.array}
unload_distance = {} # 卸载区-挖机(电铲)的距离 数据格式 -->>{team_id:np.array}
@classmethod
def renew_set(cls):
......@@ -46,16 +45,17 @@ class DispatchInfo:
@desc:实例化对象,可直接访问
"""
cls.group_dump_dict = {}
cls.dump_group_dict = {}
cls.group_dump_dict = {} # cls.group_dump_dict.keys() 相当于所有的team_id
cls.dump_group_dict = {} # cls.dump_group_dict.keys() 相当于所有的卸载区 unload_area_id
cls.group_excavator_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.truck_group_dict = {}
cls.group_mode = {}
cls.load_excavator_distance = {}
cls.unload_excavator_distance = {}
cls.load_distance = {} # to_load_diatance-->>空车模式
cls.unload_distance = {} # to_unload_distance-->>重车模式
@classmethod
def update_device_group_structure(cls):
......@@ -66,7 +66,7 @@ class DispatchInfo:
"""
logger = get_logger("mqc.update_device_group_structure")
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
group_code_dict = {} # group_code-->>team_id的映射
for valve in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
......@@ -76,12 +76,15 @@ class DispatchInfo:
else:
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
# 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
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
# 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
for key in session_mysql.query(DispatchEquipment).filter_by(group_type=1).all():
if key.group_code in group_code_dict:
......@@ -101,10 +104,18 @@ class DispatchInfo:
@author:maqc
@desc:处理其它类型的数据
"""
# 新增:team_id-->>group_code;group_code-->>mode_code.结果:team_id-->>mode_code
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:
for value in session_mysql.query(DispatchMode).all():
cls.group_mode[value.mode_name] = value.mode_code
for pos in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
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:
logger.error("派车模式数据更新异常")
logger.error(es)
......@@ -115,7 +126,13 @@ class DispatchInfo:
update basic paras (group_set, dict, num ...)
: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
# 距离-->>数据格式:矩阵-->>to_load_distance
......@@ -125,17 +142,31 @@ class DispatchInfo:
@author:maqc
@desc:更新路网距离,返回矩阵格式数据
"""
load_exactor_dict = {} # 装载区id-->>电铲编号的映射
logger = get_logger("mqc.update_route_distance")
try:
for value in session_postgre.query(DiggingWorkArea).all():
load_exactor_dict[value.Id] = value.Exactorld
for value in session_postgre.query(WalkTime).all():
if value.load_area_id in load_exactor_dict:
cls.load_excavator_distance[value.load_area_id] = [load_exactor_dict[value.load_area_id],
value.to_load_distance]
cls.unload_excavator_distance[value.unload_area_id] = [load_exactor_dict[value.load_area_id],
value.to_unload_distance]
df = pd.DataFrame() # 记录装载区与卸载区之间的距离
for item 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
df = pd.concat([df, pd.DataFrame([temp])], axis=0, ignore_index=True)
for team_id in list(cls.group_dump_dict.keys()):
unload_nums = list(set(cls.group_dump_dict[team_id])) # 获取同一个team_id对应的卸载区列表
exactor_nums = list(set(cls.group_excavator_dict[team_id])) # 获取同一个team_id对应的电铲列表
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:
logger.error("路网数据更新异常")
logger.error(es)
......@@ -15,9 +15,11 @@ from sqlalchemy import VARCHAR, DateTime, Float, Integer, BOOLEAN
from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base
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:
mysql_config = json.load(f)["mysql"]
......@@ -519,7 +521,7 @@ class Material(Base):
class DispatchMode(Base):
__tabelname__ = 'sys_dispatch_mode'
__tablename__ = 'sys_dispatch_mode'
id = Column(VARCHAR(36), primary_key=True)
mode_name = Column(VARCHAR(30))
......@@ -534,21 +536,24 @@ class DispatchMode(Base):
class DispatchGroup(Base):
__tabelname__ = 'sys_dispatch_group'
__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, 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_code = group_code
self.mode_id = mode_id
self.mode_code = mode_code
class DispatchMatch(Base):
__tabelname__ = 'sys_dispatch_match'
__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))
......@@ -556,7 +561,8 @@ class DispatchMatch(Base):
unload_area_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_code = group_code
self.match_code = match_code
......@@ -566,15 +572,16 @@ class DispatchMatch(Base):
class DispatchEquipment(Base):
__tabelname__ = 'sys_dispatch_equipment'
__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, 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_code = group_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