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

交叉口二次调度

parent 6f85727b
...@@ -6,11 +6,10 @@ ...@@ -6,11 +6,10 @@
# @File : alg.py # @File : alg.py
# @Software: PyCharm # @Software: PyCharm
from para_config import * from data.para_config import *
from equipment import ExcavatorInfo, DumpInfo, TruckInfo from equipment import DumpInfo
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
# from core.group import Group # from core.group import Group
from core.schedule import PreSchedule
class AlgorithmBase: class AlgorithmBase:
...@@ -148,7 +147,7 @@ class ExpectedTime(AlgorithmBase): ...@@ -148,7 +147,7 @@ class ExpectedTime(AlgorithmBase):
:return: travel_time_value :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]
...@@ -171,10 +170,10 @@ class ExpectedTime(AlgorithmBase): ...@@ -171,10 +170,10 @@ class ExpectedTime(AlgorithmBase):
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) group_dynamic_unload_area_num = len(self.group.unload_area)
#
except Exception as es: # except Exception as es:
self.logger.error("车辆调度信息读取异常") # self.logger.error("车辆调度信息读取异常")
self.logger.error(es) # self.logger.error(es)
if task == -2: if task == -2:
################################################ 矿卡启动 ############################################### ################################################ 矿卡启动 ###############################################
......
from flask import Flask, request from flask import Flask, request
from flask.json import jsonify from flask.json import jsonify
from para_config import * from data.para_config import *
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
from core.dispatcher import Dispatcher, PreSchedule from core.dispatcher import PreSchedule
from core.group import Group from core.group import Group
from flask_caching import Cache from flask_caching import Cache
from alg.algorithm import ExpectedTime from alg.algorithm import ExpectedTime
......
...@@ -8,23 +8,23 @@ ...@@ -8,23 +8,23 @@
}, },
"mysql": { "mysql": {
"host": "192.168.9.152", "host": "172.16.0.103",
"port": "3306", "port": "3306",
"user": "root", "user": "root",
"password": "Huituo@123", "password": "Huituo@123",
"database": "waytous" "database": "ht_zhunneng"
}, },
"postgresql": { "postgresql": {
"host": "192.168.9.152", "host": "172.16.0.103",
"port": "5432", "port": "5432",
"user": "postgres", "user": "postgres",
"password": "Huituo@123", "password": "Huituo@123",
"database": "shenbao_2021520" "database": "gis_zhunneng"
}, },
"redis": { "redis": {
"host": "192.168.9.152", "host": "172.16.0.103",
"password": "Huituo@123" "password": "Huituo@123"
} }
} }
\ No newline at end of file
...@@ -9,16 +9,15 @@ ...@@ -9,16 +9,15 @@
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
from core.group import Group from core.group import Group
from alg.algorithm import ExpectedTime from alg.algorithm import ExpectedTime
from settings import get_logger, session_mysql, redis5 from settings import get_logger, redis5
from tables import Dispatch, DispatchMatch, DispatchEquipment, DispatchGroup, DispatchSetting from tables import DispatchSetting
from para_config import DeviceMap, get_value, global_period_para_update from data.para_config import get_value
from equipment import TruckInfo, ExcavatorInfo, DumpInfo from equipment import TruckInfo, ExcavatorInfo, DumpInfo
from core.schedule import PreSchedule from core.schedule import PreSchedule
import json import json
import uuid import uuid
from tables import session_mysql, session_postgre from tables import session_mysql, session_postgre
import numpy as np from graph.graph_load import graph_construct
from datetime import datetime, timedelta
class Dispatcher: class Dispatcher:
...@@ -34,6 +33,7 @@ class Dispatcher: ...@@ -34,6 +33,7 @@ class Dispatcher:
self.request_mode = request_mode self.request_mode = request_mode
self.submission = DispatchSubmission(dump, excavator, truck) self.submission = DispatchSubmission(dump, excavator, truck)
self.logger = get_logger("zxt.dispatcher") self.logger = get_logger("zxt.dispatcher")
self.topo = graph_construct()
def period_update(self): def period_update(self):
""" """
...@@ -47,6 +47,7 @@ class Dispatcher: ...@@ -47,6 +47,7 @@ class Dispatcher:
self.excavator.excavator_para_period_update() self.excavator.excavator_para_period_update()
self.truck.truck_para_period_update(self.dump, self.excavator) self.truck.truck_para_period_update(self.dump, self.excavator)
self.truck.state_period_update() self.truck.state_period_update()
self.topo = graph_construct()
def group_generate(self): def group_generate(self):
""" """
...@@ -57,7 +58,7 @@ class Dispatcher: ...@@ -57,7 +58,7 @@ class Dispatcher:
groups = DispatchInfo.get_all_group() groups = DispatchInfo.get_all_group()
for group_id in groups: for group_id in groups:
if group_id not in self.group_list: 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 self.group_list[group_id] = group
def group_info_update(self): def group_info_update(self):
...@@ -77,13 +78,13 @@ class Dispatcher: ...@@ -77,13 +78,13 @@ class Dispatcher:
aa = self.group_list aa = self.group_list
for group in self.group_list.values(): 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: # except Exception as es:
self.logger.error(es) # self.logger.error(es)
self.logger.error(f'分组{group.group_id} 调度异常') # self.logger.error(f'分组{group.group_id} 调度异常')
self.logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}') self.logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
self.logger.info("组内挖机") self.logger.info("组内挖机")
...@@ -120,6 +121,7 @@ class DispatchSubmission: ...@@ -120,6 +121,7 @@ class DispatchSubmission:
record = {"truckId": truck_id} record = {"truckId": truck_id}
task = self.truck.get_truck_current_task()[truck_id] task = self.truck.get_truck_current_task()[truck_id]
state = self.truck.get_truck_current_state()[truck_id]
except Exception as es: except Exception as es:
self.logger.error("调度结果写入异常-读取矿卡信息异常(uuid, group id, task)") self.logger.error("调度结果写入异常-读取矿卡信息异常(uuid, group id, task)")
...@@ -157,7 +159,7 @@ class DispatchSubmission: ...@@ -157,7 +159,7 @@ class DispatchSubmission:
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
else: else:
if task in [0, 1, 2]: # 卡车空载或在装载区出场前, 可变更卸载目的地 if task in [1, 2] or (task == 3 and state == 2): # 卡车空载或在装载区出场前, 可变更卸载目的地
# 查询车辆相关派车计划 # 查询车辆相关派车计划
try: try:
...@@ -174,18 +176,6 @@ class DispatchSubmission: ...@@ -174,18 +176,6 @@ class DispatchSubmission:
item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first()) item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first())
self.logger.error(es) 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: try:
# record["dispatchId"] = item.id # record["dispatchId"] = item.id
...@@ -207,7 +197,7 @@ class DispatchSubmission: ...@@ -207,7 +197,7 @@ class DispatchSubmission:
finally: finally:
redis5.set(truck_id, str(json.dumps(record))) 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: try:
...@@ -221,18 +211,6 @@ class DispatchSubmission: ...@@ -221,18 +211,6 @@ class DispatchSubmission:
item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first()) item = (session_mysql.query(DispatchSetting).filter_by(group_id=group_id, isdeleted=0, ).first())
self.logger.error(es) 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: try:
# record["dispatchId"] = item.id # record["dispatchId"] = item.id
...@@ -269,21 +247,6 @@ class DispatchSubmission: ...@@ -269,21 +247,6 @@ class DispatchSubmission:
isdeleted=0, ).first()) isdeleted=0, ).first())
self.logger.error(es) 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: try:
...@@ -332,6 +295,7 @@ class DispatchSubmission: ...@@ -332,6 +295,7 @@ class DispatchSubmission:
self.logger.info(dispatch_plan_dict) self.logger.info(dispatch_plan_dict)
for truck_id, dispatch_plan in dispatch_plan_dict.items(): for truck_id, dispatch_plan in dispatch_plan_dict.items():
try:
self.logger.info(f'======================================= 调度车辆 =======================================') self.logger.info(f'======================================= 调度车辆 =======================================')
self.logger.info(f'矿车编号 {get_value("truck_uuid_to_name_dict")[truck_id]} {truck_id}') 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.group_mode}')
...@@ -340,4 +304,6 @@ class DispatchSubmission: ...@@ -340,4 +304,6 @@ class DispatchSubmission:
self.logger.info(f'配对卸点 {dispatch_plan[1]}') self.logger.info(f'配对卸点 {dispatch_plan[1]}')
self.truck_dispatch_to_redis(truck_id, dispatch_plan) self.truck_dispatch_to_redis(truck_id, dispatch_plan)
self.logger.info("======================================== 完成写入 =======================================") self.logger.info("======================================== 完成写入 =======================================")
except Exception as es:
self.logger.error("group_dispatch_to_redis_error")
self.logger.error(es)
...@@ -11,7 +11,8 @@ from bidict import bidict ...@@ -11,7 +11,8 @@ from bidict import bidict
from alg.algorithm import AlgorithmBase,DistributionRatio from alg.algorithm import AlgorithmBase,DistributionRatio
import numpy as np import numpy as np
# from settings import get_logger # from settings import get_logger
from para_config import get_value from data.para_config import get_value
class CurrentTruck: class CurrentTruck:
""" class for the information of current dispatching truck. """ class for the information of current dispatching truck.
...@@ -50,7 +51,7 @@ class Group: ...@@ -50,7 +51,7 @@ class Group:
""" """
class for group instance. class for group instance.
""" """
def __init__(self, group_id, truck, pre_sch, excavator_info, dump_info): def __init__(self, group_id, truck, pre_sch, excavator_info, dump_info, topo):
""" Generate a group obj. """ Generate a group obj.
:param group_id: (uuid) group_id :param group_id: (uuid) group_id
""" """
...@@ -63,6 +64,9 @@ class Group: ...@@ -63,6 +64,9 @@ class Group:
self.excavator_info = excavator_info self.excavator_info = excavator_info
self.dump_info = dump_info self.dump_info = dump_info
# topo graph
self.topo = topo
# group devices # group devices
self.excavator = {} # excavator_id -> unload_area_id self.excavator = {} # excavator_id -> unload_area_id
self.unload_area = {} # unload_area_id -> load_area_id self.unload_area = {} # unload_area_id -> load_area_id
...@@ -267,14 +271,21 @@ class Group: ...@@ -267,14 +271,21 @@ class Group:
s = solver(self, self.truck, self.pre_sch) # algorithm init s = solver(self, self.truck, self.pre_sch) # algorithm init
for i in list(self.truck_set): for i in list(self.truck_set):
self.logger.info("车辆调度程序")
# try:
truck_trip = self.truck.get_truck_current_trip()[self.truck.truck_uuid_to_index_dict[i]] truck_trip = self.truck.get_truck_current_trip()[self.truck.truck_uuid_to_index_dict[i]]
truck_task = self.truck.get_truck_current_task()[i] truck_task = self.truck.get_truck_current_task()[i]
truck_info = CurrentTruck(i, self.group_id, truck_trip, truck_task) truck_info = CurrentTruck(i, self.group_id, truck_trip, truck_task)
self.truck_info_list[i] = truck_info self.truck_info_list[i] = truck_info
# except Exception as es:
# self.logger.error("车辆调度信息读取异常")
# self.logger.error(es)
# 全智能模式 # 全智能模式
if self.group_mode == 1: if self.group_mode == 1:
if truck_task in [-2, 3, 4, 5]: # 车辆停止或者车辆位于装载区内, 调度车辆前往卸载区
try: if truck_task in [-2, 1, 2]:
# try:
if i in self.truck.truck_excavator_bind: if i in self.truck.truck_excavator_bind:
next_excavator_id = self.truck.truck_excavator_bind[i] next_excavator_id = self.truck.truck_excavator_bind[i]
else: else:
...@@ -291,11 +302,11 @@ class Group: ...@@ -291,11 +302,11 @@ class Group:
next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id] next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id] truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
except Exception as es: # except Exception as es:
self.logger.error("重载车辆全智能模式-计算异常") # self.logger.error("重载车辆全智能模式-计算异常")
self.logger.error(es) # self.logger.error(es)
# 车辆位于卸载区内, 调度车辆前往装载区
if truck_task in [0, 1, 2]: elif truck_task in [4, 5]:
try: try:
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]] next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]]
next_unload_area_value = s.solve(truck_info) next_unload_area_value = s.solve(truck_info)
...@@ -329,6 +340,109 @@ class Group: ...@@ -329,6 +340,109 @@ class Group:
self.logger.error("空载车辆全智能模式-计算异常") self.logger.error("空载车辆全智能模式-计算异常")
self.logger.error(es) self.logger.error(es)
truck_dispatch[i] = [None, None] truck_dispatch[i] = [None, None]
elif truck_task == 0:
truck_locate = self.truck.get_truck_locate_dict()[i]
# 车辆当前位于交叉路口前,且排队等待
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.truck.truck_current_state[i]}')
if truck_locate in self.topo.cross_bf_lanes and self.truck.truck_current_state[i] == 2:
self.logger.info("触发二次调度")
# 当前绑定卸载区
if truck_trip[0] == -1:
next_unload_area_id = session_mysql.query(EquipmentPair).filter_by(truck_id=i, isdeleted=0).first().unload_area_id
else:
dump_id = get_value("dump_index_to_uuid_dict")[truck_trip[0]]
next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id]
# 当前绑定装载区
if truck_trip[-1] == -1:
item = session_mysql.query(EquipmentPair).filter_by(truck_id=i, isdeleted=0).first()
current_excavator_id = item.exactor_id
current_load_area_id = item.load_area_id
else:
current_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]]
current_load_area_id = DispatchInfo.excavator_load_dict[current_excavator_id]
load_area_dict = self.topo.get_load_target_node_real(truck_locate, current_load_area_id)
self.logger.info(load_area_dict)
# if truck_locate in self.topo.get_cross_nodes() and self.truck.truck_current_state[i] == 0:
# print(self.topo.get_load_target_node_real("6b417083-83b0-4eec-a8bd-2f85f96cb029", "1010cbfe-b134-3ef1-91bb-d746241c975a"))
min_trip_time = 10000000
best_excavator_id = current_excavator_id
for load_area, value in load_area_dict.items():
# 车辆不需要掉头
if value[-1] == 1 and load_area in DispatchInfo.load_excavator_dict:
excavator_id = DispatchInfo.load_excavator_dict[load_area]
traveling_time = value[0] / self.truck.empty_speed[i]
now = float(
(datetime.now() - self.pre_sch.start_time) / timedelta(hours=0, minutes=1, seconds=0))
reach_time = now + traveling_time
print(self.pre_sch.excavator_avl_time_dict)
trip_time = max(reach_time, self.pre_sch.get_excavator_avl_time()[excavator_id]) - now
if min_trip_time > trip_time:
best_excavator_id = excavator_id
next_excavator_id = best_excavator_id
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
self.logger.info("二次调度结果")
self.logger.info(truck_dispatch[i])
elif truck_task == 3:
truck_locate = self.truck.get_truck_locate_dict()[i]
# 车辆当前位于交叉路口前,且排队等待
if truck_locate in self.topo.cross_bf_lanes and self.truck.truck_current_state[i] == 0:
# 当前绑定装载区
if truck_trip[0] == -1:
next_excavator_id = session_mysql.query(EquipmentPair).filter_by(truck_id=i, isdeleted=0).first().exactor_id
else:
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[0]]
# 当前绑定卸载区
if truck_trip[-1] == -1:
item = session_mysql.query(EquipmentPair).filter_by(truck_id=i, isdeleted=0).first()
current_dump_id = item.dump_id
current_unload_area_id = item.unload_area_id
else:
current_dump_id = get_value("dump_index_to_uuid_dict")[truck_trip[-1]]
current_unload_area_id = DispatchInfo.dump_unload_area_dict[current_dump_id]
unload_area_dict = self.topo.get_unload_target_node_real(truck_locate, current_unload_area_id)
min_trip_time = 10000000
best_dump_id = current_dump_id
for unload_area, value in unload_area_dict.items():
# 车辆不需要掉头
if value[-1] == 1 and unload_area in DispatchInfo.unload_area_dump_dict:
dump_id = DispatchInfo.unload_area_dump_dict[unload_area]
traveling_time = value[0] / self.truck.heavy_speed[i]
now = float(
(datetime.now() - self.pre_sch.start_time) / timedelta(hours=0, minutes=1,
seconds=0))
reach_time = now + traveling_time
trip_time = max(reach_time,
self.pre_sch.get_dump_avl_time()[dump_id]) - now
if min_trip_time > trip_time:
best_dump_id = dump_id
next_unload_area_id = DispatchInfo.dump_unload_area_dict[best_dump_id]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
self.logger.info("二次调度结果")
self.logger.info(truck_dispatch[i])
# 空车智能模式 # 空车智能模式
elif self.group_mode == 2: elif self.group_mode == 2:
if truck_task in [-2, 3, 4, 5]: if truck_task in [-2, 3, 4, 5]:
......
...@@ -6,14 +6,10 @@ ...@@ -6,14 +6,10 @@
# @File : schedule.py # @File : schedule.py
# @Software: PyCharm # @Software: PyCharm
from data.dispatchInfo import DispatchInfo
# from core.group import Group # from core.group import Group
# from alg.algorithm import ExpectedTime # from alg.algorithm import ExpectedTime
from settings import get_logger, session_mysql, redis5 from settings import get_logger
from tables import Dispatch from data.para_config import get_value
from para_config import DeviceMap, get_value, global_period_para_update
from equipment import TruckInfo, ExcavatorInfo, DumpInfo
import json
import numpy as np import numpy as np
from datetime import datetime, timedelta from datetime import datetime, timedelta
...@@ -81,6 +77,8 @@ class PreSchedule: ...@@ -81,6 +77,8 @@ class PreSchedule:
for i in range(trucks): for i in range(trucks):
task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]] task = truck_current_task[self.truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1] 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("update_truck_reach_time-truck_current_trip")
# self.logger.info(truck_current_trip) # self.logger.info(truck_current_trip)
if task in [0, 1]: # 卡车空载行驶或正在入场 if task in [0, 1]: # 卡车空载行驶或正在入场
...@@ -217,7 +215,7 @@ class PreSchedule: ...@@ -217,7 +215,7 @@ class PreSchedule:
unloading_task_time = self.dump.get_unloading_task_time() unloading_task_time = self.dump.get_unloading_task_time()
try: # try:
now = float( now = float(
(datetime.now() - self.start_time) (datetime.now() - self.start_time)
...@@ -248,9 +246,9 @@ class PreSchedule: ...@@ -248,9 +246,9 @@ class PreSchedule:
# self.dump_avl_time[dump_index] = now # self.dump_avl_time[dump_index] = now
# if abs(self.truck_avl_time[int(tmp[i][1])] - now) > 60: # if abs(self.truck_avl_time[int(tmp[i][1])] - now) > 60:
# self.truck_avl_time[int(tmp[i][1])] = now # self.truck_avl_time[int(tmp[i][1])] = now
except Exception as es: # except Exception as es:
self.logger.error("卸载设备可用时间计算异常") # self.logger.error("卸载设备可用时间计算异常")
self.logger.error(es) # self.logger.error(es)
return self.dump_avl_time_dict return self.dump_avl_time_dict
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# @File : para_config.py # @File : para_config.py
# @Software: PyCharm # @Software: PyCharm
from static_data_process import * from data.static_data_process import *
from settings import * from settings import *
import numpy as np import numpy as np
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# @File : dump.py # @File : dump.py
# @Software: PyCharm # @Software: PyCharm
from para_config import * from data.para_config import *
from settings import * from settings import *
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
# @File : excavator.py # @File : excavator.py
# @Software: PyCharm # @Software: PyCharm
from para_config import * from data.para_config import *
from settings import * from settings import *
......
...@@ -6,9 +6,7 @@ ...@@ -6,9 +6,7 @@
# @File : truck.py # @File : truck.py
# @Software: PyCharm # @Software: PyCharm
from para_config import * from data.para_config import *
from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo
from typing import List from typing import List
...@@ -33,6 +31,8 @@ class TruckInfo(WalkManage): ...@@ -33,6 +31,8 @@ class TruckInfo(WalkManage):
self.relative_last_unload_time = {} self.relative_last_unload_time = {}
# 矿卡当前任务 # 矿卡当前任务
self.truck_current_task = {} self.truck_current_task = {}
# 矿卡当前状态
self.truck_current_state = {}
# 调度开始时间 # 调度开始时间
self.start_time = datetime.now() self.start_time = datetime.now()
# 矿卡有效载重 # 矿卡有效载重
...@@ -84,6 +84,8 @@ class TruckInfo(WalkManage): ...@@ -84,6 +84,8 @@ class TruckInfo(WalkManage):
# 对象域 # 对象域
self._dump = dump self._dump = dump
self._excavator = excavator self._excavator = excavator
# 车辆位置信息
self.truck_locate_dict = {}
def get_truck_current_trip(self): def get_truck_current_trip(self):
return self.truck_current_trip return self.truck_current_trip
...@@ -91,6 +93,9 @@ class TruckInfo(WalkManage): ...@@ -91,6 +93,9 @@ class TruckInfo(WalkManage):
def get_truck_current_task(self): def get_truck_current_task(self):
return self.truck_current_task return self.truck_current_task
def get_truck_current_state(self):
return self.truck_current_state
def get_truck_num(self): def get_truck_num(self):
return self.dynamic_truck_num return self.dynamic_truck_num
...@@ -124,6 +129,9 @@ class TruckInfo(WalkManage): ...@@ -124,6 +129,9 @@ class TruckInfo(WalkManage):
def get_excavator_hold_truck_num(self): def get_excavator_hold_truck_num(self):
return self.excavator_hold_truck_num return self.excavator_hold_truck_num
def get_truck_locate_dict(self):
return self.truck_locate_dict
################################################ short term update ################################################ ################################################ short term update ################################################
# 更新矿卡当前任务 # 更新矿卡当前任务
...@@ -134,21 +142,24 @@ class TruckInfo(WalkManage): ...@@ -134,21 +142,24 @@ class TruckInfo(WalkManage):
truck_name_to_uuid_dict = get_value("truck_name_to_uuid_dict") truck_name_to_uuid_dict = get_value("truck_name_to_uuid_dict")
for item in device_name_set: for item in device_name_set:
try: # try:
item = item.decode(encoding="utf-8") item = item.decode(encoding="utf-8")
key_value_dict = redis2.hgetall(item) # reids str可以自动转为bytes key_value_dict = redis2.hgetall(item) # reids str可以自动转为bytes
device_type = int(key_value_dict[str_to_byte("type")]) device_type = int(key_value_dict[str_to_byte("type")])
if device_type == 1: 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: if truck_name_to_uuid_dict[item] in self.dynamic_truck_set:
currentTask = int(key_value_dict[str_to_byte("currentTask")]) # 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[ self.truck_current_task[
truck_name_to_uuid_dict[item] truck_name_to_uuid_dict[item]
] = currentTask ] = currentTask
except Exception as es: currentState = int(float(byte_to_str(key_value_dict[str_to_byte("state")])))
self.logger.error("读取矿卡任务异常-reids读取异常") self.truck_current_state[
self.logger.error(es) 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.logger.info(self.truck_current_task) self.logger.info(self.truck_current_task)
...@@ -277,13 +288,6 @@ class TruckInfo(WalkManage): ...@@ -277,13 +288,6 @@ class TruckInfo(WalkManage):
.filter_by(truck_id=truck_id, isdeleted=0) .filter_by(truck_id=truck_id, isdeleted=0)
.first() .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: if task in (empty_task_set + heavy_task_set) and item is None:
raise Exception(f"矿卡 {truck_id} 配对关系异常") raise Exception(f"矿卡 {truck_id} 配对关系异常")
except Exception as es: except Exception as es:
...@@ -295,14 +299,8 @@ class TruckInfo(WalkManage): ...@@ -295,14 +299,8 @@ class TruckInfo(WalkManage):
try: try:
load_area_uuid_to_index_dict = get_value("load_area_uuid_to_index_dict") 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") 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]: # 矿卡空载或仍未出装载区 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[ last_unload_time = self.relative_last_unload_time[
truck_id truck_id
] ]
...@@ -473,6 +471,36 @@ class TruckInfo(WalkManage): ...@@ -473,6 +471,36 @@ class TruckInfo(WalkManage):
print("self.excavator_hold_truck_num") print("self.excavator_hold_truck_num")
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 ################################################ ################################################ long term update ################################################
# 更新矿卡实际容量 # 更新矿卡实际容量
...@@ -852,8 +880,6 @@ class TruckInfo(WalkManage): ...@@ -852,8 +880,6 @@ class TruckInfo(WalkManage):
# 更新矿卡物料类型 # 更新矿卡物料类型
self.update_truck_material() self.update_truck_material()
def state_period_update(self): def state_period_update(self):
# 更新卡车当前任务 # 更新卡车当前任务
...@@ -870,3 +896,6 @@ class TruckInfo(WalkManage): ...@@ -870,3 +896,6 @@ class TruckInfo(WalkManage):
# 矿卡速度更新 # 矿卡速度更新
self.update_truck_speed() self.update_truck_speed()
# 矿卡位置更新
self.update_trucks_locate()
This diff is collapsed.
#!E:\Pycharm Projects\Waytous #!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:38 # @Time : 2022/9/7 9:55
# @Author : Opfer # @Author : Opfer
# @Site : # @Site :
# @File : __init__.py # @File : __init__.py
......
...@@ -53,6 +53,10 @@ class Topo(): ...@@ -53,6 +53,10 @@ class Topo():
# 获取日志器 # 获取日志器
self.logger = get_logger("zxt.topo") self.logger = get_logger("zxt.topo")
# 车辆交叉路口点集合
self.cross_nodes = []
self.cross_bf_lanes = []
""" """
unload_G funcions unload_G funcions
""" """
...@@ -99,6 +103,8 @@ class Topo(): ...@@ -99,6 +103,8 @@ class Topo():
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error("获取地图信息出错") self.logger.error("获取地图信息出错")
session_mysql.rollback()
session_postgre.rollback()
def return_work_area_distance_info(self): def return_work_area_distance_info(self):
self.get_work_area_distance_info() self.get_work_area_distance_info()
...@@ -111,6 +117,8 @@ class Topo(): ...@@ -111,6 +117,8 @@ class Topo():
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error("获取地图备停区信息出错") self.logger.error("获取地图备停区信息出错")
session_mysql.rollback()
session_postgre.rollback()
""" """
generate_topo_graph: unload_G and load_G generate_topo_graph: unload_G and load_G
...@@ -186,6 +194,8 @@ class Topo(): ...@@ -186,6 +194,8 @@ class Topo():
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error("去卸载区拓扑图出错") self.logger.error("去卸载区拓扑图出错")
session_mysql.rollback()
session_postgre.rollback()
# path_node_for_trip.append(Exitnode_for_digging) # add node for trip # path_node_for_trip.append(Exitnode_for_digging) # add node for trip
# if i_endpoint in self.unload_G_dump_nodes: # if i_endpoint in self.unload_G_dump_nodes:
...@@ -211,7 +221,7 @@ class Topo(): ...@@ -211,7 +221,7 @@ class Topo():
try: try:
load_saved_lane = [] 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_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) load_i_endpoint = str(session_postgre.query(Lane).filter_by(Id=i).first().EndNodeId)
...@@ -248,6 +258,8 @@ class Topo(): ...@@ -248,6 +258,8 @@ class Topo():
except Exception as es: except Exception as es:
self.logger.error(es) self.logger.error(es)
self.logger.error("去装载区拓扑图生成失败") self.logger.error("去装载区拓扑图生成失败")
session_mysql.rollback()
session_postgre.rollback()
print(self.load_G.nodes.data()) print(self.load_G.nodes.data())
...@@ -355,7 +367,11 @@ class Topo(): ...@@ -355,7 +367,11 @@ class Topo():
def get_load_edge_node(self, truck_location_lane): def get_load_edge_node(self, truck_location_lane):
try: try:
# truck_location_lane = self.laneinfo.update_truck_loacate()[truck_id] # 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: if truck_location_lane in lane:
return startnode, endnode return startnode, endnode
except Exception as es: except Exception as es:
...@@ -447,3 +463,27 @@ class Topo(): ...@@ -447,3 +463,27 @@ class Topo():
reachable_destinations[target_digging_area] = [k + distance_end_node, 1] reachable_destinations[target_digging_area] = [k + distance_end_node, 1]
return reachable_destinations 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 @@ ...@@ -8,7 +8,7 @@
# 实时调度模块 # 实时调度模块
from para_config import * from data.para_config import *
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
# 实时调度模块 # 实时调度模块
from para_config import * from data.para_config import *
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
......
...@@ -8,17 +8,17 @@ ...@@ -8,17 +8,17 @@
from flask import Flask, request from flask import Flask, request
from flask.json import jsonify from flask.json import jsonify
from para_config import * from data.para_config import *
from equipment.truck import TruckInfo from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
from core.dispatcher import Dispatcher, PreSchedule from core.dispatcher import PreSchedule
from core.group import Group from core.group import Group
from flask_caching import Cache from flask_caching import Cache
from alg.algorithm import ExpectedTime from alg.algorithm import ExpectedTime
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
from core.dispatcher import DispatchSubmission from core.dispatcher import DispatchSubmission
from graph_load import graph_construct from graph.graph_load import graph_construct
config = { config = {
"DEBUG": True, # some Flask specific configs "DEBUG": True, # some Flask specific configs
......
# from redispatch.topo_graph import * # from graph.topo_graph import *
# import networkx as nx # import networkx as nx
# import matplotlib.pyplot as plt # import matplotlib.pyplot as plt
# #
...@@ -11,6 +11,127 @@ ...@@ -11,6 +11,127 @@
# # topo.get_unload_target_node_real() # # topo.get_unload_target_node_real()
# plt.show() # plt.show()
A = [['309705a0-5ddf-4559-b6c4-ee17a57677ad', 9.04], ['899705a0-5ddf-4559-b6c4-ee17a57677ad', 6.05]] # import numpy as np
A = sorted(A, key=lambda item: item[1]) #
print(A) # arrival_truck_set = ['309705a0-5ddf-4559-b6c4-ee17a57677ad', '899705a0-5ddf-4559-b6c4-ee17a57677ad']
\ No newline at end of file #
# 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 #!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# @Time : 2021/8/3 10:51 # @Time : 2022/9/7 10:22
# @Author : Opfer # @Author : Opfer
# @Site : # @Site :
# @File : __init__.py.py # @File : topo_update_server.py
# @Software: PyCharm # @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