Commit 1e0b7111 authored by 张晓彤's avatar 张晓彤

交叉口二次调度

parent 6f85727b
......@@ -6,11 +6,10 @@
# @File : alg.py
# @Software: PyCharm
from para_config import *
from equipment import ExcavatorInfo, DumpInfo, TruckInfo
from data.para_config import *
from equipment import DumpInfo
from data.dispatchInfo import DispatchInfo
# from core.group import Group
from core.schedule import PreSchedule
class AlgorithmBase:
......@@ -148,33 +147,33 @@ class ExpectedTime(AlgorithmBase):
:return: travel_time_value
"""
try:
# try:
# truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
# truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
# trip = self.truck.get_truck_current_trip()[truck_index]
#
# task = self.truck.get_truck_current_task()[truck_id]
# trip = self.truck.get_truck_current_trip()[truck_index]
#
# task = self.truck.get_truck_current_task()[truck_id]
truck_id = truck_info.get_truck_id()
truck_id = truck_info.get_truck_id()
truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
# task = truck_task
# trip = truck_trip
truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
# task = truck_task
# trip = truck_trip
trip = truck_info.get_trip()
trip = truck_info.get_trip()
task = truck_info.get_task()
task = truck_info.get_task()
truck_avl_time = self.pre_sch.get_truck_avl_time(truck_id=truck_id)
truck_avl_time = self.pre_sch.get_truck_avl_time(truck_id=truck_id)
group_dynamic_excavator_num = len(self.group.excavator)
group_dynamic_excavator_num = len(self.group.excavator)
group_dynamic_unload_area_num = len(self.group.unload_area)
except Exception as es:
self.logger.error("车辆调度信息读取异常")
self.logger.error(es)
group_dynamic_unload_area_num = len(self.group.unload_area)
#
# except Exception as es:
# self.logger.error("车辆调度信息读取异常")
# self.logger.error(es)
if task == -2:
################################################ 矿卡启动 ###############################################
......
from flask import Flask, request
from flask.json import jsonify
from para_config import *
from data.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.dispatcher import PreSchedule
from core.group import Group
from flask_caching import Cache
from alg.algorithm import ExpectedTime
......
......@@ -8,23 +8,23 @@
},
"mysql": {
"host": "192.168.9.152",
"host": "172.16.0.103",
"port": "3306",
"user": "root",
"password": "Huituo@123",
"database": "waytous"
"database": "ht_zhunneng"
},
"postgresql": {
"host": "192.168.9.152",
"host": "172.16.0.103",
"port": "5432",
"user": "postgres",
"password": "Huituo@123",
"database": "shenbao_2021520"
"database": "gis_zhunneng"
},
"redis": {
"host": "192.168.9.152",
"host": "172.16.0.103",
"password": "Huituo@123"
}
}
\ No newline at end of file
......@@ -9,16 +9,15 @@
from data.dispatchInfo import DispatchInfo
from core.group import Group
from alg.algorithm import ExpectedTime
from settings import get_logger, session_mysql, redis5
from tables import Dispatch, DispatchMatch, DispatchEquipment, DispatchGroup, DispatchSetting
from para_config import DeviceMap, get_value, global_period_para_update
from settings import get_logger, redis5
from tables import DispatchSetting
from data.para_config import get_value
from equipment import TruckInfo, ExcavatorInfo, DumpInfo
from core.schedule import PreSchedule
import json
import uuid
from tables import session_mysql, session_postgre
import numpy as np
from datetime import datetime, timedelta
from graph.graph_load import graph_construct
class Dispatcher:
......@@ -34,6 +33,7 @@ class Dispatcher:
self.request_mode = request_mode
self.submission = DispatchSubmission(dump, excavator, truck)
self.logger = get_logger("zxt.dispatcher")
self.topo = graph_construct()
def period_update(self):
"""
......@@ -47,6 +47,7 @@ class Dispatcher:
self.excavator.excavator_para_period_update()
self.truck.truck_para_period_update(self.dump, self.excavator)
self.truck.state_period_update()
self.topo = graph_construct()
def group_generate(self):
"""
......@@ -57,7 +58,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, self.excavator, self.dump)
group = Group(group_id, self.truck, self.pre_sch, self.excavator, self.dump, self.topo)
self.group_list[group_id] = group
def group_info_update(self):
......@@ -77,13 +78,13 @@ class Dispatcher:
aa = self.group_list
for group in self.group_list.values():
try:
# try:
truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
except Exception as es:
self.logger.error(es)
self.logger.error(f'分组{group.group_id} 调度异常')
# except Exception as es:
# self.logger.error(es)
# self.logger.error(f'分组{group.group_id} 调度异常')
self.logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
self.logger.info("组内挖机")
......@@ -120,6 +121,7 @@ class DispatchSubmission:
record = {"truckId": truck_id}
task = self.truck.get_truck_current_task()[truck_id]
state = self.truck.get_truck_current_state()[truck_id]
except Exception as es:
self.logger.error("调度结果写入异常-读取矿卡信息异常(uuid, group id, task)")
......@@ -157,7 +159,7 @@ class DispatchSubmission:
redis5.set(truck_id, str(json.dumps(record)))
else:
if task in [0, 1, 2]: # 卡车空载或在装载区出场前, 可变更卸载目的地
if task in [1, 2] or (task == 3 and state == 2): # 卡车空载或在装载区出场前, 可变更卸载目的地
# 查询车辆相关派车计划
try:
......@@ -174,18 +176,6 @@ class DispatchSubmission:
item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first())
self.logger.error(es)
# # 调度目的地写入
# try:
# if dispatch_seq[0] is None:
# raise Exception("调度计划表与实时监控不匹配")
# record["dumpId"] = DispatchInfo.unload_area_dump_dict[dispatch_seq[1]]
# record["unloadAreaId"] = dispatch_seq[1]
# except Exception as es:
# # item = (session_mysql.query(DispatchSetting).filter_by(truck_id=truck_id, isdeleted=0, ).first())
# record["dumpId"] = item.dump_id
# record["unloadAreaId"] = item.unload_area_id
# self.logger.error(es)
# 其余调度信息写入
try:
# record["dispatchId"] = item.id
......@@ -207,7 +197,7 @@ class DispatchSubmission:
finally:
redis5.set(truck_id, str(json.dumps(record)))
elif task in [3, 4, 5]: # 卡车重载或在卸载区出场前, 可变更装载目的地
elif task in [4, 5] or (task == 0 and state == 2): # 卡车重载或在卸载区出场前, 可变更装载目的地
# 查询车辆相关派车计划
try:
......@@ -221,18 +211,6 @@ class DispatchSubmission:
item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first())
self.logger.error(es)
# # 调度目的地写入
# try:
# if dispatch_seq[0] is None:
# raise Exception("调度计划表与实时监控不匹配")
# record["exactorId"] = dispatch_seq[0]
# record["loadAreaId"] = DispatchInfo.excavator_load_dict[dispatch_seq[0]]
# except Exception as es:
# # item = (session_mysql.query(DispatchSetting).filter_by(truck_id=truck_id, isdeleted=0, ).first())
# record["exactorId"] = item.exactor_id
# record["loadAreaId"] = item.load_area_id
# self.logger.error(es)
# 调度信息写入
try:
# record["dispatchId"] = item.id
......@@ -269,21 +247,6 @@ class DispatchSubmission:
isdeleted=0, ).first())
self.logger.error(es)
# # 调度目的地写入
# try:
# if dispatch_seq[0] is None:
# raise Exception("调度计划表与实时监控不匹配")
# record["exactorId"] = dispatch_seq[0]
# record["loadAreaId"] = DispatchInfo.excavator_load_dict[dispatch_seq[0]]
# except Exception as es:
# item = (
# session_mysql.query(DispatchSetting)
# .filter_by(truck_id=truck_id,
# isdeleted=0).first())
# record["exactorId"] = item.exactor_id
# record["loadAreaId"] = item.load_area_id
# self.logger.error(es)
# 调度信息写入
try:
......@@ -332,12 +295,15 @@ class DispatchSubmission:
self.logger.info(dispatch_plan_dict)
for truck_id, dispatch_plan in dispatch_plan_dict.items():
self.logger.info(f'======================================= 调度车辆 =======================================')
self.logger.info(f'矿车编号 {get_value("truck_uuid_to_name_dict")[truck_id]} {truck_id}')
self.logger.info(f'调度模式 {group.group_mode}')
self.logger.info(f'车辆任务 {group.truck_info_list[truck_id].get_task()}')
self.logger.info(f'配对挖机 {dispatch_plan[0]}')
self.logger.info(f'配对卸点 {dispatch_plan[1]}')
self.truck_dispatch_to_redis(truck_id, dispatch_plan)
self.logger.info("======================================== 完成写入 =======================================")
try:
self.logger.info(f'======================================= 调度车辆 =======================================')
self.logger.info(f'矿车编号 {get_value("truck_uuid_to_name_dict")[truck_id]} {truck_id}')
self.logger.info(f'调度模式 {group.group_mode}')
self.logger.info(f'车辆任务 {group.truck_info_list[truck_id].get_task()}')
self.logger.info(f'配对挖机 {dispatch_plan[0]}')
self.logger.info(f'配对卸点 {dispatch_plan[1]}')
self.truck_dispatch_to_redis(truck_id, dispatch_plan)
self.logger.info("======================================== 完成写入 =======================================")
except Exception as es:
self.logger.error("group_dispatch_to_redis_error")
self.logger.error(es)
This diff is collapsed.
......@@ -6,14 +6,10 @@
# @File : schedule.py
# @Software: PyCharm
from data.dispatchInfo import DispatchInfo
# from core.group import Group
# from alg.algorithm import ExpectedTime
from settings import get_logger, session_mysql, redis5
from tables import Dispatch
from para_config import DeviceMap, get_value, global_period_para_update
from equipment import TruckInfo, ExcavatorInfo, DumpInfo
import json
from settings import get_logger
from data.para_config import get_value
import numpy as np
from datetime import datetime, timedelta
......@@ -81,6 +77,8 @@ class PreSchedule:
for i in range(trucks):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1]
if end_area_index == -1:
continue
# self.logger.info("update_truck_reach_time-truck_current_trip")
# self.logger.info(truck_current_trip)
if task in [0, 1]: # 卡车空载行驶或正在入场
......@@ -217,40 +215,40 @@ class PreSchedule:
unloading_task_time = self.dump.get_unloading_task_time()
try:
now = float(
(datetime.now() - self.start_time)
/ timedelta(hours=0, minutes=1, seconds=0)
)
# try:
for reach_ls in dump_avl_ls:
if len(reach_ls) != 0:
reach_ls = np.array(reach_ls)
tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)]
for i in range(len(tmp)):
now = float(
(datetime.now() - self.start_time)
/ timedelta(hours=0, minutes=1, seconds=0)
)
dump_index = int(tmp[i][2])
dump_id = self.dump.dump_index_to_uuid_dict[dump_index]
self.dump_avl_time[dump_index] = (
max(tmp[i][0], self.dump_avl_time[dump_index])
+ unloading_task_time[dump_index]
)
self.dump_avl_time_dict[dump_id] = self.dump_avl_time[dump_index]
truck_index = int(tmp[i][1])
truck_id = self.truck.truck_index_to_uuid_dict[truck_index]
self.truck_avl_time[truck_index] = self.dump_avl_time[dump_index]
self.truck_avl_time_dict[truck_id] = self.truck_avl_time[truck_index]
# # 若卸载设备可用时间严重偏离,进行修正
# if abs(self.dump_avl_time[dump_index] - now) > 60:
# self.dump_avl_time[dump_index] = now
# if abs(self.truck_avl_time[int(tmp[i][1])] - now) > 60:
# self.truck_avl_time[int(tmp[i][1])] = now
except Exception as es:
self.logger.error("卸载设备可用时间计算异常")
self.logger.error(es)
for reach_ls in dump_avl_ls:
if len(reach_ls) != 0:
reach_ls = np.array(reach_ls)
tmp = reach_ls[np.lexsort(reach_ls[:, ::-1].T)]
for i in range(len(tmp)):
dump_index = int(tmp[i][2])
dump_id = self.dump.dump_index_to_uuid_dict[dump_index]
self.dump_avl_time[dump_index] = (
max(tmp[i][0], self.dump_avl_time[dump_index])
+ unloading_task_time[dump_index]
)
self.dump_avl_time_dict[dump_id] = self.dump_avl_time[dump_index]
truck_index = int(tmp[i][1])
truck_id = self.truck.truck_index_to_uuid_dict[truck_index]
self.truck_avl_time[truck_index] = self.dump_avl_time[dump_index]
self.truck_avl_time_dict[truck_id] = self.truck_avl_time[truck_index]
# # 若卸载设备可用时间严重偏离,进行修正
# if abs(self.dump_avl_time[dump_index] - now) > 60:
# self.dump_avl_time[dump_index] = now
# if abs(self.truck_avl_time[int(tmp[i][1])] - now) > 60:
# self.truck_avl_time[int(tmp[i][1])] = now
# except Exception as es:
# self.logger.error("卸载设备可用时间计算异常")
# self.logger.error(es)
return self.dump_avl_time_dict
......
......@@ -6,7 +6,7 @@
# @File : para_config.py
# @Software: PyCharm
from static_data_process import *
from data.static_data_process import *
from settings import *
import numpy as np
......
......@@ -6,7 +6,7 @@
# @File : dump.py
# @Software: PyCharm
from para_config import *
from data.para_config import *
from settings import *
......
......@@ -6,7 +6,7 @@
# @File : excavator.py
# @Software: PyCharm
from para_config import *
from data.para_config import *
from settings import *
......
......@@ -6,9 +6,7 @@
# @File : truck.py
# @Software: PyCharm
from para_config import *
from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo
from data.para_config import *
from typing import List
......@@ -33,6 +31,8 @@ class TruckInfo(WalkManage):
self.relative_last_unload_time = {}
# 矿卡当前任务
self.truck_current_task = {}
# 矿卡当前状态
self.truck_current_state = {}
# 调度开始时间
self.start_time = datetime.now()
# 矿卡有效载重
......@@ -84,6 +84,8 @@ class TruckInfo(WalkManage):
# 对象域
self._dump = dump
self._excavator = excavator
# 车辆位置信息
self.truck_locate_dict = {}
def get_truck_current_trip(self):
return self.truck_current_trip
......@@ -91,6 +93,9 @@ class TruckInfo(WalkManage):
def get_truck_current_task(self):
return self.truck_current_task
def get_truck_current_state(self):
return self.truck_current_state
def get_truck_num(self):
return self.dynamic_truck_num
......@@ -124,6 +129,9 @@ class TruckInfo(WalkManage):
def get_excavator_hold_truck_num(self):
return self.excavator_hold_truck_num
def get_truck_locate_dict(self):
return self.truck_locate_dict
################################################ short term update ################################################
# 更新矿卡当前任务
......@@ -134,21 +142,24 @@ class TruckInfo(WalkManage):
truck_name_to_uuid_dict = get_value("truck_name_to_uuid_dict")
for item in device_name_set:
try:
item = item.decode(encoding="utf-8")
key_value_dict = redis2.hgetall(item) # reids str可以自动转为bytes
device_type = int(key_value_dict[str_to_byte("type")])
if device_type == 1:
bb = self.dynamic_truck_set
cc = truck_name_to_uuid_dict
if truck_name_to_uuid_dict[item] in self.dynamic_truck_set:
currentTask = int(key_value_dict[str_to_byte("currentTask")])
self.truck_current_task[
truck_name_to_uuid_dict[item]
] = currentTask
except Exception as es:
self.logger.error("读取矿卡任务异常-reids读取异常")
self.logger.error(es)
# try:
item = item.decode(encoding="utf-8")
key_value_dict = redis2.hgetall(item) # reids str可以自动转为bytes
device_type = int(key_value_dict[str_to_byte("type")])
if device_type == 1:
if truck_name_to_uuid_dict[item] in self.dynamic_truck_set:
# currentTask = int(key_value_dict[str_to_byte("currentTask")])
currentTask = int(byte_to_str(key_value_dict[str_to_byte("currentTask")]))
self.truck_current_task[
truck_name_to_uuid_dict[item]
] = currentTask
currentState = int(float(byte_to_str(key_value_dict[str_to_byte("state")])))
self.truck_current_state[
truck_name_to_uuid_dict[item]
] = currentState
# except Exception as es:
# self.logger.error("读取矿卡任务异常-reids读取异常")
# self.logger.error(es)
self.logger.info("矿卡当前任务:")
self.logger.info(self.truck_current_task)
......@@ -277,13 +288,6 @@ class TruckInfo(WalkManage):
.filter_by(truck_id=truck_id, isdeleted=0)
.first()
)
# item = (
# session_mysql.query(DispatchSetting)
# .filter_by(truck_id=truck_id, isdeleted=0)
# .first()
# )
point = empty_task_set
point2 = heavy_task_set
if task in (empty_task_set + heavy_task_set) and item is None:
raise Exception(f"矿卡 {truck_id} 配对关系异常")
except Exception as es:
......@@ -295,14 +299,8 @@ class TruckInfo(WalkManage):
try:
load_area_uuid_to_index_dict = get_value("load_area_uuid_to_index_dict")
unload_area_uuid_to_index_dict = get_value("unload_area_uuid_to_index_dict")
aa = task
tt = truck_id
# 若矿卡状态为空运
if task in [0, 1, 2]: # 矿卡空载或仍未出装载区
# last_unload_time = self.relative_last_unload_time[
# self.truck_index_to_uuid_dict[i]
# ]
bb = self.relative_last_unload_time
last_unload_time = self.relative_last_unload_time[
truck_id
]
......@@ -473,6 +471,36 @@ class TruckInfo(WalkManage):
print("self.excavator_hold_truck_num")
print(self.excavator_hold_truck_num)
def update_trucks_locate(self):
"""
get trucks locates.
:return: truck_locate_dict
"""
try:
truck_name_to_uuid_dict = get_value("truck_name_to_uuid_dict")
self.truck_locate_dict = {}
device_name_set = redis2.keys()
for item in device_name_set:
item = item.decode(encoding='utf-8')
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')]
if eval(truck_locate) is not '':
self.truck_locate_dict[truck_name_to_uuid_dict[item]] = eval(truck_locate)
except Exception as es:
logger.error("车辆所在路段读取异常")
logger.error(es)
return {}
################################################ long term update ################################################
# 更新矿卡实际容量
......@@ -852,8 +880,6 @@ class TruckInfo(WalkManage):
# 更新矿卡物料类型
self.update_truck_material()
def state_period_update(self):
# 更新卡车当前任务
......@@ -870,3 +896,6 @@ class TruckInfo(WalkManage):
# 矿卡速度更新
self.update_truck_speed()
# 矿卡位置更新
self.update_trucks_locate()
This diff is collapsed.
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:38
# @Time : 2022/9/7 9:55
# @Author : Opfer
# @Site :
# @File : __init__.py
......
......@@ -53,6 +53,10 @@ class Topo():
# 获取日志器
self.logger = get_logger("zxt.topo")
# 车辆交叉路口点集合
self.cross_nodes = []
self.cross_bf_lanes = []
"""
unload_G funcions
"""
......@@ -99,6 +103,8 @@ class Topo():
except Exception as es:
self.logger.error(es)
self.logger.error("获取地图信息出错")
session_mysql.rollback()
session_postgre.rollback()
def return_work_area_distance_info(self):
self.get_work_area_distance_info()
......@@ -111,6 +117,8 @@ class Topo():
except Exception as es:
self.logger.error(es)
self.logger.error("获取地图备停区信息出错")
session_mysql.rollback()
session_postgre.rollback()
"""
generate_topo_graph: unload_G and load_G
......@@ -186,6 +194,8 @@ class Topo():
except Exception as es:
self.logger.error(es)
self.logger.error("去卸载区拓扑图出错")
session_mysql.rollback()
session_postgre.rollback()
# path_node_for_trip.append(Exitnode_for_digging) # add node for trip
# if i_endpoint in self.unload_G_dump_nodes:
......@@ -211,7 +221,7 @@ class Topo():
try:
load_saved_lane = []
for i in item[2]:
for i in item[2]: # [[str(item.load_area_id), str(item.unload_area_id)], item.to_unload_lanes, item.to_load_lanes]
load_i_startpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().StartNodeId)
load_i_endpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().EndNodeId)
......@@ -248,6 +258,8 @@ class Topo():
except Exception as es:
self.logger.error(es)
self.logger.error("去装载区拓扑图生成失败")
session_mysql.rollback()
session_postgre.rollback()
print(self.load_G.nodes.data())
......@@ -355,7 +367,11 @@ class Topo():
def get_load_edge_node(self, truck_location_lane):
try:
# truck_location_lane = self.laneinfo.update_truck_loacate()[truck_id]
for (startnode, endnode, lane) in self.load_G.edges.data('lane'):
# print(self.load_G.edges.data())
# for item in self.load_G.edges.data('lane'):
# print(len(item))
# print(item[0], item[1], item[2])
for startnode, endnode, lane in self.load_G.edges.data('lane'):
if truck_location_lane in lane:
return startnode, endnode
except Exception as es:
......@@ -447,3 +463,27 @@ class Topo():
reachable_destinations[target_digging_area] = [k + distance_end_node, 1]
return reachable_destinations
def update_cross_nodes(self):
"""
get cross nodes.
:return:
"""
self.cross_nodes = []
for node_id, Type in self.load_G.nodes.data('name'):
if Type == 'None':
self.cross_nodes.append(node_id)
def update_cross_bf_lanes(self):
"""
get cross lanes.
:return:
"""
self.cross_bf_lanes = []
for node_id, Type in self.load_G.nodes.data('name'):
if Type == 'None':
self.cross_bf_lanes.append(str(session_postgre.query(Lane).filter_by(EndNodeId=node_id).first().Id))
def get_cross_nodes(self):
return self.cross_nodes
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/9/7 9:56
# @Author : Opfer
# @Site :
# @File : topo_update.py
# @Software: PyCharm
# 导入包
import os
from graph.graph_load import *
import networkx as nx
import matplotlib.pyplot as plt
import uuid
import sqlite3
def topo_graph_update():
# 拓扑图生成与写入
conn = sqlite3.connect('test.db')
c = conn.cursor()
print("数据库打开成功")
cursor = c.execute("DROP TABLE GRAPH_EDGE")
conn.commit()
cursor = c.execute("DROP TABLE GRAPH_NODE")
conn.commit()
cursor = c.execute("CREATE TABLE GRAPH_EDGE(id VARCHAR(30) PRIMARY KEY, startNodeId VARCHAR(30), endNodeId VARCHAR(30), distance FLOAT, type INT, lanes_sql VARCHAR(100))")
conn.commit()
cursor = c.execute("CREATE TABLE GRAPH_NODE(id VARCHAR(30) PRIMARY KEY, nodeId VARCHAR(30), name VARCHAR(30))")
conn.commit()
# 清空数据库数据
cursor = c.execute("DELETE FROM GRAPH_EDGE")
conn.commit()
cursor = c.execute("DELETE FROM GRAPH_NODE")
conn.commit()
# 生成拓扑图
topo = Topo()
topo.generate_topo_graph()
# 获取装载路径拓扑图
load_G = topo.get_load_G()
# 装载路径拓扑图数据写入数据库
for item in load_G.edges.data():
print("item load_G-edge")
print(item)
id = str(uuid.uuid4())
startNodeId = item[0]
endNodeId = item[1]
distance = item[2]['real_distance']
lanes = item[2]['lane']
lanes_sql = str(" ".join(lanes))
sql = "INSERT INTO GRAPH_EDGE VALUES ('%s', '%s', '%s', '%f', 1, '%s')" % (
id, startNodeId, endNodeId, distance, lanes_sql)
cursor = c.execute(sql)
conn.commit()
# 装载节点写入数据库
for item in load_G.nodes.data():
print("item load_G-nodes")
print(item)
id = str(uuid.uuid4())
nodeId = item[0]
if item[1] != {} and item[1]['name'] != None:
name = item[1]['name']
else:
name = 'None'
sql = "INSERT INTO GRAPH_NODE VALUES ('%s' ,'%s', '%s')" % (id, nodeId, name)
cursor = c.execute(sql)
conn.commit()
# 获取卸载路径拓扑图
unload_G = topo.get_unload_G()
# 卸载路径拓扑图写入数据库
for item in unload_G.edges.data():
print("item unload_G-edge")
print(item)
id = str(uuid.uuid4())
startNodeId = item[0]
endNodeId = item[1]
distance = item[2]['real_distance']
lanes = item[2]['lane']
lanes_sql = str(" ".join(lanes))
sql = "INSERT INTO GRAPH_EDGE VALUES ('%s', '%s', '%s', '%f', 2, '%s')" % (
id, startNodeId, endNodeId, distance, lanes_sql)
cursor = c.execute(sql)
conn.commit()
# 卸载节点写入数据库
for item in unload_G.nodes.data():
print("item unload_G-nodes")
print(item)
id = str(uuid.uuid4())
nodeId = item[0]
if item[1] != {} and item[1]['name'] != None:
name = item[1]['name']
else:
name = 'None'
sql = "INSERT INTO GRAPH_NODE VALUES ('%s', '%s', '%s')" % (id, nodeId, name)
cursor = c.execute(sql)
conn.commit()
\ No newline at end of file
This diff is collapsed.
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()
......@@ -8,7 +8,7 @@
# 实时调度模块
from para_config import *
from data.para_config import *
from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo
......
......@@ -8,7 +8,7 @@
# 实时调度模块
from para_config import *
from data.para_config import *
from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo
......
......@@ -8,17 +8,17 @@
from flask import Flask, request
from flask.json import jsonify
from para_config import *
from data.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.dispatcher import 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
from graph.graph_load import graph_construct
config = {
"DEBUG": True, # some Flask specific configs
......
# from redispatch.topo_graph import *
# from graph.topo_graph import *
# import networkx as nx
# import matplotlib.pyplot as plt
#
......@@ -11,6 +11,127 @@
# # 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
# import numpy as np
#
# arrival_truck_set = ['309705a0-5ddf-4559-b6c4-ee17a57677ad', '899705a0-5ddf-4559-b6c4-ee17a57677ad']
#
# arrival_truck_reach_time = [8.04, 6.05]
# #
# # arrival_truck_set = ['309705a0-5ddf-4559-b6c4-ee17a57677ad']
# #
# # arrival_truck_reach_time = [8.04]
#
# arrival_truck_list = list(zip(np.array(arrival_truck_set), np.array(arrival_truck_reach_time)))
#
# print(arrival_truck_list)
#
# arrival_truck_list = sorted(arrival_truck_list, key=lambda item: item[1])
#
# # print(arrival_truck_list)
# #
# # print(zip(*arrival_truck_list))
#
# for x1, x2 in arrival_truck_list:
# print(x1, x2)
# 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)
from graph.topo_graph import *
import networkx as nx
import matplotlib.pyplot as plt
import sqlite3
conn = sqlite3.connect('test.db')
c = conn.cursor()
cursor = c.execute("SELECT * FROM GRAPH_NODE")
node_label = {}
for row in cursor:
node_label[row[1]] = row[2]
print(node_label)
load_G = nx.Graph()
unload_G = nx.Graph()
cursor = c.execute("SELECT * FROM GRAPH_EDGE")
for row in cursor:
# 处理边包含路段
lanes = row[5].split(" ")
lane_info = {}
for item in lanes:
try:
# print(item)
distance = session_postgre.query(Lane).filter_by(Id=item).first().Length
lane_info[item] = list([distance, distance])
except Exception as es:
print(es)
session_postgre.rollback()
# 重构卸载路径拓扑图
if row[4] == 1:
load_G.add_node(row[1], name=node_label[row[1]])
load_G.add_node(row[2], name=node_label[row[2]])
load_G.add_edge(str(row[1]), str(row[2]), real_distance=row[3], lane=lane_info)
# 重构装载路径拓扑图
else:
unload_G.add_node(row[1], name=node_label[row[1]])
unload_G.add_node(row[2], name=node_label[row[2]])
unload_G.add_edge(str(row[1]), str(row[2]), real_distance=row[3], lane=lane_info)
print("数据操作成功")
node_label_load = {}
node_label_unload = {}
for node in load_G.nodes:
if node in node_label:
if node_label[node] == "None":
node_label_load[node] = ''
else:
node_label_load[node] = node_label[node]
else:
node_label_load[node] = ''
for node in unload_G.nodes:
if node in node_label:
if node_label[node] == "None":
node_label_unload[node] = ''
else:
node_label_unload[node] = node_label[node]
else:
node_label_unload[node] = ''
pos1 = nx.spring_layout(load_G)
# nx.draw(load_G, pos1, with_labels=False, node_color='red', edge_color='blue', font_size=30, width=3, node_size=200,
# alpha=0.5)
nx.draw_networkx(load_G, pos=pos1, labels=node_label_load, with_labels=True, node_color='red', \
edge_color='blue', font_size=10, width=1.5, node_size=100, alpha=0.5)
plt.show()
pos2 = nx.spring_layout(unload_G)
# pos2 = nx.shell_layout(unload_G)
# nx.draw(load_G, pos1, with_labels=False, node_color='red', edge_color='blue', font_size=30, width=3, node_size=200,
# alpha=0.5)
nx.draw_networkx(unload_G, pos=pos2, labels=node_label_unload, with_labels=True, node_color='red', \
edge_color='blue', font_size=15, width=3, node_size=200, alpha=0.5)
plt.show()
# topo = Topo()
# topo.load_G = load_G
# topo.unload_G = unload_G
#
# print(topo.load_G.nodes.data('None'))
# print(topo.get_load_target_node_real("6b417083-83b0-4eec-a8bd-2f85f96cb029", "1010cbfe-b134-3ef1-91bb-d746241c975a"))
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/8/3 10:51
# @Time : 2022/9/7 10:22
# @Author : Opfer
# @Site :
# @File : __init__.py.py
# @Software: PyCharm
\ No newline at end of file
# @File : topo_update_server.py
# @Software: PyCharm
from graph.topo_update import topo_graph_update
from graph.graph_load import graph_construct
# topo_graph_update()
graph_construct()
\ No newline at end of file
#!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