Commit 7fca8604 authored by 张晓彤's avatar 张晓彤

reconstruct 01/06

parent ab8f868e
This diff is collapsed.
This diff is collapsed.
......@@ -36,6 +36,9 @@ class DumpInfo(WalkManage):
self.period_map_para_load()
self.period_walk_para_load()
# 日志器
self.logger = get_logger("zxt.dump")
# 参数初始化
self.para_period_update()
......@@ -83,8 +86,8 @@ class DumpInfo(WalkManage):
# ave_unload_time / unload_count
# )
# except Exception as es:
# logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
# self.logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es)
self.unloading_time[self.dump_uuid_to_index_dict[dump_id]] = 5.00
# print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]])
......@@ -110,8 +113,8 @@ class DumpInfo(WalkManage):
# query.exit_entrance_time / query.exit_entrance_count
# )
# except Exception as es:
# logger.error(f"卸载设备 {dump_id} 出入场时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
# self.logger.error(f"卸载设备 {dump_id} 出入场时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es)
self.entrance_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50
self.exit_time[self.dump_uuid_to_index_dict[dump_id]] = 0.50
......@@ -123,8 +126,8 @@ class DumpInfo(WalkManage):
dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
self.dump_material[dump_id] = dump_material_id
except Exception as es:
logger.error("无动态派车计划可用")
logger.error(es)
self.logger.error("无动态派车计划可用")
self.logger.error(es)
def update_dump_priority(self):
self.dump_priority_coefficient = np.ones(self.dynamic_dump_num)
......@@ -135,14 +138,14 @@ class DumpInfo(WalkManage):
item = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first()
self.dump_priority_coefficient[self.dump_uuid_to_index_dict[dump_id]] += item.Priority
except Exception as es:
logger.error("无动态派车计划可用")
logger.error(es)
self.logger.error("无动态派车计划可用")
self.logger.error(es)
def update_unload_ability(self):
try:
rule3 = session_mysql.query(DispatchRule).filter_by(id=3).first()
if not rule3.disabled:
for dump_index in range(dynamic_dump_num):
for dump_index in range(self.dynamic_dump_num):
unload_area_id = unload_area_index_to_uuid_dict[self.dump_index_to_unload_area_index_dict[dump_index]]
unload_ability = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().UnloadAbililty
......@@ -154,8 +157,8 @@ class DumpInfo(WalkManage):
self.dump_strength = np.full(self.dynamic_dump_num, 5000)
except Exception as es:
logger.error(es)
logger.error("卸载点卸载信息读取异常")
self.logger.error(es)
self.logger.error("卸载点卸载信息读取异常")
def reset(self):
# 卸载设备数量
......@@ -181,7 +184,7 @@ class DumpInfo(WalkManage):
# print("Dump update!")
logger.info("Dump update!")
self.logger.info("Dump update!")
# 装载周期参数
self.period_map_para_load()
......
......@@ -40,6 +40,9 @@ class ExcavatorInfo(WalkManage):
self.period_map_para_load()
self.period_walk_para_load()
# 日志器
self.logger = get_logger("zxt.excavator")
# 参数初始化
self.para_period_update()
......@@ -77,12 +80,12 @@ class ExcavatorInfo(WalkManage):
# ave_load_time / load_count
# )
# except Exception as es:
# logger.error(f"挖机 {excavator_id} 装载时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
logger.info("loading_time")
logger.info(self.loading_time)
logger.info("excavator_uuid_to_index_dict")
logger.info(self.excavator_uuid_to_index_dict)
# self.logger.error(f"挖机 {excavator_id} 装载时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es)
self.logger.info("loading_time")
self.logger.info(self.loading_time)
self.logger.info("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]] = 5.00
# 更新挖机设备出入时间
......@@ -108,8 +111,8 @@ class ExcavatorInfo(WalkManage):
# self.excavator_uuid_to_index_dict[excavator_id]
# ] = float(query.exit_entrance_time / query.exit_entrance_count)
# except Exception as es:
# logger.error(f"挖机设备 {excavator_id} 出入场时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
# self.logger.error(f"挖机设备 {excavator_id} 出入场时间信息缺失, 已设为默认值(1min)")
# self.logger.error(es)
self.entrance_time[
self.excavator_uuid_to_index_dict[excavator_id]
] = 0.50
......@@ -128,25 +131,25 @@ class ExcavatorInfo(WalkManage):
return loading_task_time
def update_excavator_material(self):
logger.info("self.dynamic_excavator_set")
logger.info(self.dynamic_excavator_set)
self.logger.info("self.dynamic_excavator_set")
self.logger.info(self.dynamic_excavator_set)
for excavator_id in self.dynamic_excavator_set:
try:
load_area_id = session_mysql.query(Dispatch).filter_by(exactor_id=excavator_id, isdeleted=0, isauto=1).first().load_area_id
excavator_material_id = session_postgre.query(DiggingWorkArea).filter_by(Id=load_area_id).first().Material
self.excavator_material[excavator_id] = excavator_material_id
except Exception as es:
logger.warning(es)
self.logger.warning(es)
def update_excavator_priority(self):
logger.info("dynamic_excavator_set")
logger.info(self.dynamic_excavator_set)
self.logger.info("dynamic_excavator_set")
self.logger.info(self.dynamic_excavator_set)
for excavator_id in get_value("dynamic_excavator_set"):
item = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
logger.info("excavator_priority_coefficient")
logger.info(self.excavator_priority_coefficient)
self.logger.info("excavator_priority_coefficient")
self.logger.info(self.excavator_priority_coefficient)
self.excavator_priority_coefficient[self.excavator_uuid_to_index_dict[excavator_id]] = item.priority + 1
# 物料优先级控制
......@@ -180,8 +183,8 @@ class ExcavatorInfo(WalkManage):
self.excavator_strength = np.full(self.dynamic_excavator_num, 5000)
except Exception as es:
logger.error(es)
logger.error("挖机装载信息信息读取异常")
self.logger.error(es)
self.logger.error("挖机装载信息信息读取异常")
def reset(self):
......@@ -208,12 +211,12 @@ class ExcavatorInfo(WalkManage):
self.reset()
logger.info("Excavator update!")
self.logger.info("Excavator update!")
rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first().disabled
logger.info("物料优先级规则")
logger.info(rule7)
self.logger.info("物料优先级规则")
self.logger.info(rule7)
# 装载周期参数
self.period_map_para_load()
......
This diff is collapsed.
This diff is collapsed.
......@@ -7,6 +7,7 @@
# @Software: PyCharm
from equipment.truck import TruckInfo, DumpInfo, ExcavatorInfo
# from path_plan.priority_control import PriorityController
from path_plan.priority_control import PriorityController
from para_config import *
from tables import *
......@@ -27,7 +28,6 @@ class PathPlanner(WalkManage):
# 控制类
self.controller = PriorityController(self.dump, self.excavator, self.truck)
# 路线行驶成本
self.rout_cost = np.array((unload_area_num, load_area_num))
# 路段集合
......@@ -123,7 +123,7 @@ class PathPlanner(WalkManage):
# print("拥堵因子-卸点")
# print(alpha, cost_to_unload_blockage)
except Exception as es:
logger.error(f'道路{load_area_id + "-" +unload_area_id}行驶成本计算异常')
logger.error(f'道路{load_area_id + "-" + unload_area_id}行驶成本计算异常')
logger.error(es)
return to_load_cost, to_unload_cost
......@@ -165,7 +165,7 @@ class PathPlanner(WalkManage):
self.period_map_para_load()
self.controller.period_update(self.dump, self.excavator, self.truck)
# self.controller.period_update(self.dump, self.excavator, self.truck)
# 计算行驶成本前,更新路网速度信息
self.lane.lane_speed_generate()
......@@ -191,8 +191,6 @@ class PathPlanner(WalkManage):
logger.error(es)
self.cost_to_excavator = np.zeros_like(get_value("distance_to_excavator"))
print("distance_to_excavator")
print(self.cost_to_excavator)
self.cost_to_dump = np.zeros_like(get_value("distance_to_dump"))
self.cost_park_to_excavator = np.zeros_like(get_value("distance_park_to_excavator"))
......@@ -201,15 +199,17 @@ class PathPlanner(WalkManage):
# try:
# 路网权重
walk_weight, park_walk_weight = self.controller.weighted_walk_cost()
walk_to_excavator_weight, walk_to_dump_weight, park_walk_weight = self.controller.weighted_walk_calc()
# 路网禁用关系
walk_available = self.controller.available_walk()
walk_available = self.controller.walk_available_calc()
group_walk_available = self.controller.update_group_walk_available()
# group_walk_available = self.controller.update_group_walk_available()
logger.info("path_weight")
logger.info(walk_weight)
logger.info(walk_to_excavator_weight)
logger.info(walk_to_dump_weight)
logger.info(park_walk_weight)
logger.info("walk_avail")
logger.info(walk_available)
......@@ -223,8 +223,12 @@ class PathPlanner(WalkManage):
unload_area_index = self.dump_index_to_unload_area_index_dict[i]
logger.info("cost_to_excavator")
logger.info(self.cost_to_excavator)
self.cost_to_excavator[i][j] = self.cost_to_load_area[unload_area_index][load_area_index] / walk_weight[i][j] + group_walk_available[i][j]
self.cost_to_dump[i][j] = self.cost_to_unload_area[unload_area_index][load_area_index] / walk_weight[i][j] + walk_available[i][j] + group_walk_available[i][j]
# self.cost_to_excavator[i][j] = self.cost_to_load_area[unload_area_index][load_area_index] / walk_weight[i][j] + group_walk_available[i][j]
self.cost_to_excavator[i][j] = self.cost_to_load_area[unload_area_index][load_area_index] / \
walk_to_excavator_weight[i][j] + walk_available[i][j]
# self.cost_to_dump[i][j] = self.cost_to_unload_area[unload_area_index][load_area_index] / walk_weight[i][j] + walk_available[i][j] + group_walk_available[i][j]
self.cost_to_dump[i][j] = self.cost_to_unload_area[unload_area_index][load_area_index] / \
walk_to_dump_weight[j][i] + walk_available[i][j]
for j in range(get_value("dynamic_excavator_num")):
load_area_index = self.excavator_index_to_load_area_index_dict[j]
......@@ -289,7 +293,10 @@ class LaneInfo:
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)) and (str_to_byte('laneId') in key_set):
if (device_type == str_to_byte("1")) \
and (str_to_byte('online') in key_set) \
and (bytes.decode(is_online) in ["true" or "True"]) \
and (str_to_byte('laneId') in key_set):
truck_locate = key_value_dict[str_to_byte('laneId')]
truck_locate_dict[truck_name_to_uuid_dict[item]] = eval(truck_locate)
except Exception as es:
......@@ -355,7 +362,7 @@ class LaneInfo:
logger.info(lane_id)
if lane_id in lane_set:
self.lane_speed_dict[truck_locate_dict[truck]] = self.lane_speed_dict[truck_locate_dict[truck]] + \
truck_speed_dict[truck]
truck_speed_dict[truck]
# 该路段矿卡数量加一
lane_trucks_dict[truck_locate_dict[truck]] = lane_trucks_dict[truck_locate_dict[truck]] + 1
# 记录存在行驶矿卡的路段
......@@ -370,7 +377,8 @@ class LaneInfo:
# 对不存在的矿卡路段,实时速度设置为最高
for lane_id in lane_set:
if lane_id not in tmp_lane_set:
self.lane_speed_dict[str(lane_id)] = session_postgre.query(Lane).filter_by(Id=lane_id).first().MaxSpeed
self.lane_speed_dict[str(lane_id)] = session_postgre.query(Lane).filter_by(
Id=lane_id).first().MaxSpeed
lane_trucks_dict[str(lane_id)] = 1
# 各路段实时速度取平均
......
......@@ -20,18 +20,23 @@ class PriorityController():
self.excavator = excavator
self.truck = truck
def period_update(self, dump, excavator, truck):
# 设备类
self.dump = dump
self.excavator = excavator
self.truck = truck
def weighted_walk_cost(self):
# 获取日志器
self.logger = get_logger("zxt.prio")
def weighted_walk_calc(self):
"""
计算运输路线权重, 权重影响因素:设备优先级, 物料优先级,
:return:
walk_weight: 卸载-装载区 路网权重
park_walk_weight: 备停区-装载区 路网权重
"""
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_weight = np.ones((dynamic_dump_num, dynamic_excavator_num))
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
......@@ -45,8 +50,8 @@ class PriorityController():
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_weight[dump_index][excavator_inedx] += dump_priority[dump_index] * \
excavator_priority[excavator_inedx]
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
rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
......@@ -56,29 +61,67 @@ class PriorityController():
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_weight[dump_index][excavator_inedx] += dump_material_priority[dump_index] * \
excavator_material_priority[excavator_inedx]
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_weight = walk_weight - (walk_weight.min() - 1)
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:
logger.errro(es)
logger.error("数值异常")
self.logger.errro(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()
return walk_weight, park_walk_weight
walk_available = map_walk_available * group_walk_available * material_walk_available
def available_walk(self):
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"):
item = session_mysql.query(Dispatch).filter_by(dump_id=dump_id, exactor_id=excavator_id, isauto=1,
isdeleted=0).first()
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_weight = np.zeros((dynamic_dump_num, dynamic_excavator_num))
print("here")
print(dynamic_dump_set)
walk_available = np.ones((dynamic_dump_num, dynamic_excavator_num))
try:
......@@ -86,24 +129,30 @@ class PriorityController():
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_weight[dump_index][excavator_inedx] += 1000000
walk_available[dump_index][excavator_inedx] = 0
except Exception as es:
logger.info(es)
logger.info("error-12")
self.logger.info(es)
self.logger.info("error-12")
return walk_weight
return walk_available
def update_group_walk_available(self):
group_walk_available = np.full((get_value("dynamic_dump_num"), get_value("dynamic_excavator_num")), 1000000)
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_id in get_value("dynamic_dump_set"):
for excavator_id in get_value("dynamic_excavator_set"):
item = session_mysql.query(Dispatch).filter_by(dump_id=dump_id, exactor_id=excavator_id, isauto=1,
isdeleted=0).first()
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] = 0
walk_manage.period_walk_para_update()
return group_walk_available
for dump_index in range(dynamic_dump_num):
for excavator_index in range(dynamic_excavator_num):
if walk_manage.distance_to_excavator[dump_index][excavator_index] > M / 2:
walk_available[dump_index][excavator_index] = 0
return walk_available
This diff is collapsed.
......@@ -48,32 +48,38 @@ dump_target_mass = para_config["dump_target_mass"]
excavator_target_mass = para_config["excavator_target_mass"]
# 创建日志
########################################################################################################################
# 日志存储地址
log_path = para_config["log_path"]
def set_log():
# 创建日志
########################################################################################################################
# 日志存储地址
log_path = para_config["log_path"]
# 创建日志目录
# 创建日志目录
if not os.path.exists(log_path):
os.mkdir(log_path)
# logging初始化工作
logging.basicConfig()
if not os.path.exists(log_path):
os.mkdir(log_path)
# logging初始化工作
logging.basicConfig()
logger = logging.getLogger("zxt")
logger.setLevel(logging.INFO)
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# 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)
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log"
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
formatter = logging.Formatter("%(asctime)s - %(name)s: %(levelname)s %(filename)s %(message)s")
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=3*1024*1024, backupCount=10)
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log"
formatter = logging.Formatter("%(asctime)s - %(name)s: %(levelname)s %(filename)s %(message)s")
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
def get_logger(module_name):
logger = logging.getLogger(module_name)
return logger
# 连接reids
......
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