Commit 6d3e78b0 authored by 张晓彤's avatar 张晓彤

仿真发现问题修复

parent 79ec12f7
......@@ -189,6 +189,7 @@ class Group:
for dump_id in self.dump:
for excavator_id in self.excavator:
try:
# 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]
......@@ -207,6 +208,9 @@ class Group:
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
except Exception as es:
self.logger.error(es)
self.logger.error(f'物料控制-挖机 {excavator_id} - 卸点 {dump_id} 异常')
self.logger.info("group_walk_available")
self.logger.info(self.group_walk_available)
# except Exception as es:
......
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/8/18 13:53
# @Author : Opfer
# @Site :
# @File : ruler.py
# @Software: PyCharm
\ No newline at end of file
......@@ -401,9 +401,9 @@ class DispatchInfo:
cls.load_distance[item] = unload_load_distance
except Exception as es:
logger.error(f'{item} 分组装载路网异常')
logger.warning(f'{item} 分组装载路网异常')
cls.load_distance[item] = np.full((len(unload_areas), len(load_areas)), 10000)
logger.error(es)
logger.warning(es)
session_postgre.rollback()
session_mysql.rollback()
......@@ -418,9 +418,9 @@ class DispatchInfo:
cls.unload_distance[item] = load_unload_distance
except Exception as es:
logger.error(f'{item} 分组卸载路网异常')
logger.warning(f'{item} 分组卸载路网异常')
cls.unload_distance[item] = np.full((len(load_areas), len(unload_areas)), 10000)
logger.error(es)
logger.warning(es)
session_postgre.rollback()
session_mysql.rollback()
......
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:38
# @Author : Opfer
# @Site :
# @File : __init__.py
# @Software: PyCharm
\ No newline at end of file
This diff is collapsed.
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/8/3 10:51
# @Author : Opfer
# @Site :
# @File : __init__.py.py
# @Software: PyCharm
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/9/3 14:44
# @Author : Opfer
# @Site :
# @File : priority_control.py
# @Software: PyCharm
from equipment.truck import *
from equipment.dump import *
from equipment.excavator import *
from para_config import *
class PriorityController:
def __init__(self, dump, excavator, truck):
# 设备类
self.dump = dump
self.excavator = excavator
self.truck = truck
# 获取日志器
self.logger = get_logger("zxt.prio")
def weighted_walk_calc(self):
"""
计算运输路线权重, 权重影响因素:设备优先级, 物料优先级,
:return:
walk_weight: 卸载-装载区 路网权重
park_walk_weight: 备停区-装载区 路网权重
"""
park_num = get_value("park_num")
dynamic_dump_num = get_value("dynamic_dump_num")
dynamic_excavator_num = get_value("dynamic_excavator_num")
dynamic_dump_set = get_value("dynamic_dump_set")
dynamic_excavator_set = get_value("dynamic_excavator_set")
walk_to_excavator_weight = np.ones((dynamic_dump_num, dynamic_excavator_num))
walk_to_dump_weight = np.ones((dynamic_excavator_num, dynamic_dump_num))
excavator_priority = self.excavator.excavator_priority_coefficient
excavator_material_priority = self.excavator.excavator_material_priority
dump_priority = self.dump.dump_priority_coefficient
dump_material_priority = np.ones(dynamic_dump_num)
park_walk_weight = np.ones((park_num, dynamic_excavator_num))
try:
rule6 = session_mysql.query(DispatchRule).filter_by(id=6).first()
except Exception as es:
session_postgre.rollback()
session_mysql.rollback()
if not rule6.disabled:
for dump_id in dynamic_dump_set:
for excavator_id in dynamic_excavator_set:
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
excavator_inedx = self.excavator.excavator_uuid_to_index_dict[excavator_id]
walk_to_excavator_weight[dump_index][excavator_inedx] += excavator_priority[excavator_inedx]
walk_to_dump_weight[excavator_inedx][dump_index] += dump_priority[dump_index]
park_walk_weight = park_walk_weight * self.excavator.excavator_priority_coefficient
try:
rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
except Exception as es:
session_postgre.rollback()
session_mysql.rollback()
if not rule7.disabled:
for dump_id in dynamic_dump_set:
for excavator_id in dynamic_excavator_set:
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
excavator_inedx = self.excavator.excavator_uuid_to_index_dict[excavator_id]
walk_to_excavator_weight[dump_index][excavator_inedx] += excavator_material_priority[excavator_inedx]
walk_to_dump_weight[excavator_inedx][dump_index] += dump_material_priority[dump_index]
park_walk_weight = park_walk_weight * self.excavator.excavator_material_priority
try:
walk_to_excavator_weight = walk_to_excavator_weight - (walk_to_excavator_weight.min() - 1)
walk_to_dump_weight = walk_to_dump_weight - (walk_to_dump_weight.min() - 1)
park_walk_weight = park_walk_weight - (park_walk_weight.min() - 1)
except Exception as es:
self.logger.error(es)
self.logger.error("优先级归一化异常")
return walk_to_excavator_weight, walk_to_dump_weight, park_walk_weight
def walk_available_calc(self):
"""
计算路网可通行性(物料, 地图, 分组三者综合)
:return:
walk_available: 路网可通行性(dump_num, excavator_num)
"""
map_walk_available = self.update_map_walk_available()
group_walk_available = self.update_group_walk_available()
material_walk_available = self.update_material_walk_available()
walk_available = map_walk_available * group_walk_available * material_walk_available
return walk_available
def update_group_walk_available(self):
"""
计算调度分组间的路网可通行性, 不同分组间路网不可通行
:return:
group_walk_available: 调度分组路网可通行性矩阵(dump_num, excavator_num)
"""
group_walk_available = np.zeros((get_value("dynamic_dump_num"), get_value("dynamic_excavator_num")))
for dump_id in get_value("dynamic_dump_set"):
for excavator_id in get_value("dynamic_excavator_set"):
try:
item = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, exactor_id=excavator_id, isauto=1,
isdeleted=0).first()
except Exception as es:
session_postgre.rollback()
session_mysql.rollback()
if item is not None:
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
excavator_index = self.excavator.excavator_uuid_to_index_dict[excavator_id]
group_walk_available[dump_index][excavator_index] = 1
return group_walk_available
def update_material_walk_available(self):
"""
更新物料兼容性下路网可通行性
:return:
walk_available: 物料兼容路网可通行性矩阵(dump_num, excavator_num)
"""
dynamic_dump_num = get_value("dynamic_dump_num")
dynamic_excavator_num = get_value("dynamic_excavator_num")
dynamic_dump_set = get_value("dynamic_dump_set")
dynamic_excavator_set = get_value("dynamic_excavator_set")
walk_available = np.ones((dynamic_dump_num, dynamic_excavator_num))
try:
for dump_id in dynamic_dump_set:
for excavator_id in dynamic_excavator_set:
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
excavator_inedx = self.excavator.excavator_uuid_to_index_dict[excavator_id]
# 两设备处理物料不同, 相关路网不可通行
if self.excavator.excavator_material[excavator_id] != self.dump.dump_material[dump_id]:
walk_available[dump_index][excavator_inedx] = 0
except Exception as es:
self.logger.info(es)
self.logger.info("error-12")
return walk_available
def update_map_walk_available(self):
"""
更新物理路网可通行性
:return:
walk_available: 物理路网可通行性矩阵(dump_num, excavator_num)
"""
dynamic_dump_num = get_value("dynamic_dump_num")
dynamic_excavator_num = get_value("dynamic_excavator_num")
walk_available = np.ones((dynamic_dump_num, dynamic_excavator_num))
for dump_index in range(dynamic_dump_num):
for excavator_index in range(dynamic_excavator_num):
if WalkManage.distance_to_excavator[dump_index][excavator_index] > M / 2:
walk_available[dump_index][excavator_index] = 0
return walk_available
from topo_graph import *
import networkx as nx
import matplotlib.pyplot as plt
#
# topo = Topo()
# topo.generate_topo_graph()
# load_G = topo.get_load_G()
# pos = nx.shell_layout(load_G)
# nx.draw(load_G, pos, with_labels=True, node_color='red', edge_color='blue', font_size=18, width=5, node_size=600,
# alpha=0.5)
# plt.show()
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/8/3 17:53
# @Author : Opfer
# @Site :
# @File : redispatch.py
# @Software: PyCharm
from flask import Flask, request
from flask.json import jsonify
from para_config import *
from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo
from core.dispatcher import Dispatcher, PreSchedule
from core.group import Group
from flask_caching import Cache
from alg.algorithm import ExpectedTime
from data.dispatchInfo import DispatchInfo
from core.dispatcher import DispatchSubmission
from graph_load import graph_construct
config = {
"DEBUG": True, # some Flask specific configs
"CACHE_TYPE": "SimpleCache", # Flask-Caching related configs
"CACHE_DEFAULT_TIMEOUT": 300
}
app = Flask(__name__)
app.config.from_mapping(config)
cache = Cache(app)
def update_truck_loacate(truck_id):
# 读取矿卡所在路段信息
try:
truck_locate_dict = {}
device_name_set = redis2.keys()
for item in device_name_set:
item = item.decode(encoding='utf-8')
# json_value = json.loads(redis2.get(item))
key_value_dict = redis2.hgetall(item)
device_type = key_value_dict[str_to_byte('type')]
is_online = key_value_dict[str_to_byte('online')]
key_set = key_value_dict.keys()
if (device_type == str_to_byte("1")) \
and (str_to_byte('online') in key_set) \
and (bytes.decode(is_online) in ["true" or "True"]) \
and (str_to_byte('laneId') in key_set):
truck_locate = key_value_dict[str_to_byte('laneId')]
truck_locate_dict[get_value("truck_name_to_uuid_dict")[item]] = eval(truck_locate)
except Exception as es:
logger.error(" ")
return truck_locate_dict[truck_id]
@app.route("/redispatch", methods=["POST"])
def dispatch_request():
# 获取报文数据
data_json = request.get_json()
# 车辆id
truck_id = data_json.get("truck_id")
# 调度开始时间
rtd_start_time = datetime.now()
# 初始化日志
set_log()
# 获取日志器
logger = get_logger("zxt.truck-request")
# 更新周期参数
logger.info("#####################################请求调度更新开始#####################################")
try:
# 清空数据库缓存
session_mysql.commit()
session_mysql.flush()
# 清空数据库缓存
session_postgre.commit()
session_postgre.flush()
except Exception as es:
logger.error("数据库访问异常")
logger.error(es)
return jsonify(msg="未知异常, 请联系管理员", code=501)
try:
# 全局参数更新
global_period_para_update()
# get_global_para_from_cache(cache)
except Exception as es:
logger.error("全局参数更新异常")
logger.error(es)
session_mysql.rollback()
session_postgre.rollback()
return jsonify(msg="未知异常, 请联系管理员", code=502)
try:
# 更新调度信息
DispatchInfo.reset()
DispatchInfo.update_device_group_structure()
if group_id not in DispatchInfo.truck_group_dict:
raise Exception("请求调度车辆不存在")
DispatchInfo.update_route_distance()
DispatchInfo.update_group_mode()
DispatchInfo.update_group_name()
except Exception as es:
logger.error("调度信息更新异常")
logger.error(es)
session_mysql.rollback()
session_postgre.rollback()
return jsonify(msg="未知异常, 请联系管理员", code=503)
logger.info("Dispatchinfo,更新后信息")
logger.info("group_set")
logger.info(DispatchInfo.group_set)
logger.info("group_excavator_dict")
logger.info(DispatchInfo.group_excavator_dict)
logger.info("group_unload_area_dict")
logger.info(DispatchInfo.group_unload_area_dict)
logger.info("group_truck_dict")
logger.info(DispatchInfo.group_truck_dict)
logger.info("group_mode")
logger.info(DispatchInfo.group_mode)
logger.info("load_distance")
logger.info(DispatchInfo.load_distance)
logger.info("unload_distance")
logger.info(DispatchInfo.unload_distance)
try:
# 实例化设备对象
dump = DumpInfo()
excavator = ExcavatorInfo()
truck = TruckInfo(dump, excavator)
group_id = DispatchInfo.truck_group_dict[truck_id]
# 设备信息更新
dump.dump_para_period_update()
excavator.excavator_para_period_update()
truck.truck_para_period_update(dump, excavator)
truck.state_period_update()
# 实例化调度预测器
pre_sch = PreSchedule(truck, excavator, dump)
# 实例化输出器
submission = DispatchSubmission(dump, excavator, truck)
# 实例化调度分组
group = Group(group_id, truck, pre_sch)
# 更新调度分组信息
group.info_update()
truck_trip = truck.get_truck_current_trip()[truck.truck_uuid_to_index_dict[truck_id]]
truck_task = truck.get_truck_current_task()[truck_id]
truck_lane = update_truck_loacate(truck_id)
excavators = DispatchInfo.group_excavator_dict[group_id]
dumps = DispatchInfo.dump_group_dict[group_id]
topo = graph_construct()
next_target = None
if truck_task in [-2, 0]:
excavator_distance_dict = topo.get_load_target_node_real(truck_lane, None)
MAX_DIS = 100000000
for excavator_id in excavators:
if excavator_distance_dict[excavator_id] < MAX_DIS:
next_target = excavator_id
MAX_DIS = excavator_distance_dict[excavator_id]
elif truck_task == 3:
dump_distance_dict = topo.get_unload_target_node_real(truck_lane, None)
MAX_DIS = 100000000
for dump_id in dumps:
if dump_distance_dict[dump_id] < MAX_DIS:
next_target = dump_id
MAX_DIS = dump_distance_dict[dump_id]
except Exception as es:
logger.error("对象实例化异常")
logger.error(es)
session_mysql.rollback()
session_postgre.rollback()
return jsonify(msg="未知异常, 请联系管理员", code=504)
try:
# 调度分组派车计划计算
try:
truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
except Exception as es:
logger.error(es)
logger.error(f'分组{group.group_id} 调度计算异常')
try:
logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
submission.group_dispatch_to_redis(group, truck_dispatch_plan_dict)
except Exception as es:
logger.error(es)
logger.error(f'分组{group.group_id} 调度写入异常')
except Exception as es:
logger.error("最外层异常捕获")
logger.error(es)
return jsonify(msg="未知异常, 请联系管理员", code=505)
session_mysql.close()
session_postgre.close()
logger.info("#####################################请求调度更新结束#####################################")
# 调度结束时间
rtd_end_time = datetime.now()
print(f'调度时耗 {rtd_end_time - rtd_start_time}')
return jsonify(msg="success", code=0)
\ No newline at end of file
This diff is collapsed.
# from redispatch.topo_graph import *
# import networkx as nx
# import matplotlib.pyplot as plt
#
# topo = Topo()
# topo.generate_topo_graph()
# load_G = topo.get_load_G()
# pos = nx.shell_layout(load_G)
# nx.draw(load_G, pos, with_labels=True, node_color='red', edge_color='blue', font_size=18, width=5, node_size=600,
# alpha=0.5)
# # topo.get_unload_target_node_real()
# plt.show()
A = [['309705a0-5ddf-4559-b6c4-ee17a57677ad', 9.04], ['899705a0-5ddf-4559-b6c4-ee17a57677ad', 6.05]]
A = sorted(A, key=lambda item: item[1])
print(A)
\ No newline at end of file
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/8/2 17:07
# @Author : Opfer
# @Site :
# @File : topo_sql.py.py
# @Software: PyCharm
import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
print ("数据库打开成功")
cursor = c.execute("SELECT * FROM GRAPH")
# c.execute("INSERT INTO GRAPH (id, startNodeId, endNodeId, distance) VALUES ('text_id12', 'as4343', 'sdsdsd', 20000.00 )")
# conn.commit()
for row in cursor:
print("id = ", row[0])
print("startNodeId = ", row[1])
print("endNodeId = ", row[2])
print("distance= ", row[3])
print("dir= ", row[4])
print ("数据操作成功")
conn.close()
This diff is collapsed.
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/8/31 15:17
# @Author : Opfer
# @Site :
# @File : __init__.py
# @Software: PyCharm
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
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