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

Merge branch 'master' of github.com:Allvey/integrated-scheduling-v4

parents 4de7cc31 8d18fe04
No preview for this file type
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
/.idea/ /.idea/
/Logs/ /Logs/
/waytous/ /waytous/
*.pyc
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
...@@ -4,8 +4,12 @@ from para_config import * ...@@ -4,8 +4,12 @@ from 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 dispatcher import Dispatcher, PreSchedule, DispatchSubmission from core.dispatcher import Dispatcher, PreSchedule
from core.group import Group
from flask_caching import Cache from flask_caching import Cache
from alg.algorithm import ExpectedTime
from data.dispatchInfo import DispatchInfo
from core.dispatcher import DispatchSubmission
config = { config = {
"DEBUG": True, # some Flask specific configs "DEBUG": True, # some Flask specific configs
...@@ -35,6 +39,9 @@ def dispatch_request(): ...@@ -35,6 +39,9 @@ def dispatch_request():
# 获取日志器 # 获取日志器
logger = get_logger("zxt.request") logger = get_logger("zxt.request")
# 更新周期参数
logger.info("#####################################请求调度更新开始#####################################")
try: try:
# 清空数据库缓存 # 清空数据库缓存
...@@ -47,7 +54,7 @@ def dispatch_request(): ...@@ -47,7 +54,7 @@ def dispatch_request():
except Exception as es: except Exception as es:
logger.error("数据库访问异常") logger.error("数据库访问异常")
logger.error(es) logger.error(es)
return jsonify(msg="未知异常, 请联系管理员", code=506) return jsonify(msg="未知异常, 请联系管理员", code=501)
try: try:
...@@ -55,62 +62,109 @@ def dispatch_request(): ...@@ -55,62 +62,109 @@ def dispatch_request():
global_period_para_update() global_period_para_update()
# get_global_para_from_cache(cache) # 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.group_set:
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() dump = DumpInfo()
excavator = ExcavatorInfo() excavator = ExcavatorInfo()
truck = TruckInfo(dump, excavator) truck = TruckInfo(dump, excavator)
# 设备信息更新
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) pre_sch = PreSchedule(truck, excavator, dump)
# 实例化矿卡调度器 # 实例化输出器
dispatcher = Dispatcher(dump, excavator, truck, pre_sch, True) submission = DispatchSubmission(dump, excavator, truck)
# 实例化调度分组
group = Group(group_id, truck, pre_sch)
# 更新调度分组信息
group.info_update()
# 周期更新
dispatcher.dispatcher_period_update()
except Exception as es: except Exception as es:
logger.error("参数更新异常") logger.error("对象实例化异常")
logger.error(es) logger.error(es)
session_mysql.rollback() session_mysql.rollback()
session_postgre.rollback() session_postgre.rollback()
return jsonify(msg="未知异常, 请联系管理员", code=505) return jsonify(msg="未知异常, 请联系管理员", code=504)
request_trucks = []
try: try:
request_trucks = dispatcher.group.group_dispatch_truck[group_id]
# 调度分组派车计划计算
try:
truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
except Exception as es: except Exception as es:
logger.error(es) logger.error(es)
return jsonify(msg="未知异常, 请联系管理员", code=504) logger.error(f'分组{group.group_id} 调度计算异常')
try: try:
# 更新周期参数
logger.info("#####################################请求调度更新开始#####################################")
if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0: logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
# raise Exception("无动态派车计划可用") submission.group_dispatch_to_redis(group, truck_dispatch_plan_dict)
return jsonify(msg="未知异常, 请联系管理员", code=503) except Exception as es:
if get_value("dynamic_truck_num") == 0: logger.error(es)
# raise Exception("无动态派车可用矿卡") logger.error(f'分组{group.group_id} 调度写入异常')
return jsonify(msg="未知异常, 请联系管理员", code=502)
# 更新请调矿卡派车计划
for truck_id in request_trucks:
# 调度计算
dispatcher.truck_request(truck_id)
logger.info("#####################################请求调度更新结束#####################################")
except Exception as es: except Exception as es:
logger.error("最外层异常捕获") logger.error("最外层异常捕获")
logger.error(es) logger.error(es)
return jsonify(msg="未知异常, 请联系管理员", code=501) return jsonify(msg="未知异常, 请联系管理员", code=505)
# DBsession_postgre.close_all()
# DBsession_mysql.close_all()
session_mysql.close() session_mysql.close()
session_postgre.close() session_postgre.close()
logger.info("#####################################请求调度更新结束#####################################")
# 调度结束时间 # 调度结束时间
rtd_end_time = datetime.now() rtd_end_time = datetime.now()
......
{ {
"para": { "para": {
"log_path": "/usr/local/fleet-log/dispatch", "log_path": "./Logs/",
"empty_speed": 17, "empty_speed": 17,
"heavy_speed": 17, "heavy_speed": 17,
"dump_target_mass": 5000, "dump_target_mass": 5000,
...@@ -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_0913"
}, },
"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_0913"
}, },
"redis": { "redis": {
"host": "192.168.9.152", "host": "172.16.0.103",
"password": "Huituo@123" "password": "Huituo@123"
} }
} }
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -5,3 +5,7 @@ ...@@ -5,3 +5,7 @@
# @Site : # @Site :
# @File : __init__.py # @File : __init__.py
# @Software: PyCharm # @Software: PyCharm
from .excavator import ExcavatorInfo
from .dump import DumpInfo
from .truck import TruckInfo
...@@ -84,7 +84,7 @@ class DumpInfo(WalkManage): ...@@ -84,7 +84,7 @@ class DumpInfo(WalkManage):
# except Exception as es: # except Exception as es:
# self.logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)") # self.logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es) # self.logger.error(es)
self.unloading_time[self.dump_uuid_to_index_dict[dump_id]] = 2.00 self.unloading_time[self.dump_uuid_to_index_dict[dump_id]] = 10.00
# print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]]) # print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]])
# 更新卸载设备出入时间 # 更新卸载设备出入时间
...@@ -111,15 +111,16 @@ class DumpInfo(WalkManage): ...@@ -111,15 +111,16 @@ class DumpInfo(WalkManage):
# except Exception as es: # except Exception as es:
# self.logger.error(f"卸载设备 {dump_id} 出入场时间信息缺失, 已设为默认值(1min)") # self.logger.error(f"卸载设备 {dump_id} 出入场时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es) # self.logger.error(es)
self.entrance_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50 self.entrance_time[self.dump_uuid_to_index_dict[dump_id]] = 0.75
self.exit_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50 self.exit_time[self.dump_uuid_to_index_dict[dump_id]] = 0.75
def update_dump_material(self): def update_dump_material(self):
self.dump_material = {} self.dump_material = {}
for dump_id in get_value("dynamic_dump_set"): for dump_id in get_value("dynamic_dump_set"):
try: try:
unload_area_id = session_mysql.query(Dispatch).filter_by(dump_id=dump_id, isauto=1, isdeleted=0).first().unload_area_id # unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isauto=1, isdeleted=0).first().unload_area_id
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isdeleted=0).first().unload_area_id
dump_material_id = list(session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Materials)
self.dump_material[dump_id] = dump_material_id self.dump_material[dump_id] = dump_material_id
except Exception as es: except Exception as es:
self.logger.error("卸点物料更新异常") self.logger.error("卸点物料更新异常")
......
...@@ -82,7 +82,7 @@ class ExcavatorInfo(WalkManage): ...@@ -82,7 +82,7 @@ class ExcavatorInfo(WalkManage):
self.logger.info(self.loading_time) self.logger.info(self.loading_time)
self.logger.info("excavator_uuid_to_index_dict") self.logger.info("excavator_uuid_to_index_dict")
self.logger.info(self.excavator_uuid_to_index_dict) self.logger.info(self.excavator_uuid_to_index_dict)
self.loading_time[self.excavator_uuid_to_index_dict[excavator_id]] = 1.00 self.loading_time[self.excavator_uuid_to_index_dict[excavator_id]] = 10.00
# 更新挖机设备出入时间 # 更新挖机设备出入时间
def update_excavator_entrance_exit_time(self): def update_excavator_entrance_exit_time(self):
...@@ -111,8 +111,8 @@ class ExcavatorInfo(WalkManage): ...@@ -111,8 +111,8 @@ class ExcavatorInfo(WalkManage):
# self.logger.error(es) # self.logger.error(es)
self.entrance_time[ self.entrance_time[
self.excavator_uuid_to_index_dict[excavator_id] self.excavator_uuid_to_index_dict[excavator_id]
] = 0.50 ] = 0.75
self.exit_time[self.excavator_uuid_to_index_dict[excavator_id]] = 0.50 self.exit_time[self.excavator_uuid_to_index_dict[excavator_id]] = 0.75
# 读取出入场时间 # 读取出入场时间
def get_loading_task_time(self): def get_loading_task_time(self):
...@@ -131,7 +131,8 @@ class ExcavatorInfo(WalkManage): ...@@ -131,7 +131,8 @@ class ExcavatorInfo(WalkManage):
self.logger.info(self.dynamic_excavator_set) self.logger.info(self.dynamic_excavator_set)
for excavator_id in self.dynamic_excavator_set: for excavator_id in self.dynamic_excavator_set:
try: try:
load_area_id = session_mysql.query(Dispatch).filter_by(exactor_id=excavator_id, isdeleted=0, isauto=1).first().load_area_id # load_area_id = session_mysql.query(DispatchSetting).filter_by(exactor_id=excavator_id, isdeleted=0, isauto=1).first().load_area_id
load_area_id = session_mysql.query(DispatchSetting).filter_by(exactor_id=excavator_id, isdeleted=0).first().load_area_id
excavator_material_id = session_postgre.query(DiggingWorkArea).filter_by(Id=load_area_id).first().Material excavator_material_id = session_postgre.query(DiggingWorkArea).filter_by(Id=load_area_id).first().Material
self.excavator_material[excavator_id] = excavator_material_id self.excavator_material[excavator_id] = excavator_material_id
except Exception as es: except Exception as es:
......
...@@ -135,6 +135,8 @@ class TruckInfo(WalkManage): ...@@ -135,6 +135,8 @@ class TruckInfo(WalkManage):
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")])
self.truck_current_task[ self.truck_current_task[
...@@ -259,6 +261,7 @@ class TruckInfo(WalkManage): ...@@ -259,6 +261,7 @@ class TruckInfo(WalkManage):
# 初始化矿卡行程, -1代表备停区 # 初始化矿卡行程, -1代表备停区
self.truck_current_trip = np.full((self.dynamic_truck_num, 2), -1) self.truck_current_trip = np.full((self.dynamic_truck_num, 2), -1)
ab = self.dynamic_truck_num
for i in range(self.dynamic_truck_num): for i in range(self.dynamic_truck_num):
try: try:
session_mysql.commit() session_mysql.commit()
...@@ -270,24 +273,36 @@ class TruckInfo(WalkManage): ...@@ -270,24 +273,36 @@ class TruckInfo(WalkManage):
.filter_by(truck_id=truck_id, isdeleted=0) .filter_by(truck_id=truck_id, isdeleted=0)
.first() .first()
) )
if task in empty_task_set + heavy_task_set and item is None: # 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} 配对关系异常") raise Exception(f"矿卡 {truck_id} 配对关系异常")
except Exception as es: except Exception as es:
self.logger.error("配对关系异常")
self.logger.error(es) self.logger.error(es)
session_postgre.rollback() session_postgre.rollback()
session_mysql.rollback() session_mysql.rollback()
continue continue
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[
self.truck_index_to_uuid_dict[i] truck_id
] ]
if item.dump_id in DeviceMap.dump_uuid_to_unload_area_uuid_dict: if item.dump_id in DeviceMap.dump_uuid_to_unload_area_uuid_dict:
start_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id] start_area_id = self.dump_uuid_to_unload_area_uuid_dict[item.dump_id]
start_area_index = unload_area_uuid_to_index_dict[start_area_id] start_area_index = unload_area_uuid_to_index_dict[start_area_id]
...@@ -347,6 +362,13 @@ class TruckInfo(WalkManage): ...@@ -347,6 +362,13 @@ class TruckInfo(WalkManage):
self.truck_current_trip[i] = [start_eq_index, end_eq_index] self.truck_current_trip[i] = [start_eq_index, end_eq_index]
self.logger.info("walk_time_to_unload_area")
self.logger.info(walk_time_to_unload_area)
self.logger.info("end_area_index")
self.logger.info(end_area_index)
self.logger.info("start_area_index")
self.logger.info(start_area_index)
self.cur_truck_reach_dump[i] = ( self.cur_truck_reach_dump[i] = (
last_load_time last_load_time
+ walk_time_to_unload_area[end_area_index][start_area_index] + walk_time_to_unload_area[end_area_index][start_area_index]
...@@ -364,9 +386,9 @@ class TruckInfo(WalkManage): ...@@ -364,9 +386,9 @@ class TruckInfo(WalkManage):
# end_eqp_index = excavator.excavator_uuid_to_index_dict[item.exactor_id] # end_eqp_index = excavator.excavator_uuid_to_index_dict[item.exactor_id]
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1 # self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
pass pass
except Exception as es: # except Exception as es:
self.logger.error("矿卡行程读取异常") # self.logger.error("矿卡行程读取异常")
self.logger.error(es) # self.logger.error(es)
# print("self.dump_hold_truck_num") # print("self.dump_hold_truck_num")
# print(self.dump_hold_truck_num) # print(self.dump_hold_truck_num)
...@@ -375,8 +397,8 @@ class TruckInfo(WalkManage): ...@@ -375,8 +397,8 @@ class TruckInfo(WalkManage):
# print(self.excavator_hold_truck_num) # print(self.excavator_hold_truck_num)
self.truck_current_trip.flatten() self.truck_current_trip.flatten()
print("当前矿卡行程:") self.logger.info("当前矿卡行程:")
print(self.truck_current_trip) self.logger.info(self.truck_current_trip)
def update_eqp_hold_truck(self): def update_eqp_hold_truck(self):
...@@ -384,12 +406,20 @@ class TruckInfo(WalkManage): ...@@ -384,12 +406,20 @@ class TruckInfo(WalkManage):
try: try:
session_mysql.commit() session_mysql.commit()
truck_id = self.truck_index_to_uuid_dict[i] truck_id = self.truck_index_to_uuid_dict[i]
aa = self.truck_index_to_uuid_dict
bb = self.truck_current_task
task = self.truck_current_task[self.truck_index_to_uuid_dict[i]] task = self.truck_current_task[self.truck_index_to_uuid_dict[i]]
# item = (
# session_mysql.query(EquipmentPair)
# .filter_by(truck_id=truck_id, isdeleted=0)
# .first()
# )
item = ( item = (
session_mysql.query(EquipmentPair) session_mysql.query(DispatchSetting)
.filter_by(truck_id=truck_id, isdeleted=0) .filter_by(truck_id=truck_id, isdeleted=0)
.first() .first()
) )
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:
...@@ -571,7 +601,6 @@ class TruckInfo(WalkManage): ...@@ -571,7 +601,6 @@ class TruckInfo(WalkManage):
def update_truck_material(self): def update_truck_material(self):
try: try:
self.truck_material_bind = {} self.truck_material_bind = {}
self.update_truck_excavator_bind() self.update_truck_excavator_bind()
self.update_truck_dump_area_bind() self.update_truck_dump_area_bind()
...@@ -580,11 +609,10 @@ class TruckInfo(WalkManage): ...@@ -580,11 +609,10 @@ class TruckInfo(WalkManage):
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, get_value("dynamic_dump_num")), 0) self.dump_material_bind_modify = np.full((self.dynamic_truck_num, get_value("dynamic_dump_num")), 0)
for truck_id in self.dynamic_truck_set: for truck_id in self.dynamic_truck_set:
if truck_id in self.truck_dump_bind: if truck_id in self.truck_dump_bind:
unload_area_id = self.truck_dump_bind[truck_id] unload_area_id = self.truck_dump_bind[truck_id]
try: try:
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Materials
except Exception as es: except Exception as es:
session_postgre.rollback() session_postgre.rollback()
session_mysql.rollback() session_mysql.rollback()
...@@ -674,6 +702,22 @@ class TruckInfo(WalkManage): ...@@ -674,6 +702,22 @@ class TruckInfo(WalkManage):
self.dynamic_truck_num = get_value("dynamic_truck_num") self.dynamic_truck_num = get_value("dynamic_truck_num")
# 更新矿卡集合 # 更新矿卡集合
self.dynamic_truck_set = get_value("dynamic_truck_set") self.dynamic_truck_set = get_value("dynamic_truck_set")
# 矿卡抵达卸载设备时间
self.cur_truck_reach_dump = np.zeros(self.dynamic_truck_num)
# 矿卡抵达挖机时间
self.cur_truck_reach_excavator = np.zeros(self.dynamic_truck_num)
# 矿卡最后装载/卸载时间
self.last_load_time = {}
self.last_unload_time = {}
# 相对矿卡最后装载/卸载时间
self.relative_last_load_time = {}
self.relative_last_unload_time = {}
# 矿卡当前任务
self.truck_current_task = {}
# 矿卡当前行程(第一列为出发地序号, 第二列为目的地序号)
self.truck_current_trip = np.full((self.dynamic_truck_num, 2), -1)
# 矿卡不可用列表
self.truck_disable_list = []
# 矿卡挖机绑定关系 # 矿卡挖机绑定关系
self.truck_excavator_bind = {} self.truck_excavator_bind = {}
# 矿卡卸点绑定关系 # 矿卡卸点绑定关系
......
aaaaaa
...@@ -357,22 +357,19 @@ class WalkManage(DeviceMap): ...@@ -357,22 +357,19 @@ class WalkManage(DeviceMap):
# 计算设备路网距离及行走时间 # 计算设备路网距离及行走时间
try: try:
n = dynamic_dump_num
m = dynamic_excavator_num
for i in range(dynamic_dump_num): for i in range(dynamic_dump_num):
for j in range(dynamic_excavator_num): for j in range(dynamic_excavator_num):
cls.distance_to_excavator[i][j] = cls.distance_to_load_area[ cls.distance_to_excavator[i][j] = cls.distance_to_load_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]] cls.walk_time_to_excavator[i][j] = cls.walk_time_to_load_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_excavator[i][j] = cls.walk_time_to_load_area[
cls.dump_index_to_unload_area_index_dict[i] cls.distance_to_dump[i][j] = cls.distance_to_unload_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.distance_to_dump[i][j] = cls.distance_to_unload_area[ cls.walk_time_to_dump[i][j] = cls.walk_time_to_unload_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_dump[i][j] = cls.walk_time_to_unload_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
except Exception as es: except Exception as es:
logger.error("设备路网信息异常异常") logger.error("设备路网信息异常")
logger.error(es) logger.error(es)
try: try:
...@@ -421,7 +418,6 @@ def get_global_para_from_cache(cache): ...@@ -421,7 +418,6 @@ def get_global_para_from_cache(cache):
global_dict = cache.get("global_dict") global_dict = cache.get("global_dict")
if global_dict is None: if global_dict is None:
print("here2")
global_period_para_update() global_period_para_update()
cache.set("global_dict", global_dict, timeout=5 * 60) cache.set("global_dict", global_dict, timeout=5 * 60)
...@@ -520,6 +516,16 @@ def global_period_para_update(): ...@@ -520,6 +516,16 @@ def global_period_para_update():
global_dict["distance_park_to_excavator"] = WalkManage.distance_park_to_excavator global_dict["distance_park_to_excavator"] = WalkManage.distance_park_to_excavator
global_dict["distance_to_dump"] = WalkManage.distance_to_dump global_dict["distance_to_dump"] = WalkManage.distance_to_dump
global_dict["dump_uuid_to_index_dict"] = WalkManage.dump_uuid_to_index_dict
global_dict["dump_index_to_uuid_dict"] = WalkManage.dump_index_to_uuid_dict
global_dict["excavator_uuid_to_index_dict"] = WalkManage.excavator_uuid_to_index_dict
global_dict["excavator_index_to_uuid_dict"] = WalkManage.excavator_index_to_uuid_dict
global_dict["dump_uuid_to_unload_area_uuid_dict"] = WalkManage.dump_uuid_to_unload_area_uuid_dict
global_dict["excavator_uuid_to_load_area_uuid_dict"] = WalkManage.excavator_uuid_to_load_area_uuid_dict
# logger.info("walk_manage_para") # logger.info("walk_manage_para")
# logger.info("distance_to_excavator") # logger.info("distance_to_excavator")
# logger.info(walk_manage.distance_to_excavator) # logger.info(walk_manage.distance_to_excavator)
......
...@@ -112,7 +112,7 @@ class PriorityController: ...@@ -112,7 +112,7 @@ class PriorityController:
for dump_id in get_value("dynamic_dump_set"): for dump_id in get_value("dynamic_dump_set"):
for excavator_id in get_value("dynamic_excavator_set"): for excavator_id in get_value("dynamic_excavator_set"):
try: try:
item = session_mysql.query(Dispatch).filter_by(dump_id=dump_id, exactor_id=excavator_id, isauto=1, item = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, exactor_id=excavator_id, isauto=1,
isdeleted=0).first() isdeleted=0).first()
except Exception as es: except Exception as es:
session_postgre.rollback() session_postgre.rollback()
......
...@@ -14,7 +14,49 @@ from equipment.excavator import ExcavatorInfo ...@@ -14,7 +14,49 @@ from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
import sched import sched
import time import time
from dispatcher import Dispatcher, PreSchedule from core.dispatcher import Dispatcher
from core.schedule import PreSchedule
from data.dispatchInfo import DispatchInfo
def direct2redis():
"""
直接读取数据库写入redis
:return: None
"""
# 清空数据库缓存
session_mysql.commit()
session_mysql.flush()
# 清空数据库缓存
session_postgre.commit()
session_postgre.flush()
try:
truck_disp = {}
for item in session_mysql.query(DispatchSetting).all():
if item.truck_id not in truck_disp:
record = {"truckId": item.truck_id}
record["id"] = item.id
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["groupId"] = item.group_id
record["isdeleted"] = False
record["isTemp"] = False
record["haulFlag"] = -1
record["groupName"] = item.group_id
logger.info("调度结果")
logger.info(record)
redis5.set(item.truck_id, str(json.dumps(record)))
except Exception as es:
logger.error(es)
session_postgre.rollback()
session_mysql.rollback()
def process(dispatcher): def process(dispatcher):
...@@ -24,18 +66,21 @@ def process(dispatcher): ...@@ -24,18 +66,21 @@ def process(dispatcher):
:return: None :return: None
""" """
# # 直接读取数据库写入redis
# direct2redis()
try: try:
# 更新周期参数 # 更新周期参数
logger.info("#####################################周期更新开始#####################################") logger.info("#####################################周期更新开始#####################################")
global_period_para_update() global_period_para_update()
if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0: # if get_value("dynamic_dump_num") * get_value("dynamic_excavator_num") == 0:
raise Exception("无动态派车计划可用") # raise Exception("无动态派车计划可用")
return # return
if get_value("dynamic_truck_num") == 0: # if get_value("dynamic_truck_num") == 0:
raise Exception("无动态派车可用矿卡") # raise Exception("无动态派车可用矿卡")
return # return
# 清空数据库缓存 # 清空数据库缓存
session_mysql.commit() session_mysql.commit()
...@@ -45,18 +90,80 @@ def process(dispatcher): ...@@ -45,18 +90,80 @@ def process(dispatcher):
session_postgre.commit() session_postgre.commit()
session_postgre.flush() session_postgre.flush()
# 周期更新 global_period_para_update()
dispatcher.dispatcher_period_update()
# 调度计算
dispatcher.schedule_construct()
# 更新调度信息
DispatchInfo.reset()
DispatchInfo.update_device_group_structure()
DispatchInfo.update_route_distance()
DispatchInfo.update_group_mode()
DispatchInfo.update_group_name()
# logger.info
# group_set = set()
#
# # device group structure
# load_excavator_dict = {} # 装载区id-->>电铲编号的映射
# excavator_load_dict = {} # 电铲编号->>装载区id的映射
#
# group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
# excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值
#
# group_dump_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
# dump_group_dict = {} # unload_area_id -> team_id
#
# group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_id],...}
# truck_group_dict = {} # truck_id -> team_id
#
# # group feature
# group_mode = {} # 数据格式: {team_id:mode_code}
#
# # route_distance(路网距离)
# load_distance = {}
# unload_distance = {}
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)
# logger.info("load_excavator_dict")
# logger.info(DispatchInfo.load_excavator_dict)
# logger.info("excavator_load_dict")
# logger.info(DispatchInfo.excavator_load_dict)
# logger.info(DispatchInfo.excavator_group_dict)
# logger.info(DispatchInfo.dump_group_dict)
# logger.info(DispatchInfo.truck_group_dict)
# 调度生成
dispatcher.period_update()
dispatcher.group_generate()
dispatcher.group_info_update()
dispatcher.group_dispatch()
logger.info("#####################################周期更新结束#####################################") logger.info("#####################################周期更新结束#####################################")
except Exception as es: except Exception as es:
logger.error("最外层异常捕获") logger.error("最外层异常捕获")
logger.error(es) logger.error(es)
direct2redis()
def perform(inc, dispatcher): def perform(inc, dispatcher):
...@@ -103,7 +210,7 @@ if __name__ == "__main__": ...@@ -103,7 +210,7 @@ if __name__ == "__main__":
pre_sch = PreSchedule(truck, excavator, dump) pre_sch = PreSchedule(truck, excavator, dump)
# 实例化矿卡调度器 # 实例化矿卡调度器
dispatcher = Dispatcher(dump, excavator, truck, pre_sch, False) dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False)
logger.info(" ") logger.info(" ")
logger.info("调度系统启动") logger.info("调度系统启动")
......
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/7/21 16:45
# @Author : Opfer
# @Site :
# @File : realtime_dispatch.py
# @Software: PyCharm
# 实时调度模块
from para_config import *
from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo
import sched
import time
from core.dispatcher import Dispatcher
from core.schedule import PreSchedule
from data.dispatchInfo import DispatchInfo
def direct2redis():
"""
直接读取数据库写入redis
:return: None
"""
# 清空数据库缓存
session_mysql.commit()
session_mysql.flush()
# 清空数据库缓存
session_postgre.commit()
session_postgre.flush()
truck_disp = {}
for item in session_mysql.query(DispatchSetting).all():
if item.truck_id not in truck_disp:
record = {"truckId": item.truck_id}
record["id"] = item.id
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["groupId"] = item.group_id
record["isdeleted"] = False
record["isTemp"] = False
record["haulFlag"] = -1
record["groupName"] = item.group_id
logger.info("调度结果")
logger.info(record)
redis5.set(item.truck_id, str(json.dumps(record)))
def process(dispatcher):
"""
周期调度进程
:param dispatcher: (Dispatch Class) 矿卡调度类对象
:return: None
"""
# try:
# 更新周期参数
logger.info("#####################################周期更新开始#####################################")
global_period_para_update()
# 清空数据库缓存
session_mysql.commit()
session_mysql.flush()
# 清空数据库缓存
session_postgre.commit()
session_postgre.flush()
global_period_para_update()
# 更新调度信息
DispatchInfo.reset()
DispatchInfo.update_device_group_structure()
DispatchInfo.update_route_distance()
DispatchInfo.update_group_mode()
DispatchInfo.update_group_name()
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)
# logger.info("load_excavator_dict")
# logger.info(DispatchInfo.load_excavator_dict)
# logger.info("excavator_load_dict")
# logger.info(DispatchInfo.excavator_load_dict)
# logger.info(DispatchInfo.excavator_group_dict)
# logger.info(DispatchInfo.dump_group_dict)
# logger.info(DispatchInfo.truck_group_dict)
# 调度生成
dispatcher.period_update()
dispatcher.group_generate()
dispatcher.group_info_update()
dispatcher.group_dispatch()
logger.info("#####################################周期更新结束#####################################")
# except Exception as es:
# logger.error("最外层异常捕获")
# logger.error(es)
def perform(inc, dispatcher):
"""
控制程序循环执行
:param inc: (int) 循环周期, 单位, 秒
:param dispatcher: (Dispatch Class) 矿卡调度类对象
:return: None
"""
scheduler.enter(inc, 0, perform, (inc, dispatcher))
process(dispatcher)
def main(inc, dispatcher):
"""
程序循环入口函数
:param inc: (int) 循环周期, 单位, 秒
:param dispatcher: (Dispatch Class) 矿卡调度类对象
:return: None
"""
scheduler.enter(0, 0, perform, (inc, dispatcher))
scheduler.run()
if __name__ == "__main__":
# 初始化日志
set_log()
# 获取日志器
logger = get_logger("zxt.main")
# 全局参数更新
global_period_para_update()
# 实例化设备对象
dump = DumpInfo()
excavator = ExcavatorInfo()
truck = TruckInfo(dump, excavator)
# 实例化程序调度器
scheduler = sched.scheduler(time.time, time.sleep)
# 实例化调度预测器
pre_sch = PreSchedule(truck, excavator, dump)
# 实例化矿卡调度器
dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False)
logger.info(" ")
logger.info("调度系统启动")
main(30, dispatcher)
...@@ -67,7 +67,7 @@ def set_log(): ...@@ -67,7 +67,7 @@ def set_log():
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60) # timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=3*1024*1024, backupCount=10, encoding="utf-8") filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=30*1024*1024, backupCount=10, encoding="utf-8")
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10, encoding="utf-8") # filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10, encoding="utf-8")
# 设置后缀名称,跟strftime的格式一样 # 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log" filehandler.suffix = "%Y-%m-%d_%H-%M.log"
...@@ -94,59 +94,6 @@ pool2 = ConnectionPool(host=redis_config["host"], db=2, port=6379, password=redi ...@@ -94,59 +94,6 @@ pool2 = ConnectionPool(host=redis_config["host"], db=2, port=6379, password=redi
redis2 = StrictRedis(connection_pool=pool2) redis2 = StrictRedis(connection_pool=pool2)
# 数据库连接设置
########################################################################################################################
# 创建对象的基类:
Base = declarative_base()
sql_str = str("mysql+mysqlconnector://" + mysql_config["user"] + ":%s@" + mysql_config["host"] + \
":" + mysql_config["port"] + "/" + mysql_config["database"])
postgre_str = str("postgresql://" + postgre_config["user"] + ":%s@" + postgre_config["host"] + \
":" + postgre_config["port"] + "/" + postgre_config["database"])
try:
engine_mysql = create_engine(
# "mysql+mysqlconnector://root:%s@192.168.28.111:3306/waytous"
# % quote("Huituo@123")
# "mysql+mysqlconnector://" + mysql_config["user"] + ":" + mysql_config["password"] + "@" + mysql_config[
# "host"] + ":" + mysql_config["port"] + "/" + mysql_config["database"]
sql_str % quote(mysql_config["password"])
)
engine_postgre = create_engine(
# "postgresql://postgres:%s@192.168.28.111:5432/shenbao_2021520"
# % quote("Huituo@123")
# "postgresql://" + postgre_config["user"] + ":" + postgre_config["password"] + "@" + postgre_config[
# "host"] + ":" + postgre_config["port"] + "/" + postgre_config["database"]
postgre_str % quote(postgre_config["password"])
)
# 创建DBsession_mysql类型:
DBsession_mysql = sessionmaker(bind=engine_mysql)
DBsession_mysql = scoped_session(DBsession_mysql)
DBsession_postgre = sessionmaker(bind=engine_postgre)
DBsession_postgre = scoped_session(DBsession_postgre)
# 创建session_mysql对象:
session_mysql = DBsession_mysql()
session_mysql.expire_on_commit = False
session_postgre = DBsession_postgre()
session_postgre.expire_on_commit = False
except Exception as es:
logger.error("数据库连接失败")
logger.error(es)
def str_to_byte(item): def str_to_byte(item):
return bytes(item, encoding='utf8') return bytes(item, encoding='utf8')
......
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