Commit d950f451 authored by Allvey's avatar Allvey

修复矿卡禁止BUG

parent bf5cad37
......@@ -9,6 +9,7 @@
from para_config import *
from settings import *
# 卸载设备类
class DumpInfo(WalkManage):
def __init__(self):
......@@ -96,7 +97,7 @@ class DumpInfo(WalkManage):
for query in (
session_mysql.query(WorkRecord)
.filter(
WorkRecord.equipment_id == dump_id, WorkRecord.work_day > now
WorkRecord.equipment_id == dump_id, WorkRecord.work_day >= now
)
.first()
):
......@@ -115,17 +116,23 @@ class DumpInfo(WalkManage):
def update_dump_material(self):
self.dump_material = {}
for dump_id in dynamic_dump_set:
unload_area_id = session_mysql.query(Dispatch).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
self.dump_material[dump_id] = dump_material_id
try:
unload_area_id = session_mysql.query(Dispatch).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
self.dump_material[dump_id] = dump_material_id
except Exception as es:
logger.error("无动态派车计划可用")
def update_dump_priority(self):
self.dump_priority_coefficient = np.ones(self.dynamic_dump_num)
for dump_id in dynamic_dump_set:
unload_area_index = self.dump_index_to_unload_area_index_dict[self.dump_uuid_to_index_dict[dump_id]]
unload_area_id = unload_area_index_to_uuid_dict[unload_area_index]
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
try:
unload_area_index = self.dump_index_to_unload_area_index_dict[self.dump_uuid_to_index_dict[dump_id]]
unload_area_id = unload_area_index_to_uuid_dict[unload_area_index]
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("无动态派车计划可用")
def para_period_update(self):
......
......@@ -9,6 +9,7 @@
from para_config import *
from settings import *
# 挖机设备类
class ExcavatorInfo(WalkManage):
def __init__(self):
......@@ -90,7 +91,7 @@ class ExcavatorInfo(WalkManage):
session_mysql.query(WorkRecord)
.filter(
WorkRecord.equipment_id == excavator_id,
WorkRecord.work_day > now,
WorkRecord.work_day >= now,
)
.first()
):
......
......@@ -7,10 +7,13 @@
# @Software: PyCharm
from para_config import *
from settings import *
from equipment.dump import DumpInfo
from equipment.excavator import ExcavatorInfo
# 引入对象
dump = DumpInfo()
excavator = ExcavatorInfo()
# 矿卡设备类
class TruckInfo(WalkManage):
......@@ -18,13 +21,13 @@ class TruckInfo(WalkManage):
# object fileds
# self.walker = WalkManage()
# 矿卡数量
self.dynamic_truck_num = len(dynamic_truck_set)
self.dynamic_truck_num = get_value("dynamic_truck_num")
# 用于动态派车的矿卡集合
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.dynamic_truck_set = []
# 矿卡最后装载/卸载时间
self.last_load_time = {}
self.last_unload_time = {}
......@@ -56,21 +59,18 @@ class TruckInfo(WalkManage):
# 矿卡卸点排斥关系
self.truck_dump_exclude = {}
# 排斥关系modify
self.excavator_exclude_modify = np.full((dynamic_truck_num, dynamic_excavator_num), 0)
self.excavator_exclude_modify = np.full((self.dynamic_truck_num, get_value("dynamic_excavator_num")), 0)
# 矿卡优先级
self.truck_priority = np.ones(self.dynamic_truck_num)
# 矿卡绑定物料
self.truck_material_bind = {}
# 矿卡绑定物料modify
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_excavator_num), 0)
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_dump_num), 0)
self.excavator_material_bind_modify =np.zeros(self.dynamic_truck_num)
# 引入对象
self.dump = DumpInfo()
self.excavator = ExcavatorInfo()
# 初始化读取映射及路网
self.period_map_para_load()
self.period_walk_para_load()
# 初始化读取参数
self.para_period_update()
def get_truck_current_trip(self):
......@@ -363,7 +363,7 @@ class TruckInfo(WalkManage):
self.truck_excavator_exclude = {}
self.excavator_exclude_modify = np.full(
(dynamic_truck_num, dynamic_excavator_num), 0
(self.dynamic_truck_num, dynamic_excavator_num), 0
)
try:
......@@ -393,15 +393,15 @@ class TruckInfo(WalkManage):
def update_truck_material(self):
self.excavator.update_excavator_material()
self.dump.update_dump_material()
excavator.update_excavator_material()
dump.update_dump_material()
self.truck_material_bind = {}
self.update_truck_excavator_bind()
self.update_truck_dump_area_bind()
self.excavator_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_excavator_num), 0)
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_excavator_num), 0)
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_dump_num), 0)
for truck_id in dynamic_truck_set:
......@@ -415,7 +415,7 @@ class TruckInfo(WalkManage):
if truck_id in self.truck_excavator_bind:
excavator_id = self.truck_excavator_bind[truck_id]
# print(self.excavator.excavator_material)
excavator_material_id = self.excavator.excavator_material[excavator_id]
excavator_material_id = excavator.excavator_material[excavator_id]
self.truck_material_bind[truck_id] = excavator_material_id
......@@ -428,14 +428,14 @@ class TruckInfo(WalkManage):
material = self.truck_material_bind[truck_id]
for excavator_id in dynamic_excavator_set:
excavator_material_id = self.excavator.excavator_material[excavator_id]
excavator_index = self.excavator.excavator_uuid_to_index_dict[excavator_id]
excavator_material_id = excavator.excavator_material[excavator_id]
excavator_index = excavator.excavator_uuid_to_index_dict[excavator_id]
if excavator_material_id != material:
self.excavator_material_bind_modify[truck_index][excavator_index] = 1000000
for dump_id in dynamic_dump_set:
dump_material_id = self.dump.dump_material[dump_id]
dump_index = self.dump.dump_uuid_to_index_dict[dump_id]
dump_material_id = dump.dump_material[dump_id]
dump_index = dump.dump_uuid_to_index_dict[dump_id]
if dump_material_id != material:
self.dump_material_bind_modify[truck_index][dump_index] = 1000000
......@@ -460,6 +460,10 @@ class TruckInfo(WalkManage):
filter(Equipment.id == truck_id).first().max_speed
def reset(self):
# 更新矿卡数量
self.dynamic_truck_num = get_value("dynamic_truck_num")
# 更新矿卡集合
self.dynamic_truck_set = get_value("dynamic_truck_set")
# 矿卡挖机绑定关系
self.truck_excavator_bind = {}
# 矿卡卸点绑定关系
......@@ -469,7 +473,7 @@ class TruckInfo(WalkManage):
# 矿卡卸点排斥关系
self.truck_dump_exclude = {}
# 排斥关系modify
self.excavator_exclude_modify = np.full((dynamic_truck_num, dynamic_excavator_num), 0)
self.excavator_exclude_modify = np.full((self.dynamic_truck_num, get_value("dynamic_excavator_num")), 0)
# 矿卡优先级
self.truck_priority = np.ones(self.dynamic_truck_num)
# 矿卡绑定物料
......@@ -496,17 +500,14 @@ class TruckInfo(WalkManage):
self.period_walk_para_load()
# 更新全部矿卡设备集合
truck_set = set(update_total_truck())
# 更新固定派车矿卡集合
fixed_truck_set = set(update_fixdisp_truck())
# 更新动态派车矿卡集合
self.dynamic_truck_set = truck_set.difference(fixed_truck_set)
# 更新矿卡数量
self.dynamic_truck_num = len(self.dynamic_truck_set)
# # 更新全部矿卡设备集合
# truck_set = set(update_total_truck())
#
# # 更新固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 更新动态派车矿卡集合
# self.dynamic_truck_set = truck_set.difference(fixed_truck_set)
# 更新有效载重
self.update_truck_payload()
......
......@@ -37,6 +37,11 @@ excavator_target_mass = 5000
# 任务集合
task_set = [-2, 0, 1, 2, 3, 4, 5]
#
# truck = TruckInfo()
# excavator = ExcavatorInfo()
# dump = DumpInfo()
# Big integer
M = 100000000
......@@ -80,6 +85,18 @@ dynamic_excavator_num = len(dynamic_excavator_set)
dynamic_dump_set = set(update_autodisp_dump())
dynamic_dump_num = len(dynamic_dump_set)
global global_dict
global_dict = {}
global_dict["dynamic_truck_set"] = dynamic_truck_set
global_dict["dynamic_truck_num"] = dynamic_truck_num
global_dict["dynamic_excavator_set"] = dynamic_excavator_set
global_dict["dynamic_excavator_num"] = dynamic_excavator_num
global_dict["dynamic_dump_set"] = dynamic_dump_set
global_dict["dynamic_dump_num"] = dynamic_dump_num
# 设备映射类, 存储除工作区以外的映射关系
# 其余设备类继承该类
class DeviceMap:
......@@ -292,35 +309,35 @@ class WalkManage(DeviceMap):
logger.error("设备路网信息异常异常")
logger.error(es)
# try:
for item in session_postgre.query(WalkTimePark).all():
load_area = str(item.load_area_id)
park_area = str(item.park_area_id)
load_area_index = load_area_uuid_to_index_dict[load_area]
park_index = park_uuid_to_index_dict[park_area]
self.distance_park_to_load_area[park_index][load_area_index] = float(
item.park_load_distance
)
self.walk_time_park_to_load_area[park_index][load_area_index] = float(
60 / 1000 * item.park_load_distance / empty_speed
)
# except Exception as es:
# logger.error("备停区路网信息异常")
# logger.error(es)
# try:
for i in range(park_num):
for j in range(dynamic_excavator_num):
self.distance_park_to_excavator[i][j] = self.distance_park_to_load_area[
i
][self.excavator_index_to_load_area_index_dict[j]]
self.walk_time_park_to_excavator[i][
j
] = self.walk_time_park_to_load_area[i][
self.excavator_index_to_load_area_index_dict[j]
]
# except Exception as es:
# logger.error("备停区设备路网信息异常")
# logger.error(es)
try:
for item in session_postgre.query(WalkTimePark).all():
load_area = str(item.load_area_id)
park_area = str(item.park_area_id)
load_area_index = load_area_uuid_to_index_dict[load_area]
park_index = park_uuid_to_index_dict[park_area]
self.distance_park_to_load_area[park_index][load_area_index] = float(
item.park_load_distance
)
self.walk_time_park_to_load_area[park_index][load_area_index] = float(
60 / 1000 * item.park_load_distance / empty_speed
)
except Exception as es:
logger.error("备停区路网信息异常")
logger.error(es)
try:
for i in range(park_num):
for j in range(dynamic_excavator_num):
self.distance_park_to_excavator[i][j] = self.distance_park_to_load_area[
i
][self.excavator_index_to_load_area_index_dict[j]]
self.walk_time_park_to_excavator[i][
j
] = self.walk_time_park_to_load_area[i][
self.excavator_index_to_load_area_index_dict[j]
]
except Exception as es:
logger.error("备停区设备路网信息异常")
logger.error(es)
def period_walk_para_load(self):
# 装载路网信息
......@@ -357,6 +374,11 @@ def period_para_update():
global park_uuid_to_index_dict, park_index_to_uuid_dict
global truck_uuid_to_name_dict, truck_name_to_uuid_dict
global dynamic_truck_num, dynamic_excavator_num, dynamic_dump_num
# 清空数据库缓存
session_mysql.commit()
session_mysql.flush()
# 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# (uuid,index(id)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
(
......@@ -388,6 +410,7 @@ def period_para_update():
dynamic_truck_num = len(dynamic_truck_set)
logger.info("可用于动态派车的矿卡:")
logger.info(dynamic_truck_num)
logger.info(dynamic_truck_set)
# 用于动态调度的挖机及卸载设备
......@@ -400,3 +423,14 @@ def period_para_update():
device_map.period_map_para_update()
walk_manage.period_walk_para_update()
global_dict["dynamic_truck_set"] = dynamic_truck_set
global_dict["dynamic_truck_num"] = dynamic_truck_num
global_dict["dynamic_excavator_set"] = dynamic_excavator_set
global_dict["dynamic_excavator_num"] = dynamic_excavator_num
global_dict["dynamic_dump_set"] = dynamic_dump_set
global_dict["dynamic_dump_num"] = dynamic_dump_num
def get_value(name):
return global_dict[name]
......@@ -13,6 +13,10 @@ from tables import *
M = 1000000
truck = TruckInfo()
truck.update_truck_size()
class PathPlanner(WalkManage):
def __init__(self):
# 路线行驶成本
......@@ -20,9 +24,8 @@ class PathPlanner(WalkManage):
# 路段集合
self.lane_set = {}
# 车辆长度(暂)
self.truck = TruckInfo()
self.truck.update_truck_size()
self.truck_length = float(sum(self.truck.get_length().values())) / len(self.truck.get_length())
# self.truck_length = float(sum(truck.get_length().values())) / len(truck.get_length())
self.truck_length = 3
# 装载区数量
self.num_of_load_area = len(set(update_load_area()))
# 卸载区数量
......@@ -167,15 +170,19 @@ class PathPlanner(WalkManage):
cost_to_dump = np.zeros_like(self.distance_to_dump)
cost_park_to_excavator = np.zeros_like(self.distance_park_to_excavator)
# 路网权重
walk_weight, park_walk_weight = weighted_walk_cost()
try:
# 路网权重
walk_weight, park_walk_weight = weighted_walk_cost()
# 路网禁用关系
walk_available = available_walk()
# 路网禁用关系
walk_available = available_walk()
print("path_weight", walk_weight)
print("path_weight", walk_weight)
print("walk_avail", walk_available)
print("walk_avail", walk_available)
except Exception as es:
logger.error("无派车计划可用")
for i in range(dynamic_dump_num):
for j in range(dynamic_excavator_num):
......
......@@ -15,36 +15,36 @@ from equipment.truck import TruckInfo
from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo
dump = DumpInfo()
excavator = ExcavatorInfo()
truck = TruckInfo()
# 调度类
class Dispatcher(WalkManage):
def __init__(self):
# object fields
self.dump = DumpInfo()
self.excavator = ExcavatorInfo()
self.truck = TruckInfo()
# self.walker = WalkManage()
# 模拟挖机/卸载设备产量(防止调度修改真实产量)
self.sim_dump_real_mass = np.zeros(self.dump.get_dump_num())
self.sim_excavator_real_mass = np.zeros(self.excavator.get_excavator_num())
self.sim_dump_real_mass = np.zeros(dump.get_dump_num())
self.sim_excavator_real_mass = np.zeros(excavator.get_excavator_num())
# 真实设备可用时间
self.cur_truck_reach_dump = np.zeros(self.truck.get_truck_num())
self.cur_truck_reach_excavator = np.zeros(self.truck.get_truck_num())
self.cur_excavator_ava_time = np.zeros(self.excavator.get_excavator_num())
self.cur_dump_ava_time = np.zeros(self.dump.get_dump_num())
self.cur_truck_reach_dump = np.zeros(truck.get_truck_num())
self.cur_truck_reach_excavator = np.zeros(truck.get_truck_num())
self.cur_excavator_ava_time = np.zeros(excavator.get_excavator_num())
self.cur_dump_ava_time = np.zeros(dump.get_dump_num())
# 卡车完成装载及卸载时间(矿卡可用时间)
self.cur_truck_ava_time = np.zeros(self.truck.get_truck_num())
self.cur_truck_ava_time = np.zeros(truck.get_truck_num())
# 模拟矿卡可用时间
self.sim_truck_ava_time = np.zeros(self.truck.get_truck_num())
self.sim_truck_ava_time = np.zeros(truck.get_truck_num())
# 模拟各设备可用时间(防止调度修改真实产量)
self.sim_excavator_ava_time = np.zeros(self.excavator.get_excavator_num())
self.sim_dump_ava_time = np.zeros(self.dump.get_dump_num())
self.sim_excavator_ava_time = np.zeros(excavator.get_excavator_num())
self.sim_dump_ava_time = np.zeros(dump.get_dump_num())
# 挖机/卸载设备预计产量(包含正在驶往挖机/卸载设备那部分矿卡的载重)
self.pre_dump_real_mass = np.zeros(self.dump.get_dump_num())
self.pre_excavator_real_mass = np.zeros(self.excavator.get_excavator_num())
self.pre_dump_real_mass = np.zeros(dump.get_dump_num())
self.pre_excavator_real_mass = np.zeros(excavator.get_excavator_num())
# 维护一个矿卡调度表
self.Seq = [[] for _ in range(self.truck.get_truck_num())]
self.Seq = [[] for _ in range(truck.get_truck_num())]
# 调度开始时间
self.start_time = datetime.now()
# self.relative_now_time = datetime.now() - self.start_time
......@@ -52,29 +52,29 @@ class Dispatcher(WalkManage):
# 下面是交通流调度部分
# 驶往挖机的实际车流
self.actual_goto_excavator_traffic_flow = np.zeros(
(self.dump.get_dump_num(), self.excavator.get_excavator_num())
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.actual_goto_dump_traffic_flow = np.zeros(
(self.dump.get_dump_num(), self.excavator.get_excavator_num())
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的实际车次
self.goto_dump_truck_num = np.zeros(
(self.dump.get_dump_num(), self.excavator.get_excavator_num())
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车次
self.goto_excavator_truck_num = np.zeros(
(self.dump.get_dump_num(), self.excavator.get_excavator_num())
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的理想车流
self.opt_goto_dump_traffic_flow = np.zeros(
(self.dump.get_dump_num(), self.excavator.get_excavator_num())
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.opt_goto_excavator_traffic_flow = np.zeros(
(self.dump.get_dump_num(), self.excavator.get_excavator_num())
(dump.get_dump_num(), excavator.get_excavator_num())
)
self.path = PathPlanner()
......@@ -82,22 +82,22 @@ class Dispatcher(WalkManage):
# 更新矿卡预计抵达目的地时间
def update_truck_reach_time(self):
try:
dynamic_excavator_num = self.excavator.get_excavator_num()
dumps = self.dump.get_dump_num()
trucks = self.truck.get_truck_num()
dynamic_excavator_num = excavator.get_excavator_num()
dumps = dump.get_dump_num()
trucks = truck.get_truck_num()
truck_current_task = self.truck.get_truck_current_task()
truck_current_task = truck.get_truck_current_task()
truck_current_trip = self.truck.get_truck_current_trip()
truck_current_trip = truck.get_truck_current_trip()
cur_truck_reach_excavator = self.truck.get_truck_reach_excavator()
cur_truck_reach_excavator = truck.get_truck_reach_excavator()
cur_truck_reach_dump = self.truck.get_truck_reach_dump()
cur_truck_reach_dump = truck.get_truck_reach_dump()
excavator_ava_ls = [[] for _ in range(dynamic_excavator_num)]
dump_ava_ls = [[] for _ in range(dumps)]
for i in range(trucks):
task = truck_current_task[self.truck_index_to_uuid_dict[i]]
task = truck_current_task[truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1]
if task in [0, 1]:
reach_time = cur_truck_reach_excavator[i]
......@@ -112,7 +112,7 @@ class Dispatcher(WalkManage):
datetime.now() - self.start_time
) / timedelta(hours=0, minutes=1, seconds=0)
# print(self.truck_index_to_uuid_dict)
# print(truck_index_to_uuid_dict)
# print(excavator_ava_ls)
# print(dump_ava_ls)
except Exception as es:
......@@ -131,9 +131,9 @@ class Dispatcher(WalkManage):
/ timedelta(hours=0, minutes=1, seconds=0),
)
loading_time = self.excavator.get_loading_time()
loading_time = excavator.get_loading_time()
loading_task_time = self.excavator.get_loading_task_time()
loading_task_time = excavator.get_loading_task_time()
try:
......@@ -154,7 +154,7 @@ class Dispatcher(WalkManage):
)
self.cur_truck_ava_time[
int(tmp[i][1])
] = self.cur_excavator_ava_time[excavator_index]
] = self.cur_excavator_ava_time[excavator_index]
# # 若挖机可用时间严重偏离,进行修正
# if abs(self.cur_excavator_ava_time[excavator_index] - now) > 60:
......@@ -168,7 +168,7 @@ class Dispatcher(WalkManage):
# 更新卸载设备预计可用时间
def update_dump_ava_time(self, dump_ava_ls):
dynamic_dump_num = self.dump.get_dump_num()
dynamic_dump_num = dump.get_dump_num()
# 初始化卸载设备可用时间
self.cur_dump_ava_time = np.full(
......@@ -177,9 +177,9 @@ class Dispatcher(WalkManage):
/ timedelta(hours=0, minutes=1, seconds=0),
)
unloading_time = self.dump.get_unloading_time()
unloading_time = dump.get_unloading_time()
unloading_task_time = self.dump.get_unloading_task_time()
unloading_task_time = dump.get_unloading_task_time()
try:
......@@ -214,16 +214,16 @@ class Dispatcher(WalkManage):
# 更新实际交通流
def update_actual_traffic_flow(self):
loading_task_time = self.excavator.get_loading_task_time()
loading_task_time = excavator.get_loading_task_time()
unloading_task_time = self.dump.get_unloading_task_time()
unloading_task_time = dump.get_unloading_task_time()
truck_current_task = self.truck.get_truck_current_task()
truck_current_trip = self.truck.get_truck_current_trip()
payload = self.truck.get_payload()
truck_current_task = truck.get_truck_current_task()
truck_current_trip = truck.get_truck_current_trip()
payload = truck.get_payload()
dynamic_dump_num = self.dump.get_dump_num()
dynamic_excavator_num = self.excavator.get_excavator_num()
dynamic_dump_num = dump.get_dump_num()
dynamic_excavator_num = excavator.get_excavator_num()
self.goto_dump_truck_num = np.zeros((dynamic_excavator_num, dynamic_dump_num))
self.actual_goto_dump_traffic_flow = np.zeros(
......@@ -237,37 +237,82 @@ class Dispatcher(WalkManage):
)
try:
for i in range(dynamic_truck_num):
task = truck_current_task[self.truck_index_to_uuid_dict[i]]
task = truck_current_task[truck.truck_index_to_uuid_dict[i]]
end_area_index = truck_current_trip[i][1]
start_area_index = truck_current_trip[i][0]
# 若矿卡正常行驶,需要将该部分载重计入实时产量
#
# logger.info("debug1")
# logger.info("end_area")
# logger.info(end_area_index)
# logger.info("start_area")
# logger.info(start_area_index)
if task in heavy_task_set:
self.goto_dump_truck_num[end_area_index][start_area_index] = (
self.goto_dump_truck_num[end_area_index][start_area_index] + 1
)
self.actual_goto_dump_traffic_flow[end_area_index][
start_area_index
] = self.actual_goto_dump_traffic_flow[end_area_index][
start_area_index
] + float(
payload[i]
)
self.goto_dump_truck_num[start_area_index][end_area_index] += 1
self.actual_goto_dump_traffic_flow[start_area_index][end_area_index] += float(payload[i])
# logger.info("debug2")
if task in empty_task_set:
self.goto_excavator_truck_num[start_area_index][end_area_index] = (
self.goto_excavator_truck_num[start_area_index][end_area_index]
+ 1
)
self.actual_goto_excavator_traffic_flow[start_area_index][
end_area_index
] = self.actual_goto_excavator_traffic_flow[start_area_index][
end_area_index
] + float(
payload[i]
)
self.goto_excavator_truck_num[start_area_index][end_area_index] += 1
self.actual_goto_excavator_traffic_flow[start_area_index][end_area_index] += float(payload[i])
# logger.info("debug1")
# 若矿卡正常行驶,需要将该部分载重计入实时产量
# if task in heavy_task_set:
# logger.info("更新不及时debug")
# logger.info("end_area")
# logger.info(end_area_index)
# logger.info("start_area")
# logger.info(start_area_index)
#
# self.goto_dump_truck_num[end_area_index][start_area_index] = (
# self.goto_dump_truck_num[end_area_index][start_area_index] + 1
# )
# self.actual_goto_dump_traffic_flow[end_area_index][
# start_area_index
# ] = self.actual_goto_dump_traffic_flow[end_area_index][
# start_area_index
# ] + float(
# payload[i]
# )
# logger.info("debug2")
# if task in empty_task_set:
# self.goto_excavator_truck_num[start_area_index][end_area_index] = (
# self.goto_excavator_truck_num[start_area_index][end_area_index]
# + 1
# )
# self.actual_goto_excavator_traffic_flow[start_area_index][
# end_area_index
# ] = self.actual_goto_excavator_traffic_flow[start_area_index][
# end_area_index
# ] + float(
# payload[i]
# )
#
# print(np.expand_dims(unloading_time,axis=0).repeat(dynamic_excavator_num, axis=0))
# logger.info("self.goto_dump_truck_num")
# logger.info(self.goto_dump_truck_num)
#
# logger.info("self.actual_goto_dump_traffic_flow")
# logger.info(self.actual_goto_dump_traffic_flow)
#
# logger.info("self.goto_excavator_truck_num")
# logger.info(self.goto_excavator_truck_num)
#
# logger.info("self.actual_goto_excavator_traffic_flow")
# logger.info(self.actual_goto_excavator_traffic_flow)
self.actual_goto_dump_traffic_flow = self.actual_goto_dump_traffic_flow / (
self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num)
......@@ -277,6 +322,32 @@ class Dispatcher(WalkManage):
)
)
self.actual_goto_excavator_traffic_flow = (
self.actual_goto_excavator_traffic_flow
/ (
self.distance_to_excavator.reshape(
dynamic_dump_num, dynamic_excavator_num
)
/ (1000 * heavy_speed)
+ np.expand_dims(loading_task_time, axis=0).repeat(
dynamic_dump_num, axis=0
)
)
)
logger.info("self.goto_dump_truck_num")
logger.info(self.goto_dump_truck_num)
logger.info("self.actual_goto_dump_traffic_flow")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info("self.goto_excavator_truck_num")
logger.info(self.goto_excavator_truck_num)
logger.info("self.actual_goto_excavator_traffic_flow")
logger.info(self.actual_goto_excavator_traffic_flow)
except Exception as es:
logger.error("更新不及时")
logger.error(es)
......@@ -299,19 +370,21 @@ class Dispatcher(WalkManage):
)
logger.info("驶往卸点实际车流")
logger.info(self.actual_goto_dump_traffic_flow)
self.actual_goto_excavator_traffic_flow = (
self.actual_goto_excavator_traffic_flow
/ (
self.distance_to_excavator.reshape(
dynamic_excavator_num, dynamic_dump_num
)
/ (1000 * heavy_speed)
+ np.expand_dims(loading_task_time, axis=0).repeat(
dynamic_dump_num, axis=0
)
)
)
logger.info("________________loading_task_time__________")
logger.info(loading_task_time)
# self.actual_goto_excavator_traffic_flow = (
# self.actual_goto_excavator_traffic_flow
# / (
# self.distance_to_excavator.reshape(
# dynamic_dump_num, dynamic_excavator_num
# )
# / (1000 * heavy_speed)
# + np.expand_dims(loading_task_time, axis=0).repeat(
# dynamic_dump_num, axis=0
# )
# )
# )
# print("驶往挖机实际载重")
# print(self.actual_goto_excavator_traffic_flow)
......@@ -344,34 +417,39 @@ class Dispatcher(WalkManage):
self.period_walk_para_load()
# 更新卸载设备对象
self.dump.para_period_update()
dump.para_period_update()
# 更新挖机对象
self.excavator.para_period_update()
excavator.para_period_update()
# 更新矿卡对象
self.truck.para_period_update()
truck.para_period_update()
def state_period_update(self):
try:
truck.state_period_update()
self.truck.state_period_update()
# 更新实时车流
self.update_actual_traffic_flow()
# 更新实时车流
self.update_actual_traffic_flow()
# 计算理想车流
(self.opt_goto_dump_traffic_flow, self.opt_goto_excavator_traffic_flow,) = traffic_flow_plan()
# 计算理想车流
(self.opt_goto_dump_traffic_flow, self.opt_goto_excavator_traffic_flow,) = traffic_flow_plan()
# 矿卡抵达时间
excavator_reach_list, dump_reach_list = self.update_truck_reach_time()
# 矿卡抵达时间
excavator_reach_list, dump_reach_list = self.update_truck_reach_time()
# 挖机可用时间
self.update_excavator_ava_time(excavator_reach_list)
# 挖机可用时间
self.update_excavator_ava_time(excavator_reach_list)
# 卸载设备可用时间
self.update_dump_ava_time(dump_reach_list)
# 卸载设备可用时间
self.update_dump_ava_time(dump_reach_list)
self.cost_to_excavator, self.cost_to_dump, self.cost_park_to_excavator = self.path.walk_cost()
self.cost_to_excavator, self.cost_to_dump, self.cost_park_to_excavator = self.path.walk_cost()
except Exception as es:
logger.error("周期更新异常")
logger.error(es)
def sim_para_reset(self):
......@@ -381,6 +459,59 @@ class Dispatcher(WalkManage):
self.sim_excavator_ava_time = copy.deepcopy(self.cur_excavator_ava_time)
self.sim_dump_ava_time = copy.deepcopy(self.cur_dump_ava_time)
def reset(self):
# 模拟挖机/卸载设备产量(防止调度修改真实产量)
self.sim_dump_real_mass = np.zeros(dump.get_dump_num())
self.sim_excavator_real_mass = np.zeros(excavator.get_excavator_num())
# 真实设备可用时间
self.cur_truck_reach_dump = np.zeros(truck.get_truck_num())
self.cur_truck_reach_excavator = np.zeros(truck.get_truck_num())
self.cur_excavator_ava_time = np.zeros(excavator.get_excavator_num())
self.cur_dump_ava_time = np.zeros(dump.get_dump_num())
# 卡车完成装载及卸载时间(矿卡可用时间)
print("here1")
print(truck.get_truck_num())
self.cur_truck_ava_time = np.zeros(truck.get_truck_num())
# 模拟矿卡可用时间
self.sim_truck_ava_time = np.zeros(truck.get_truck_num())
# 模拟各设备可用时间(防止调度修改真实产量)
self.sim_excavator_ava_time = np.zeros(excavator.get_excavator_num())
self.sim_dump_ava_time = np.zeros(dump.get_dump_num())
# 挖机/卸载设备预计产量(包含正在驶往挖机/卸载设备那部分矿卡的载重)
self.pre_dump_real_mass = np.zeros(dump.get_dump_num())
self.pre_excavator_real_mass = np.zeros(excavator.get_excavator_num())
# 维护一个矿卡调度表
self.Seq = [[] for _ in range(truck.get_truck_num())]
# 下面是交通流调度部分
# 驶往挖机的实际车流
self.actual_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.actual_goto_dump_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的实际车次
self.goto_dump_truck_num = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车次
self.goto_excavator_truck_num = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往挖机的理想车流
self.opt_goto_dump_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
# 驶往卸载设备的实际车流
self.opt_goto_excavator_traffic_flow = np.zeros(
(dump.get_dump_num(), excavator.get_excavator_num())
)
def truck_schedule(self, truck_id):
rule3 = session_mysql.query(DispatchRule).filter_by(id=3).first().disabled
......@@ -388,24 +519,24 @@ class Dispatcher(WalkManage):
# cost_to_excavator, cost_to_dump, cost_park_to_excavator = self.path.walk_cost()
excavator_priority_coefficient = self.excavator.excavator_priority_coefficient
excavator_priority_coefficient = excavator.excavator_priority_coefficient
excavator_material_priority = self.excavator.excavator_material_priority
excavator_material_priority = excavator.excavator_material_priority
# 矿卡对应序号
truck_index = self.truck_uuid_to_index_dict[truck_id]
truck_index = truck.truck_uuid_to_index_dict[truck_id]
# 矿卡行程
trip = self.truck.get_truck_current_trip()[truck_index]
trip = truck.get_truck_current_trip()[truck_index]
# 矿卡当前任务
task = self.truck.get_truck_current_task()[self.truck_index_to_uuid_dict[truck_index]]
task = truck.get_truck_current_task()[truck.truck_index_to_uuid_dict[truck_index]]
# 挖机装载时间
loading_time = self.excavator.get_loading_time()
loading_time = excavator.get_loading_time()
# 路网信息
walk_time_park_to_excavator = walk_manage.get_walk_time_park_to_excavator() \
* (empty_speed / float(self.truck.empty_speed[truck_id]))
* (empty_speed / float(truck.empty_speed[truck_id]))
dynamic_dump_num = self.dump.get_dump_num()
dynamic_excavator_num = self.excavator.get_excavator_num()
dynamic_dump_num = dump.get_dump_num()
dynamic_excavator_num = excavator.get_excavator_num()
now = float(
(datetime.now() - self.start_time)
......@@ -420,13 +551,13 @@ class Dispatcher(WalkManage):
try:
logger.info("矿卡状态:矿卡启动或故障恢复")
logger.info("矿卡行程:无")
logger.info(f"涉及挖机:{list(self.excavator_uuid_to_index_dict.keys())}")
logger.info(f"涉及挖机:{list(excavator.excavator_uuid_to_index_dict.keys())}")
logger.info(
f"行程时间:{(np.maximum(self.sim_excavator_ava_time, now + walk_time_park_to_excavator[0, :]) + loading_time - now)}")
logger.info(f"行驶时间:{walk_time_park_to_excavator[0, :] + loading_time}")
logger.info("物料类型")
if truck_id in self.truck.truck_material_bind:
logger.info(self.truck.truck_material_bind[truck_id])
if truck_id in truck.truck_material_bind:
logger.info(truck.truck_material_bind[truck_id])
logger.info("挖机物料优先级")
logger.info(excavator_material_priority)
logger.info("挖机设备优先级")
......@@ -436,8 +567,8 @@ class Dispatcher(WalkManage):
logger.error(f"矿卡{truck_id}状态不匹配")
logger.error(es)
if truck_id in self.truck.truck_excavator_bind:
target = self.excavator_uuid_to_index_dict[self.truck.truck_excavator_bind[truck_id]]
if truck_id in truck.truck_excavator_bind:
target = excavator.excavator_uuid_to_index_dict[truck.truck_excavator_bind[truck_id]]
else:
transport_value = self.cost_park_to_excavator
......@@ -445,15 +576,15 @@ class Dispatcher(WalkManage):
logger.info(transport_value)
target = np.argmin(
transport_value
+ self.truck.excavator_exclude_modify[truck_index]
+ self.truck.excavator_material_bind_modify[truck_index])
+ truck.excavator_exclude_modify[truck_index]
+ truck.excavator_material_bind_modify[truck_index])
logger.info(f"目的地:{self.excavator_index_to_uuid_dict[target]}")
logger.info(f"目的地:{excavator.excavator_index_to_uuid_dict[target]}")
if task in [0, 1, 2]:
try:
logger.info("矿卡状态:矿卡空载")
logger.info(f"涉及卸载设备:{list(self.dump_uuid_to_index_dict.keys())}")
logger.info(f"涉及卸载设备:{list(dump.dump_uuid_to_index_dict.keys())}")
except Exception as es:
logger.error(f"矿卡{truck_id}状态不匹配")
logger.error(es)
......@@ -477,9 +608,9 @@ class Dispatcher(WalkManage):
try:
logger.info("挖机id:")
logger.info(self.excavator_uuid_to_index_dict)
logger.info(excavator.xcavator_uuid_to_index_dict)
logger.info("卸点id:")
logger.info(self.dump_uuid_to_index_dict)
logger.info(dump.dump_uuid_to_index_dict)
logger.info(f"卸载点实际车流:")
logger.info(self.actual_goto_dump_traffic_flow)
logger.info(f"卸载点理想车流:")
......@@ -490,21 +621,24 @@ class Dispatcher(WalkManage):
logger.info("卸载点理想车流")
logger.info(self.opt_goto_dump_traffic_flow[int(trip[1]), :])
logger.info("空载trip")
logger.info(trip)
logger.info("物料类型")
if truck_id in self.truck.truck_material_bind:
logger.info(self.truck.truck_material_bind[truck_id])
if truck_id in truck.truck_material_bind:
logger.info(truck.truck_material_bind[truck_id])
logger.info("驶往卸点的运输成本")
logger.info(self.cost_to_dump)
logger.info("卸点物料修正")
logger.info(self.truck.dump_material_bind_modify)
logger.info(truck.dump_material_bind_modify)
except Exception as es:
logger.info("车流及修正因子")
logger.info(es)
if truck_id in self.truck.truck_dump_bind:
bind_unload_area_id = self.truck.truck_dump_bind[truck_id]
for key, value in self.dump_index_to_unload_area_index_dict.items():
if truck_id in truck.truck_dump_bind:
bind_unload_area_id = truck.truck_dump_bind[truck_id]
for key, value in dump.dump_index_to_unload_area_index_dict.items():
if value == unload_area_uuid_to_index_dict[bind_unload_area_id]:
target = key
break
......@@ -516,32 +650,35 @@ class Dispatcher(WalkManage):
/ (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001)
logger.info("transport_value")
logger.info(transport_value)
logger.info("_____________here________")
logger.info(truck.dump_material_bind_modify[truck_index])
target = np.argmin(
transport_value
+ self.truck.dump_material_bind_modify[truck_index])
+ truck.dump_material_bind_modify[truck_index])
logger.info("车流比:")
logger.info((self.actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) \
/ (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001))
logger.info(f"目的地:{self.dump_index_to_uuid_dict[target]}")
logger.info(f"目的地:{dump.dump_index_to_uuid_dict[target]}")
elif task in [3, 4, 5]:
try:
logger.info("矿卡状态:矿卡重载")
logger.info(f"涉及挖机设备:{list(self.excavator_uuid_to_index_dict.keys())}")
logger.info(f"涉及挖机设备:{list(excavator.excavator_uuid_to_index_dict.keys())}")
except Exception as es:
logger.error(f"矿卡{truck_id}状态不匹配")
logger.error(es)
try:
assert np.array(self.actual_goto_excavator_traffic_flow).shape == (
dynamic_excavator_num,
dynamic_dump_num,)
dynamic_dump_num,
dynamic_excavator_num,)
assert np.array(self.opt_goto_excavator_traffic_flow).shape == (
dynamic_excavator_num,
dynamic_dump_num,)
dynamic_dump_num,
dynamic_excavator_num,)
except Exception as es:
logger.warning(es)
self.actual_goto_excavator_traffic_flow = np.array(
......@@ -554,52 +691,73 @@ class Dispatcher(WalkManage):
self.opt_goto_excavator_traffic_flow = np.array(self.opt_goto_excavator_traffic_flow)
try:
logger.info("挖机id:")
logger.info(self.excavator_uuid_to_index_dict)
logger.info(excavator.excavator_uuid_to_index_dict)
logger.info("卸点id:")
logger.info(self.dump_uuid_to_index_dict)
logger.info(dump.dump_uuid_to_index_dict)
logger.info(f"挖机实际车流:")
logger.info(self.actual_goto_excavator_traffic_flow)
logger.info(f"挖机理想车流:")
logger.info(self.opt_goto_excavator_traffic_flow)
logger.info("重载trip")
logger.info(trip)
try:
logger.info("挖机实际车流_行")
logger.info(self.actual_goto_excavator_traffic_flow[trip[1], :])
logger.info("挖机理想车流_行")
logger.info(self.opt_goto_excavator_traffic_flow[trip[1], :])
except Exception as es:
logger.info("trip出错")
logger.info(trip)
logger.info(es)
logger.info("挖机实际车流")
logger.info(self.actual_goto_excavator_traffic_flow[trip[1], :])
logger.info("挖机理想车流")
logger.info(self.opt_goto_excavator_traffic_flow[trip[1], :])
logger.info("物料类型")
if truck_id in self.truck.truck_material_bind:
logger.info(self.truck.truck_material_bind[truck_id])
if truck_id in truck.truck_material_bind:
logger.info(truck.truck_material_bind[truck_id])
logger.info("驶往挖机的运输成本")
logger.info(self.cost_to_excavator)
logger.info("挖机物料修正")
logger.info(self.truck.excavator_material_bind_modify)
logger.info(truck.excavator_material_bind_modify)
logger.info("挖机优先级修正")
logger.info(self.excavator.excavator_priority_coefficient)
logger.info(excavator.excavator_priority_coefficient)
except Exception as es:
logger.info("车流及修正因子")
logger.info(es)
if truck_id in self.truck.truck_excavator_bind:
target = self.excavator_uuid_to_index_dict[self.truck.truck_excavator_bind[truck_id]]
else:
if rule3 and rule4:
transport_value = self.cost_to_excavator[int(trip[1]), :]
try:
if truck_id in truck.truck_excavator_bind:
target = excavator.excavator_uuid_to_index_dict[truck.truck_excavator_bind[truck_id]]
logger.info("矿卡已绑定挖机")
else:
transport_value = (self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001) \
/ (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001)
logger.info("transport_value")
logger.info(transport_value)
logger.info("cost_to_excavator")
logger.info(self.cost_to_excavator)
if rule3 and rule4:
transport_value = self.cost_to_excavator[int(trip[1]), :]
else:
transport_value = (self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001) \
/ (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001)
logger.info("transport_value")
logger.info(transport_value)
target = np.argmin(transport_value
+ truck.excavator_exclude_modify[truck_index]
+ truck.excavator_material_bind_modify[truck_index])
except Exception as es:
logger.info("trip出错1")
logger.info(es)
target = np.argmin(transport_value
+ self.truck.excavator_exclude_modify[truck_index]
+ self.truck.excavator_material_bind_modify[truck_index])
logger.info("车流比:")
logger.info(
try:
logger.info("车流比:")
logger.info(
(self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001)
/ (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001))
except Exception as es:
logger.info("trip出错2")
logger.info(es)
logger.info(f"目的地:{self.excavator_index_to_uuid_dict[target]}")
logger.info(f"目的地:{excavator.excavator_index_to_uuid_dict[target]}")
logger.info("==========================================================")
......@@ -607,154 +765,165 @@ class Dispatcher(WalkManage):
def schedule_construct(self):
# try:
# 读取所需信息
trucks = self.truck.get_truck_num()
truck_current_trip = self.truck.get_truck_current_trip()
truck_current_task = self.truck.get_truck_current_task()
payload = self.truck.get_payload()
unloading_time = self.dump.get_unloading_time()
loading_time = self.excavator.get_loading_time()
# 出入场时间
loading_task_time = self.excavator.get_loading_task_time()
unloading_task_time = self.dump.get_unloading_task_time()
walk_time_to_unload_area = walk_manage.get_walk_time_to_unload_area()
walk_time_to_load_area = walk_manage.get_walk_time_to_load_area()
global truck
global excavator
global dump
# Seq初始化
Seq = [[truck_current_trip[i][1], -1] for i in range(trucks)]
self.reset()
# 根据矿卡最早可用时间顺序进行规划
temp = copy.deepcopy(self.cur_truck_ava_time) - self.truck.truck_priority
print("here2", self.cur_truck_ava_time)
try:
# 没有启动的矿卡加上一个很大的值,降低其优先级
for i in range(trucks):
task = truck_current_task[self.truck_index_to_uuid_dict[i]]
if task == -2:
temp[i] = temp[i] + M
except Exception as es:
logger.error(es)
index = np.argsort(temp.reshape(1, -1))
index = index.flatten()
# 对于在线矿卡已经赋予新的派车计划,更新其最早可用时间,及相关设备时间参数
for truck in index:
if len(Seq[truck]) > 0:
# 读取所需信息
trucks = truck.get_truck_num()
truck_current_trip = truck.get_truck_current_trip()
truck_current_task = truck.get_truck_current_task()
payload = truck.get_payload()
unloading_time = dump.get_unloading_time()
loading_time = excavator.get_loading_time()
# try:
# 出入场时间
loading_task_time = excavator.get_loading_task_time()
unloading_task_time = dump.get_unloading_task_time()
task = truck_current_task[self.truck_index_to_uuid_dict[truck]]
walk_time_to_unload_area = walk_manage.get_walk_time_to_unload_area()
walk_time_to_load_area = walk_manage.get_walk_time_to_load_area()
# 矿卡结束当前派车计划后的目的地
end_eq_index = truck_current_trip[truck][1]
# Seq初始化
Seq = [[truck_current_trip[i][1], -1] for i in range(trucks)]
# 调用调度函数,得到最优目的地序号
target_eq_index = self.truck_schedule(self.truck_index_to_uuid_dict[truck])
# 根据矿卡最早可用时间顺序进行规划
print(self.cur_truck_ava_time)
print(truck.truck_priority)
temp = copy.deepcopy(self.cur_truck_ava_time) - truck.truck_priority
# 写入Seq序列
Seq[truck][1] = target_eq_index
# except Exception as es:
# logger.error(f'矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 派车计划计算异常')
# logger.error(es)
try:
# 没有启动的矿卡加上一个很大的值,降低其优先级
for i in range(trucks):
task = truck_current_task[truck.truck_index_to_uuid_dict[i]]
if task == -2:
temp[i] = temp[i] + M
except Exception as es:
logger.info("矿卡排序启动异常")
logger.error(es)
index = np.argsort(temp.reshape(1, -1))
index = index.flatten()
# 对于在线矿卡已经赋予新的派车计划,更新其最早可用时间,及相关设备时间参数
for truck_index in index:
if len(Seq[truck_index]) > 0:
# try:
task = truck_current_task[truck.truck_index_to_uuid_dict[truck_index]]
# 矿卡结束当前派车计划后的目的地
end_eq_index = truck_current_trip[truck_index][1]
# 调用调度函数,得到最优目的地序号
target_eq_index = self.truck_schedule(truck.truck_index_to_uuid_dict[truck_index])
# 写入Seq序列
Seq[truck_index][1] = target_eq_index
# except Exception as es:
# logger.error(f'矿卡 {truck_uuid_to_name_dict[truck_index_to_uuid_dict[truck]]} 派车计划计算异常')
# logger.error(es)
try:
if task in empty_task_set:
target_area_index = dump.dump_index_to_unload_area_index_dict[target_eq_index]
end_area_index = excavator.excavator_index_to_load_area_index_dict[end_eq_index]
# 更新变量,预计产量更新
self.sim_dump_real_mass[target_eq_index] = \
(self.sim_dump_real_mass[target_eq_index] + payload[truck_index])
# 预计卸载设备可用时间更新
self.sim_dump_ava_time[target_eq_index] = (
max(
self.sim_dump_ava_time[target_eq_index],
self.sim_truck_ava_time[truck_index] + \
walk_time_to_unload_area[target_area_index][end_area_index],)
+ unloading_task_time[target_eq_index]
)
elif task in heavy_task_set:
target_area_index = (excavator.excavator_index_to_load_area_index_dict[target_eq_index])
end_area_index = dump.dump_index_to_unload_area_index_dict[end_eq_index]
# 更新变量,预计产量更新
self.sim_excavator_real_mass[target_eq_index] = (self.sim_excavator_real_mass[target_eq_index]
+ payload[truck_index])
# 预计装载点可用时间更新
self.sim_excavator_ava_time[target_eq_index] = (
max(self.sim_excavator_ava_time[target_eq_index], self.sim_truck_ava_time[truck_index]
+ walk_time_to_unload_area[end_area_index][target_area_index],) \
+ loading_task_time[target_eq_index])
else:
pass
except Exception as es:
logger.error( f"矿卡 {truck_uuid_to_name_dict[truck.truck_index_to_uuid_dict[truck_index]]} 调度状态更新异常")
logger.error(es)
for i in range(len(Seq)):
try:
record = {"truckId": truck.truck_index_to_uuid_dict[i]}
task = truck.get_truck_current_task()[truck.truck_index_to_uuid_dict[i]]
if task in empty_task_set:
target_area_index = self.dump_index_to_unload_area_index_dict[target_eq_index]
end_area_index = self.excavator_index_to_load_area_index_dict[end_eq_index]
# 更新变量,预计产量更新
self.sim_dump_real_mass[target_eq_index] = \
(self.sim_dump_real_mass[target_eq_index] + payload[truck])
# 预计卸载设备可用时间更新
self.sim_dump_ava_time[target_eq_index] = (
max(
self.sim_dump_ava_time[target_eq_index],
self.sim_truck_ava_time[truck] + \
walk_time_to_unload_area[target_area_index][end_area_index],)
+ unloading_task_time[target_eq_index]
)
item = (
session_mysql.query(Dispatch)
.filter_by(dump_id=dump.dump_index_to_uuid_dict[Seq[i][1]], isauto=1, isdeleted=0,).first())
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p")
elif task in heavy_task_set:
target_area_index = (self.excavator_index_to_load_area_index_dict[target_eq_index])
end_area_index = self.dump_index_to_unload_area_index_dict[end_eq_index]
# 更新变量,预计产量更新
self.sim_excavator_real_mass[target_eq_index] = (self.sim_excavator_real_mass[target_eq_index]
+ payload[truck])
# 预计装载点可用时间更新
self.sim_excavator_ava_time[target_eq_index] = (
max(self.sim_excavator_ava_time[target_eq_index], self.sim_truck_ava_time[truck]
+ walk_time_to_unload_area[end_area_index][target_area_index],) \
+ loading_task_time[target_eq_index])
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=excavator.excavator_index_to_uuid_dict[Seq[i][1]], isauto=1, isdeleted=0,).first())
record["exactorId"] = excavator.excavator_index_to_uuid_dict[Seq[i][1]]
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p")
elif task == -2:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=excavator.excavator_index_to_uuid_dict[Seq[i][1]], isauto=1, isdeleted=0,).first())
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p")
else:
pass
redis5.set(truck.truck_index_to_uuid_dict[i], str(json.dumps(record)))
except Exception as es:
logger.error( f"矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 调度状态更新异常")
logger.error("调度结果写入异常-redis写入异常")
logger.error(f"调度结果:{Seq}")
logger.error(es)
for i in range(len(Seq)):
try:
record = {"truckId": self.truck_index_to_uuid_dict[i]}
task = self.truck.get_truck_current_task()[self.truck_index_to_uuid_dict[i]]
if task in empty_task_set:
item = (
session_mysql.query(Dispatch)
.filter_by(dump_id=self.dump_index_to_uuid_dict[Seq[i][1]], isauto=1, isdeleted=0,).first())
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p")
elif task in heavy_task_set:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=self.excavator_index_to_uuid_dict[Seq[i][1]], isauto=1, isdeleted=0,).first())
record["exactorId"] = self.excavator_index_to_uuid_dict[Seq[i][1]]
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p")
elif task == -2:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=self.excavator_index_to_uuid_dict[Seq[i][1]], isauto=1, isdeleted=0,).first())
record["exactorId"] = item.exactor_id
record["dumpId"] = item.dump_id
record["loadAreaId"] = item.load_area_id
record["unloadAreaId"] = item.unload_area_id
record["dispatchId"] = item.id
record["isdeleted"] = False
record["creator"] = item.creator
record["createtime"] = item.createtime.strftime(
"%b %d, %Y %#I:%#M:%#S %p")
else:
pass
redis5.set(self.truck_index_to_uuid_dict[i], str(json.dumps(record)))
except Exception as es:
logger.error("调度结果写入异常-redis写入异常")
logger.error(f"调度结果:{Seq}")
logger.error(es)
for i in range(trucks):
print("dispatch_setting:")
print(redis5.get(self.truck_index_to_uuid_dict[i]))
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
for i in range(trucks):
print("dispatch_setting:")
print(redis5.get(truck.truck_index_to_uuid_dict[i]))
except Exception as es:
logger.error("更新不及时")
logger.error(es)
logger.info("#####################################周期更新结束#####################################")
......@@ -763,6 +932,7 @@ class Dispatcher(WalkManage):
def para_process(dispatcher):
logger.info("papa_process!")
# 清空数据库缓存
......@@ -773,27 +943,15 @@ def para_process(dispatcher):
session_postgre.commit()
session_postgre.flush()
# 更新周期参数
period_para_update()
# 周期更新
dispatcher.para_period_update()
# # 参数重置
# dispatcher.sim_para_reset()
# try:
# 调度计算
# dispatcher.schedule_construct()
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
def state_process(dispatcher):
# print("state_process!")
print("state_process!")
# 清空数据库缓存
session_mysql.commit()
......@@ -806,6 +964,8 @@ def state_process(dispatcher):
# 周期更新
dispatcher.state_period_update()
# 参数重置
dispatcher.sim_para_reset()
......@@ -821,10 +981,19 @@ def state_process(dispatcher):
# 下面三个函数保证程序定期执行,不用管他
def process(dispatcher):
# try:
# 更新周期参数
period_para_update()
# if dynamic_dump_num * dynamic_excavator_num == 0:
# raise Exception("无动态派车计划可用")
para_process(dispatcher)
state_process(dispatcher)
# except Exception as es:
# logger.warning(es)
# logger.warning("无动态派车计划可用")
scheduler = sched.scheduler(time.time, time.sleep)
......@@ -845,4 +1014,4 @@ if __name__ == "__main__":
dispatcher = Dispatcher()
main(10, dispatcher)
\ No newline at end of file
main(10, dispatcher)
......@@ -43,7 +43,7 @@ filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", m
# 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log"
formatter = logging.Formatter("%(asctime)s - %(name)s: %(levelname)s %(message)s")
formatter = logging.Formatter("%(asctime)s - %(name)s: %(levelname)s %(filename)s %(message)s")
filehandler.setFormatter(formatter)
logger.addHandler(filehandler)
......
......@@ -14,6 +14,10 @@ from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo
from equipment.truck import TruckInfo
truck = TruckInfo()
excavator = ExcavatorInfo()
dump = DumpInfo()
# 车流规划类
class Traffic_para(WalkManage):
def __init__(self, num_of_load_area, num_of_unload_area, num_of_excavator, num_of_dump):
......@@ -34,11 +38,10 @@ class Traffic_para(WalkManage):
self.walk_time_to_dump = np.zeros((num_of_excavator, num_of_dump)) # 逻辑重载运输路线距离
# self.payload = 200 # 有效载重(不同型号矿卡载重不同,这里暂时认为车队是同质的)
self.truck = TruckInfo()
self.payload = np.mean(self.truck.get_payload())
self.payload = np.mean(truck.get_payload())
self.empty_speed = sum(self.truck.empty_speed.values()) / self.truck.get_truck_num() # 空载矿卡平均时速
self.heavy_speed = sum(self.truck.heavy_speed.values()) / self.truck.get_truck_num() # 重载矿卡平均时速
self.empty_speed = sum(truck.empty_speed.values()) / truck.get_truck_num() # 空载矿卡平均时速
self.heavy_speed = sum(truck.heavy_speed.values()) / truck.get_truck_num() # 重载矿卡平均时速
self.min_throughout = 1000 # 最小产量约束
self.truck_total_num = 0
......@@ -49,9 +52,6 @@ class Traffic_para(WalkManage):
self.path_planner = PathPlanner()
self.path_planner.walk_cost()
self.excavator = ExcavatorInfo()
self.dump = DumpInfo()
self.excavator_priority_coefficient = np.ones(num_of_excavator) # 每个电铲的优先级系数
self.excavator_material_priority = np.ones(num_of_excavator) # 每个电铲的物料优先级系数
self.grade_loading_array = np.zeros(num_of_excavator) # 用于保存电铲挖掘矿石的品位
......@@ -77,7 +77,7 @@ class Traffic_para(WalkManage):
try:
rule3 = session_mysql.query(DispatchRule).filter_by(id=3).first()
if not rule3.disabled:
for dump_index in range(dynamic_excavator_num):
for dump_index in range(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
......@@ -88,7 +88,7 @@ class Traffic_para(WalkManage):
else:
self.dump_strength = np.full(self.num_of_dump, 5000)
for dump_index in range(dynamic_excavator_num):
for dump_index in range(dynamic_dump_num):
# self.dump_strength[dump_index] = 10000 # 卸载设备最大卸载能力,单位吨/小时
self.grade_upper_dump_array[dump_index] = 100 # 卸点品位上限
self.grade_lower_dump_array[dump_index] = 100 # 卸点品位下限
......@@ -98,31 +98,6 @@ class Traffic_para(WalkManage):
logger.error(es)
logger.error("卸载点信息设置异常")
# # 提取挖机信息并建立映射
# def extract_excavator_info(self):
# try:
# excavator_index = 0
# for dispatch in session_mysql.query(Dispatch).filter_by(isdeleted=0, isauto=1).all():
# excavator_id = dispatch.exactor_id
# load_area_id = dispatch.load_area_id
# if excavator_id not in self.excavator_uuid_to_index_dict:
# # excavator_uuid <-> excavator_uuid
# self.excavator_uuid_to_index_dict[excavator_id] = excavator_index
# self.excavator_index_to_uuid_dict[excavator_index] = excavator_id
# # excavator_uuid -> load_area_uuid
# self.excavator_uuid_to_load_area_uuid_dict[excavator_id] = load_area_id
# # excavator_id -> load_area_id
# self.excavator_index_to_load_area_index_dict[
# self.excavator_uuid_to_index_dict[excavator_id]] = \
# load_area_uuid_to_index_dict[load_area_id]
#
# self.excavator_strength[excavator_index] = 300 # 挖机最大装载能力,单位吨/小时
# self.grade_loading_array[excavator_index] = 100 # 挖机装载物料品位
# self.excavator_priority_coefficient[excavator_index] = 1 # 挖机优先级
# excavator_index += 1
# except Exception as es:
# logger.error("车流规划读取挖机信息异常")
# 设置挖信息
def extract_excavator_info(self):
try:
......@@ -147,129 +122,6 @@ class Traffic_para(WalkManage):
logger.error(es)
logger.error("挖机信息设置异常")
# def extract_walk_time_info(self):
# # load_area_uuid <-> load_area_id
# # unload_area_uuid <-> unload_area_id
# load_area_index = 0
# unload_area_index = 0
# for walk_time in session_postgre.query(WalkTime).all():
#
# load_area_id = str(walk_time.load_area_id)
# unload_area_id = str(walk_time.unload_area_id)
#
# if load_area_id not in load_area_uuid_to_index_dict:
# load_area_uuid_to_index_dict[load_area_id] = load_area_index
# load_area_index_to_uuid_dict[load_area_index] = load_area_id
# load_area_index += 1
# if unload_area_id not in unload_area_uuid_to_index_dict:
# unload_area_uuid_to_index_dict[unload_area_id] = unload_area_index
# unload_area_index_to_uuid_dict[unload_area_index] = unload_area_id
# unload_area_index += 1
# 根据物料优先级生成新的影响调度的coast矩阵
# def arrange_material_type (self, material_type):
#
# # 首先判断物料的种
# # if material_type:
# # logger.info(f'物料类型是土方')
# # else:
# # logger.info(f'物料类型是煤方')
# def extract_excavator_priority(self):
# for excavator_id in dynamic_excavator_set:
# item = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
# self.excavator_priority_coefficient[self.excavator_uuid_to_index_dict[excavator_id]] = item.priority + 1
#
# self.excavator.update_excavator_material()
#
# # 物料优先级控制
# rule = 1
# rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
# material_priority_use = rule7.disabled
# if material_priority_use == 0:
# rule = rule7.rule_weight
#
# if rule == 0:
# if self.excavator.excavator_material[excavator_id] == 'c8092d59-7597-44d7-a731-5a568b46060e':
# print("here111")
# self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
# elif rule == 2:
# if self.excavator.excavator_material[excavator_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418':
# self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
#
# print("挖机优先级")
# print(self.excavator_material_priority)
#
# def extract_dump_priority(self):
# for excavator_id in dynamic_excavator_set:
# item = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
# self.excavator_priority_coefficient[self.excavator_uuid_to_index_dict[excavator_id]] = item.priority + 1
# def extract_walk_time_info(self, include_material_type):
#
# # try:
# # 车流规划部分矩阵格式与其余两个模块不同
# cost_to_load_area = self.path_planner.cost_to_load_area
# cost_to_unload_area = self.path_planner.cost_to_unload_area
#
# distance_to_load_area = self.path_planner.distance_to_load_area
# distance_to_unload_area = self.path_planner.distance_to_unload_area
#
# self.load_area_material_type = {}
# self.unload_area_material_type = {}
# for item in session_postgre.query(DiggingWorkArea).all():
# load_area_id = str(item.Id)
# # if load_area_id in load_area_uuid_to_index_dict:
# self.load_area_material_type[load_area_id] = item.Material
#
# for item in session_postgre.query(DumpArea).all():
# unload_area_id = str(item.Id)
# # if unload_area_id in unload_area_uuid_to_index_dict:
# self.unload_area_material_type[unload_area_id] = item.Material
#
#
# # # 物料优先级控制
# # factor = 1
# # rule = 1
# # rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
# # material_priority_use = rule7.disabled
# # if material_priority_use == 0:
# # rule = rule7.rule_weight
# #
# # # 路网信息读取
# # for unload_area_index in range(unload_area_num):
# # for load_area_index in range(load_area_num):
# # unload_area_id = unload_area_index_to_uuid_dict[unload_area_index]
# # load_area_id = load_area_index_to_uuid_dict[load_area_index]
# # if unload_area_id in unload_area_uuid_to_index_dict and load_area_id in load_area_uuid_to_index_dict:
# #
# # print(cost_to_load_area[unload_area_index][load_area_index], (empty_speed * 1000), self.payload)
# #
# # if rule == 0:
# # if self.load_area_material_type[load_area_id] == 'c8092d59-7597-44d7-a731-5a568b46060e':
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # 5 * (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# # else:
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# #
# # elif rule == 1:
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# #
# # elif rule == 2:
# # if self.load_area_material_type[load_area_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418':
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # 5 * (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# # else:
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# #
# # self.goto_unload_area_factor[load_area_index][unload_area_index] = \
# # (cost_to_unload_area[unload_area_index][load_area_index] / (heavy_speed * 1000)) / self.payload
def extract_walk_time_info(self):
try:
# 车流规划部分矩阵格式与其余两个模块不同
......@@ -309,9 +161,9 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
tra_para.extract_walk_time_info()
tra_para.truck.update_truck_payload()
truck.update_truck_payload()
tra_para.payload = np.mean(tra_para.truck.get_payload())
tra_para.payload = np.mean(truck.get_payload())
# 全部矿卡设备集合
truck_set = set(update_total_truck())
......@@ -336,36 +188,6 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
tra_para.goto_dump_factor[i][j] = \
tra_para.goto_unload_area_factor[load_area_index][unload_area_index]
# # 设备优先级
# if not device_priority_use:
# print("here1")
# # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# tra_para.priority_coefficient_goto_dump[i][j] = tra_para.excavator_priority_coefficient[i] \
# * tra_para.dump_priority_coefficient[j]
#
# # 每条装载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# tra_para.priority_coefficient_goto_excavator[j][i] = tra_para.excavator_priority_coefficient[i] \
# * tra_para.dump_priority_coefficient[j]
# # 物料优先级
# if not material_priority_use:
# print("here2")
# # # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# # tra_para.priority_coefficient_goto_dump[i][j] += tra_para.excavator_material_priority[i] \
# # * tra_para.dump_material_priority[j]
#
# # 每条装载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# print(tra_para.excavator_material_priority[i], tra_para.dump_material_priority)
# tra_para.priority_coefficient_goto_excavator[j][i] = tra_para.excavator_material_priority[i] \
# * tra_para.dump_material_priority[j]
# # 逻辑距离赋值,来自实际道路距离
# tra_para.walk_time_to_excavator[j][i] = \
# tra_para.walk_time_to_load_area[unload_area_index][load_area_index]
#
# tra_para.walk_time_to_dump[i][j] = \
# tra_para.walk_time_to_unload_area[load_area_index][unload_area_index]
print("cout", tra_para.priority_coefficient_goto_dump, tra_para.priority_coefficient_goto_excavator)
# except Exception as es:
......
......@@ -9,10 +9,7 @@
# import
import pulp
from traffic_flow.traffic_flow_info import *
# from backstore_traffic_flow_info import *
# import time
# start = time.time()
# much_job = [x**2 for x in range (1, 1000000, 3)]
from para_config import *
# 从数据库中读取挖机和卸载设备相关参数,并将线性规划所用参数保存在TrafficProgPara类中
......@@ -42,14 +39,15 @@ def transportation_problem_slove(coefficient_goto_dump, coefficient_goto_excavat
prob += (pulp.lpDot(flatten(var_x), coefficient_goto_dump.flatten()))
else:
prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMinimize)
goto_excavator_cost = var_x * walk_time_to_excavator
goto_dump_cost = var_y * walk_time_to_dump
goto_excavator_cost = var_y * walk_time_to_excavator
goto_dump_cost = var_x * walk_time_to_dump
prob += (pulp.lpSum(flatten(goto_excavator_cost)) + 1.5 * pulp.lpSum(flatten(goto_dump_cost)))
# 定义约束条件
# 最小产量约束,仅在最小化成本模式下成立
if max_unload_weigh_alg_flag == False:
prob += pulp.lpSum(var_x) >= min_throughout
for i in range(col):
prob += pulp.lpSum(var_y[i]) >= min_throughout[i]
logger.info("road_factor")
logger.info(w_ij)
......@@ -144,6 +142,10 @@ def traffic_flow_plan():
print("装载区数量:", load_area_num, "卸载区数量:", unload_area_num, "挖机数量:", excavator_num, "卸载设备数量:", dump_num)
# try:
if (load_area_num * unload_area_num * excavator_num * dump_num == 0):
raise Exception("无派车计划可用")
# 初始化参量
traffic_programme_para = Traffic_para_init(load_area_num, unload_area_num, excavator_num, dump_num)
# traffic_programme_para = traffic_programme_para_init(load_area_num, unload_area_num, excavator_num, dump_num)
......@@ -204,7 +206,11 @@ def traffic_flow_plan():
return res["var_x"], res["var_y"]
traffic_flow_plan()
# except Exception as es:
# logger.error("车流规划参数异常")
# logger.error(es)
return None
# end = time.time()
# print("used {:.5}s".format(end-start))
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