Commit f3862cae authored by Allvey's avatar Allvey

Light Schedule

parent 2c77ecd3
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4"> <module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$/../WatoDisp-master" />
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 3.7 (waytous)" jdkType="Python SDK" /> <orderEntry type="jdk" jdkName="Python 3.7 (waytous)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
......
...@@ -6,30 +6,14 @@ ...@@ -6,30 +6,14 @@
# @File : dump.py # @File : dump.py
# @Software: PyCharm # @Software: PyCharm
from traffic_flow.traffic_flow_planner import *
from static_data_process import *
from para_config import * from para_config import *
from settings import * from settings import *
# 卸载设备类 # 卸载设备类
class DumpInfo(WalkManage): class DumpInfo(WalkManage):
def __init__(self): def __init__(self):
# # 卸载设备集合
# self.dynamic_dump_set = set(update_autodisp_dump())
# 卸载设备数量 # 卸载设备数量
self.dynamic_dump_num = len(dynamic_dump_set) self.dynamic_dump_num = len(dynamic_dump_set)
# 目标产量
self.dump_target_mass = np.zeros(self.dynamic_dump_num)
# 实际真实产量
self.cur_dump_real_mass = np.zeros(self.dynamic_dump_num)
# # 预计产量(包含正在驶往目的地的矿卡载重)
# self.pre_dump_real_mass = copy.deepcopy(self.cur_dump_real_mass)
# # 模拟实际产量(防止调度修改真实产量)
# self.sim_dump_real_mass = np.zeros(self.dynamic_dump_num)
# # 真实设备可用时间
# self.cur_dump_ava_time = np.zeros(self.dynamic_dump_num)
# # 模拟各设备可用时间(防止调度修改真实产量)
# self.sim_dump_ava_time = np.zeros(self.dynamic_dump_num)
# 用于动态调度的卸载设备集合 # 用于动态调度的卸载设备集合
self.dynamic_dump_set = [] self.dynamic_dump_set = []
# 开始时间 # 开始时间
...@@ -58,12 +42,6 @@ class DumpInfo(WalkManage): ...@@ -58,12 +42,6 @@ class DumpInfo(WalkManage):
def get_dump_num(self): def get_dump_num(self):
return self.dynamic_dump_num return self.dynamic_dump_num
def get_dump_target_mass(self):
return self.dump_target_mass
def get_dump_actual_mass(self):
return self.cur_dump_real_mass
def get_dynamic_dump_set(self): def get_dynamic_dump_set(self):
return self.dynamic_dump_set return self.dynamic_dump_set
...@@ -134,35 +112,20 @@ class DumpInfo(WalkManage): ...@@ -134,35 +112,20 @@ class DumpInfo(WalkManage):
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.50
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.50
# 更新卸载设备实际卸载量
def update_actual_unload_thoughout(self):
self.cur_dump_real_mass = np.zeros(self.dynamic_dump_num)
now = datetime.now().strftime("%Y-%m-%d")
for dump_id in self.dump_uuid_to_index_dict.keys():
for query in (
session_mysql.query(LoadInfo)
.join(Equipment, LoadInfo.dump_id == Equipment.equipment_id)
.filter(Equipment.id == dump_id, LoadInfo.time > now)
.order_by(LoadInfo.time.desc())
.all()
):
# print("time:", query.time)
# print("load_weight:", )
self.cur_dump_real_mass[self.dump_uuid_to_index_dict[dump_id]] = (
self.cur_dump_real_mass[self.dump_uuid_to_index_dict[dump_id]]
+ query.load_weight
)
def update_dump_material(self): def update_dump_material(self):
self.dump_material = {}
for dump_id in dynamic_dump_set: for dump_id in dynamic_dump_set:
unload_area_id = session_mysql.query(Dispatch).filter_by(dump_id=dump_id).first().unload_area_id 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 dump_material_id = session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Material
self.dump_material[dump_id] = dump_material_id\ self.dump_material[dump_id] = dump_material_id
def update_dump_priority(self): def update_dump_priority(self):
self.dump_priority_coefficient = np.ones(self.dynamic_dump_num)
for dump_id in dynamic_dump_set: for dump_id in dynamic_dump_set:
item = session_mysql.query(Equipment).filter_by(id=dump_id).first() unload_area_index = self.dump_index_to_unload_area_index_dict[self.dump_uuid_to_index_dict[dump_id]]
self.dump_priority_coefficient[self.dump_uuid_to_index_dict[dump_id]] += item.priority 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
def para_period_update(self): def para_period_update(self):
...@@ -186,9 +149,6 @@ class DumpInfo(WalkManage): ...@@ -186,9 +149,6 @@ class DumpInfo(WalkManage):
# 计算平均进出场时间 # 计算平均进出场时间
self.update_dump_entrance_exit_time() self.update_dump_entrance_exit_time()
# 计算实时卸载量
self.update_actual_unload_thoughout()
# 更新卸点物料 # 更新卸点物料
self.update_dump_material() self.update_dump_material()
......
...@@ -6,8 +6,6 @@ ...@@ -6,8 +6,6 @@
# @File : excavator.py # @File : excavator.py
# @Software: PyCharm # @Software: PyCharm
from traffic_flow.traffic_flow_planner import *
from static_data_process import *
from para_config import * from para_config import *
from settings import * from settings import *
...@@ -18,18 +16,6 @@ class ExcavatorInfo(WalkManage): ...@@ -18,18 +16,6 @@ class ExcavatorInfo(WalkManage):
# self.dynamic_excavator_set = set(update_autodisp_excavator()) # self.dynamic_excavator_set = set(update_autodisp_excavator())
# 装载设备数量 # 装载设备数量
self.dynamic_excavator_num = len(dynamic_excavator_set) self.dynamic_excavator_num = len(dynamic_excavator_set)
# 目标产量
self.excavator_target_mass = np.zeros(self.dynamic_excavator_num)
# 真实实际产量
self.cur_excavator_real_mass = np.zeros(self.dynamic_excavator_num)
# # 预计产量(包含正在驶往目的地的矿卡载重)
# self.pre_excavator_real_mass = copy.deepcopy(self.cur_excavator_real_mass)
# # 模拟实际产量(防止调度修改真实产量)
# self.sim_excavator_real_mass = np.zeros(self.dynamic_excavator_num)
# # 真实设备可用时间
# self.cur_excavator_ava_time = np.zeros(self.dynamic_excavator_num)
# # 模拟各设备可用时间(防止调度修改真实产量)
# self.sim_excavator_ava_time = np.zeros(self.dynamic_excavator_num)
# 用于动态调度的卸载设备集合 # 用于动态调度的卸载设备集合
self.dynamic_excavator_set = [] self.dynamic_excavator_set = []
# 开始时间 # 开始时间
...@@ -60,17 +46,12 @@ class ExcavatorInfo(WalkManage): ...@@ -60,17 +46,12 @@ class ExcavatorInfo(WalkManage):
def get_excavator_num(self): def get_excavator_num(self):
return self.dynamic_excavator_num return self.dynamic_excavator_num
def get_excavator_target_mass(self):
return self.excavator_target_mass
def get_excavator_actual_mass(self):
return self.cur_excavator_real_mass
def get_dynamic_excavator_set(self): def get_dynamic_excavator_set(self):
return self.dynamic_excavator_set return self.dynamic_excavator_set
# 更新挖机装载时间 # 更新挖机装载时间
def update_excavator_loadtime(self): def update_excavator_loadtime(self):
self.loading_time = np.zeros(self.dynamic_excavator_num) self.loading_time = np.zeros(self.dynamic_excavator_num)
for excavator_id in self.excavator_uuid_to_index_dict.keys(): for excavator_id in self.excavator_uuid_to_index_dict.keys():
...@@ -95,9 +76,7 @@ class ExcavatorInfo(WalkManage): ...@@ -95,9 +76,7 @@ class ExcavatorInfo(WalkManage):
except Exception as es: except Exception as es:
logger.error(f"挖机 {excavator_id} 装载时间信息缺失, 已设为默认值(1min)") logger.error(f"挖机 {excavator_id} 装载时间信息缺失, 已设为默认值(1min)")
logger.error(es) logger.error(es)
self.loading_time[ self.loading_time[self.excavator_uuid_to_index_dict[excavator_id]] = 5.00
self.excavator_uuid_to_index_dict[excavator_id]
] = 5.00
# 更新挖机设备出入时间 # 更新挖机设备出入时间
def update_excavator_entrance_exit_time(self): def update_excavator_entrance_exit_time(self):
...@@ -141,37 +120,16 @@ class ExcavatorInfo(WalkManage): ...@@ -141,37 +120,16 @@ class ExcavatorInfo(WalkManage):
return loading_task_time return loading_task_time
# 更新挖机实际装载量
def update_actual_load_throughout(self):
self.cur_excavator_real_mass = np.zeros(self.dynamic_excavator_num)
now = datetime.now().strftime("%Y-%m-%d")
for excavator_id in self.excavator_uuid_to_index_dict.keys():
# print(excavator_id)
for query in (
session_mysql.query(LoadInfo)
.join(Equipment, LoadInfo.dump_id == Equipment.equipment_id)
.filter(Equipment.id == excavator_id, LoadInfo.time > now)
.order_by(LoadInfo.time.desc())
.all()
):
# print("time:", query.time)
# print("load_weight:", )
self.cur_excavator_real_mass[
self.excavator_uuid_to_index_dict[excavator_id]
] = (
self.cur_excavator_real_mass[
self.excavator_uuid_to_index_dict[excavator_id]
]
+ query.load_weight
)
def update_excavator_material(self): def update_excavator_material(self):
for excavator_id in dynamic_excavator_set: for excavator_id in dynamic_excavator_set:
load_area_id = session_mysql.query(Dispatch).filter_by(exactor_id=excavator_id).first().load_area_id 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 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
def update_excavator_priority(self): def update_excavator_priority(self):
self.excavator_material_priority = np.ones(dynamic_excavator_num)
for excavator_id in dynamic_excavator_set: for excavator_id in dynamic_excavator_set:
item = session_mysql.query(Equipment).filter_by(id=excavator_id).first() 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_priority_coefficient[self.excavator_uuid_to_index_dict[excavator_id]] = item.priority + 1
...@@ -184,17 +142,15 @@ class ExcavatorInfo(WalkManage): ...@@ -184,17 +142,15 @@ class ExcavatorInfo(WalkManage):
rule = rule7.rule_weight rule = rule7.rule_weight
if rule == 3: if rule == 3:
if session_mysql.query(Material).filter_by(id=self.excavator_material[excavator_id]).first().name == '土': if self.excavator_material[excavator_id] == 'c8092d59-7597-44d7-a731-5a568b46060e':
self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5 self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
elif rule == 1: elif rule == 1:
if session_mysql.query(Material).filter_by(id=self.excavator_material[excavator_id]).first().name == '煤': if self.excavator_material[excavator_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418':
self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5 self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
def para_period_update(self): def para_period_update(self):
# print("Excavator update!")
logger.info("Excavator update!") logger.info("Excavator update!")
# 装载周期参数 # 装载周期参数
...@@ -202,11 +158,6 @@ class ExcavatorInfo(WalkManage): ...@@ -202,11 +158,6 @@ class ExcavatorInfo(WalkManage):
self.period_walk_para_load() self.period_walk_para_load()
# # 初始化挖机可用时间
# self.cur_excavator_ava_time = np.full(self.dynamic_excavator_num,
# (datetime.now() - self.start_time) / timedelta(hours=0, minutes=1,
# seconds=0))
# 用于动态调度的挖机设备 # 用于动态调度的挖机设备
self.dynamic_excavator_set = set(update_autodisp_excavator()) self.dynamic_excavator_set = set(update_autodisp_excavator())
...@@ -215,15 +166,8 @@ class ExcavatorInfo(WalkManage): ...@@ -215,15 +166,8 @@ class ExcavatorInfo(WalkManage):
# 计算平均装载时间 # 计算平均装载时间
self.update_excavator_loadtime() self.update_excavator_loadtime()
# 计算实时装载量
self.update_actual_load_throughout()
# 更新挖机物料 # 更新挖机物料
self.update_excavator_material() self.update_excavator_material()
# 更新挖机优先级 # 更新挖机优先级
self.update_excavator_priority()
# 挖机目标产量
self.excavator_target_mass = np.full(
self.dynamic_excavator_num, excavator_target_mass
)
...@@ -6,8 +6,6 @@ ...@@ -6,8 +6,6 @@
# @File : truck.py # @File : truck.py
# @Software: PyCharm # @Software: PyCharm
from traffic_flow.traffic_flow_planner import *
from static_data_process import *
from para_config import * from para_config import *
from settings import * from settings import *
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
...@@ -37,9 +35,6 @@ class TruckInfo(WalkManage): ...@@ -37,9 +35,6 @@ class TruckInfo(WalkManage):
self.truck_current_task = {} self.truck_current_task = {}
# 调度开始时间 # 调度开始时间
self.start_time = datetime.now() self.start_time = datetime.now()
# # 卡车完成装载及卸载时间
# self.cur_truck_ava_time = np.zeros(self.dynamic_truck_num)
# self.sim_truck_ava_time = np.zeros(self.dynamic_truck_num)
# 矿卡有效载重 # 矿卡有效载重
self.payload = np.zeros(self.dynamic_truck_num) self.payload = np.zeros(self.dynamic_truck_num)
# 矿卡时速 # 矿卡时速
...@@ -61,14 +56,14 @@ class TruckInfo(WalkManage): ...@@ -61,14 +56,14 @@ class TruckInfo(WalkManage):
# 矿卡卸点排斥关系 # 矿卡卸点排斥关系
self.truck_dump_exclude = {} self.truck_dump_exclude = {}
# 排斥关系modify # 排斥关系modify
self.excavator_exclude_modify = np.zeros(self.dynamic_truck_num) self.excavator_exclude_modify = np.full((dynamic_truck_num, dynamic_excavator_num), 0)
# 矿卡优先级 # 矿卡优先级
self.truck_priority = np.ones(self.dynamic_truck_num) self.truck_priority = np.ones(self.dynamic_truck_num)
# 矿卡绑定物料 # 矿卡绑定物料
self.truck_material_bind = {} self.truck_material_bind = {}
# 矿卡绑定物料modify # 矿卡绑定物料modify
self.dump_material_bind_modify = np.zeros(self.dynamic_truck_num) self.dump_material_bind_modify = np.full((self.dynamic_truck_num, dynamic_excavator_num), 0)
self.excavator_material_bind_modify = np.zeros(self.dynamic_truck_num) self.excavator_material_bind_modify =np.zeros(self.dynamic_truck_num)
# 引入对象 # 引入对象
self.dump = DumpInfo() self.dump = DumpInfo()
self.excavator = ExcavatorInfo() self.excavator = ExcavatorInfo()
...@@ -100,7 +95,7 @@ class TruckInfo(WalkManage): ...@@ -100,7 +95,7 @@ class TruckInfo(WalkManage):
return self.relative_last_load_time return self.relative_last_load_time
def get_realative_last_unload_time(self): def get_realative_last_unload_time(self):
return self.relative_unlast_load_time return self.relative_last_unload_time
def get_payload(self): def get_payload(self):
return self.payload return self.payload
...@@ -250,10 +245,6 @@ class TruckInfo(WalkManage): ...@@ -250,10 +245,6 @@ class TruckInfo(WalkManage):
self.dump_uuid_to_index_dict[item.dump_id], self.dump_uuid_to_index_dict[item.dump_id],
self.excavator_uuid_to_index_dict[item.exactor_id], self.excavator_uuid_to_index_dict[item.exactor_id],
] ]
# if truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[i]] in tmp_set:
# self.cur_truck_reach_excavator[i] = last_unload_time + 10 * self.walk_time_to_load_area[start_area_index][
# end_area_index]
# else:
self.cur_truck_reach_excavator[i] = ( self.cur_truck_reach_excavator[i] = (
last_unload_time last_unload_time
+ walk_time_to_load_area[start_area_index][end_area_index] + walk_time_to_load_area[start_area_index][end_area_index]
...@@ -336,9 +327,6 @@ class TruckInfo(WalkManage): ...@@ -336,9 +327,6 @@ class TruckInfo(WalkManage):
elif item.priority == 3: elif item.priority == 3:
self.truck_priority[truck_index] = 10 self.truck_priority[truck_index] = 10
logger.info("矿卡优先级:")
logger.info(self.truck_priority)
def update_truck_dump_area_bind(self): def update_truck_dump_area_bind(self):
try: try:
rule5 = session_mysql.query(DispatchRule).filter_by(id=5).first() rule5 = session_mysql.query(DispatchRule).filter_by(id=5).first()
...@@ -354,10 +342,6 @@ class TruckInfo(WalkManage): ...@@ -354,10 +342,6 @@ class TruckInfo(WalkManage):
logger.error("矿卡-卸载区域绑定关系读取异常") logger.error("矿卡-卸载区域绑定关系读取异常")
logger.error(es) logger.error(es)
logger.info("矿卡-卸载点绑定关系")
logger.info(self.truck_dump_bind)
def update_truck_excavator_bind(self): def update_truck_excavator_bind(self):
try: try:
rule5 = session_mysql.query(DispatchRule).filter_by(id=5).first() rule5 = session_mysql.query(DispatchRule).filter_by(id=5).first()
...@@ -374,9 +358,6 @@ class TruckInfo(WalkManage): ...@@ -374,9 +358,6 @@ class TruckInfo(WalkManage):
logger.error("矿卡-挖机绑定关系读取异常") logger.error("矿卡-挖机绑定关系读取异常")
logger.error(es) logger.error(es)
logger.info("矿卡-挖机绑定关系")
logger.info(self.truck_excavator_bind)
def update_truck_excavator_exclude(self): def update_truck_excavator_exclude(self):
self.truck_excavator_exclude = {} self.truck_excavator_exclude = {}
...@@ -407,10 +388,6 @@ class TruckInfo(WalkManage): ...@@ -407,10 +388,6 @@ class TruckInfo(WalkManage):
logger.error("矿卡-挖机禁止关系读取异常") logger.error("矿卡-挖机禁止关系读取异常")
logger.error(es) logger.error(es)
logger.info("矿卡-挖机禁止关系")
logger.info(self.truck_excavator_exclude)
logger.info(self.excavator_exclude_modify)
def update_truck_dump_exclude(self): def update_truck_dump_exclude(self):
pass pass
...@@ -437,9 +414,11 @@ class TruckInfo(WalkManage): ...@@ -437,9 +414,11 @@ class TruckInfo(WalkManage):
if truck_id in self.truck_excavator_bind: if truck_id in self.truck_excavator_bind:
excavator_id = self.truck_excavator_bind[truck_id] 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 = self.excavator.excavator_material[excavator_id]
self.truck_material_bind[truck_id] = excavator_material_id self.truck_material_bind[truck_id] = excavator_material_id
for truck_id in dynamic_truck_set: for truck_id in dynamic_truck_set:
truck_index = self.truck_uuid_to_index_dict[truck_id] truck_index = self.truck_uuid_to_index_dict[truck_id]
...@@ -460,9 +439,6 @@ class TruckInfo(WalkManage): ...@@ -460,9 +439,6 @@ class TruckInfo(WalkManage):
if dump_material_id != material: if dump_material_id != material:
self.dump_material_bind_modify[truck_index][dump_index] = 1000000 self.dump_material_bind_modify[truck_index][dump_index] = 1000000
logger.info("矿卡-物料类型")
logger.info(self.truck_material_bind)
def update_truck_spec(self): def update_truck_spec(self):
for truck_id in dynamic_truck_set: for truck_id in dynamic_truck_set:
self.size[truck_id] = session_mysql.query(Equipment).filter_by(id=truck_id).first().equipment_spec self.size[truck_id] = session_mysql.query(Equipment).filter_by(id=truck_id).first().equipment_spec
...@@ -485,8 +461,6 @@ class TruckInfo(WalkManage): ...@@ -485,8 +461,6 @@ class TruckInfo(WalkManage):
def para_period_update(self): def para_period_update(self):
# print("Para truck update!")
# 设备优先级启用 # 设备优先级启用
rule6 = session_mysql.query(DispatchRule).filter_by(id=6).first().disabled rule6 = session_mysql.query(DispatchRule).filter_by(id=6).first().disabled
...@@ -546,53 +520,3 @@ class TruckInfo(WalkManage): ...@@ -546,53 +520,3 @@ class TruckInfo(WalkManage):
# 矿卡速度更新 # 矿卡速度更新
self.update_truck_speed() self.update_truck_speed()
# def period_update(self):
#
# print("Truck update!")
#
# # # 更新行走队形
# # self.walker.update_walk_time()
#
# # 装载周期参数
# self.period_map_para_load()
#
# 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)
#
# # 更新卡车当前任务
# self.update_truck_current_task()
#
# # 更新有效载重
# self.update_truck_payload()
#
# # 更新卡车最后一次装载/卸载时间
# self.update_truck_last_leave_time()
#
# # 更新卡车当前行程
# self.update_truck_trip()
#
# # 更新绑定关系
# self.update_truck_dump_area_bind()
#
# self.update_truck_excavator_bind()
#
# # 更新禁止关系
# self.update_truck_excavator_exclude()
#
# # 更新矿卡调度优先级
# self.update_truck_priority()
#
# # 更新矿卡物料类型
# self.update_truck_material()
...@@ -13,7 +13,6 @@ from tables import * ...@@ -13,7 +13,6 @@ from tables import *
M = 1000000 M = 1000000
class PathPlanner(WalkManage): class PathPlanner(WalkManage):
def __init__(self): def __init__(self):
# 路线行驶成本 # 路线行驶成本
...@@ -53,21 +52,28 @@ class PathPlanner(WalkManage): ...@@ -53,21 +52,28 @@ class PathPlanner(WalkManage):
weighted_distance = weighted_walk_cost() weighted_distance = weighted_walk_cost()
# 修正因子 # 修正因子
weight = 10000 weight = 100
# 阻塞成本权重 # 阻塞成本权重
alpha = 1 * weight alpha = 0
# 距离成本权重 # 距离成本权重
beta = 1 beta = 1
session_mysql.commit()
# 距离成本启用 # 距离成本启用
rule1 = session_mysql.query(DispatchRule).filter_by(id=1).first() rule1 = session_mysql.query(DispatchRule).filter_by(id=1).first()
if rule1.disabled == 0: if rule1.disabled == 0:
alpha = alpha * rule1.rule_weight beta = rule1.rule_weight
# 拥堵成本启用 # 拥堵成本启用
rule2 = session_mysql.query(DispatchRule).filter_by(id=2).first() rule2 = session_mysql.query(DispatchRule).filter_by(id=2).first()
if rule2.disabled == 0: if rule2.disabled == 0:
beta = beta * rule2.rule_weight alpha = rule2.rule_weight
beta /= beta
alpha = alpha / beta * weight
try: try:
# 备停区处理 # 备停区处理
...@@ -130,12 +136,9 @@ class PathPlanner(WalkManage): ...@@ -130,12 +136,9 @@ class PathPlanner(WalkManage):
self.period_map_para_load() self.period_map_para_load()
# try: try:
# 读取路网成本 # 读取路网成本
for walk_time in session_postgre.query(WalkTime).all(): for walk_time in session_postgre.query(WalkTime).all():
# print(str(walk_time.load_area_id),str(walk_time.unload_area_id))
# print(walk_time.load_area_name, walk_time.unload_area_name)
load_area_id, unload_area_id = str(walk_time.load_area_id), str(walk_time.unload_area_id) load_area_id, unload_area_id = str(walk_time.load_area_id), str(walk_time.unload_area_id)
unload_area_index = unload_area_uuid_to_index_dict[unload_area_id] unload_area_index = unload_area_uuid_to_index_dict[unload_area_id]
load_area_index = load_area_uuid_to_index_dict[load_area_id] load_area_index = load_area_uuid_to_index_dict[load_area_id]
...@@ -147,23 +150,25 @@ class PathPlanner(WalkManage): ...@@ -147,23 +150,25 @@ class PathPlanner(WalkManage):
for walk_time_park in session_postgre.query(WalkTimePark).all(): for walk_time_park in session_postgre.query(WalkTimePark).all():
park_area_index = park_uuid_to_index_dict[str(walk_time_park.park_area_id)] park_area_index = park_uuid_to_index_dict[str(walk_time_park.park_area_id)]
load_area_index = load_area_uuid_to_index_dict[str(walk_time_park.load_area_id)] load_area_index = load_area_uuid_to_index_dict[str(walk_time_park.load_area_id)]
_, self.cost_park_to_load_area[park_area_index][load_area_index] = \ self.cost_park_to_load_area[park_area_index][load_area_index], _ = \
self.path_cost_generate(str(walk_time_park.load_area_id), str(walk_time_park.park_area_id), True) self.path_cost_generate(str(walk_time_park.load_area_id), str(walk_time_park.park_area_id), True)
# except Exception as es: except Exception as es:
# logger.error('路网信息计成本计算异常') logger.error('路网信息计成本计算异常')
# logger.error(es) logger.error(es)
cost_to_excavator = np.zeros_like(self.distance_to_excavator) cost_to_excavator = np.zeros_like(self.distance_to_excavator)
cost_to_dump = np.zeros_like(self.distance_to_dump) cost_to_dump = np.zeros_like(self.distance_to_dump)
cost_park_to_excavator = np.zeros_like(self.distance_park_to_excavator)
# 路网优先级 # 路网权重
walk_weight = weighted_walk_cost() walk_weight, park_walk_weight = weighted_walk_cost()
walk_weight = walk_weight / walk_weight.min()
# 路网禁用关系 # 路网禁用关系
walk_available = available_walk() walk_available = available_walk()
logger.info("walk_weight", walk_weight)
print("path_weight", walk_weight)
print("walk_avail", walk_available)
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):
...@@ -172,19 +177,29 @@ class PathPlanner(WalkManage): ...@@ -172,19 +177,29 @@ class PathPlanner(WalkManage):
cost_to_excavator[i][j] = self.cost_to_load_area[unload_area_index][load_area_index] / walk_weight[i][j] cost_to_excavator[i][j] = self.cost_to_load_area[unload_area_index][load_area_index] / walk_weight[i][j]
cost_to_dump[i][j] = self.cost_to_unload_area[unload_area_index][load_area_index] / walk_weight[i][j] * walk_available[i][j] cost_to_dump[i][j] = self.cost_to_unload_area[unload_area_index][load_area_index] / walk_weight[i][j] * walk_available[i][j]
for j in range(dynamic_excavator_num):
load_area_index = self.excavator_index_to_load_area_index_dict[j]
cost_park_to_excavator[0][j] = self.cost_park_to_load_area[0][load_area_index] / park_walk_weight[0][j]
logger.info("真实路网距离-驶往挖机:") logger.info("真实路网距离-驶往挖机:")
logger.info(self.distance_to_excavator) logger.info(self.distance_to_excavator)
logger.info("真实路网距离-驶往卸点:") logger.info("真实路网距离-驶往卸点:")
logger.info(self.distance_to_dump) logger.info(self.distance_to_dump)
logger.info("加权-阻塞路网距离-驶往挖机:") logger.info("真实备停区路网距离-驶往挖机:")
logger.info(self.distance_park_to_excavator)
logger.info("阻塞路网距离-驶往挖机:")
logger.info(cost_to_excavator) logger.info(cost_to_excavator)
logger.info("加权-阻塞路网距离-驶往卸点:") logger.info("阻塞路网距离-驶往卸点:")
logger.info(cost_to_dump) logger.info(cost_to_dump)
return cost_to_excavator, cost_to_dump, walk_weight, walk_available logger.info("阻塞备停区路网距离-驶往挖机:")
logger.info(cost_park_to_excavator)
return cost_to_excavator, cost_to_dump, cost_park_to_excavator
class LaneInfo: class LaneInfo:
...@@ -232,18 +247,12 @@ class LaneInfo: ...@@ -232,18 +247,12 @@ class LaneInfo:
# truck -> lane # truck -> lane
truck_locate_dict = self.update_truck_loacate() truck_locate_dict = self.update_truck_loacate()
# print("truck -> lane")
# print(truck_locate_dict)
logger.info("矿卡位于路段:") logger.info("矿卡位于路段:")
logger.info(truck_locate_dict) logger.info(truck_locate_dict)
# truck -> speed # truck -> speed
truck_speed_dict = self.update_truck_speed() truck_speed_dict = self.update_truck_speed()
# print("truck -> speed")
# print(truck_speed_dict)
logger.info("矿卡当前速度:") logger.info("矿卡当前速度:")
logger.info(truck_speed_dict) logger.info(truck_speed_dict)
......
...@@ -15,6 +15,7 @@ truck = TruckInfo() ...@@ -15,6 +15,7 @@ truck = TruckInfo()
excavator = ExcavatorInfo() excavator = ExcavatorInfo()
dump = DumpInfo() dump = DumpInfo()
def weighted_walk_cost(): def weighted_walk_cost():
excavator.update_excavator_priority() excavator.update_excavator_priority()
dump.update_dump_priority() dump.update_dump_priority()
...@@ -23,8 +24,10 @@ def weighted_walk_cost(): ...@@ -23,8 +24,10 @@ def weighted_walk_cost():
excavator_material_priority = excavator.excavator_material_priority excavator_material_priority = excavator.excavator_material_priority
dump_priority = dump.dump_priority_coefficient dump_priority = dump.dump_priority_coefficient
dump_material_priority = np.ones(dynamic_dump_num) dump_material_priority = np.ones(dynamic_dump_num)
park_walk_weight = np.ones((park_num, dynamic_excavator_num))
rule6 = session_mysql.query(DispatchRule).filter_by(id=6).first() rule6 = session_mysql.query(DispatchRule).filter_by(id=6).first()
if not rule6.disabled: if not rule6.disabled:
for dump_id in dynamic_dump_set: for dump_id in dynamic_dump_set:
for excavator_id in dynamic_excavator_set: for excavator_id in dynamic_excavator_set:
...@@ -32,8 +35,10 @@ def weighted_walk_cost(): ...@@ -32,8 +35,10 @@ def weighted_walk_cost():
excavator_inedx = excavator.excavator_uuid_to_index_dict[excavator_id] excavator_inedx = excavator.excavator_uuid_to_index_dict[excavator_id]
walk_weight[dump_index][excavator_inedx] += dump_priority[dump_index] * \ walk_weight[dump_index][excavator_inedx] += dump_priority[dump_index] * \
excavator_priority[excavator_inedx] excavator_priority[excavator_inedx]
park_walk_weight = park_walk_weight * excavator.excavator_priority_coefficient
rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first() rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
if not rule7.disabled: if not rule7.disabled:
for dump_id in dynamic_dump_set: for dump_id in dynamic_dump_set:
for excavator_id in dynamic_excavator_set: for excavator_id in dynamic_excavator_set:
...@@ -41,11 +46,13 @@ def weighted_walk_cost(): ...@@ -41,11 +46,13 @@ def weighted_walk_cost():
excavator_inedx = excavator.excavator_uuid_to_index_dict[excavator_id] excavator_inedx = excavator.excavator_uuid_to_index_dict[excavator_id]
walk_weight[dump_index][excavator_inedx] += dump_material_priority[dump_index] * \ walk_weight[dump_index][excavator_inedx] += dump_material_priority[dump_index] * \
excavator_material_priority[excavator_inedx] excavator_material_priority[excavator_inedx]
park_walk_weight = park_walk_weight * excavator.excavator_material_priority
logger.info("路网优先级") walk_weight = walk_weight - (walk_weight.min() - 1)
logger.info(walk_weight)
return walk_weight park_walk_weight = park_walk_weight - (park_walk_weight.min() - 1)
return walk_weight, park_walk_weight
def available_walk(): def available_walk():
...@@ -60,8 +67,5 @@ def available_walk(): ...@@ -60,8 +67,5 @@ def available_walk():
if excavator.excavator_material[excavator_id] != dump.dump_material[dump_id]: if excavator.excavator_material[excavator_id] != dump.dump_material[dump_id]:
walk_weight[dump_index][excavator_inedx] += 1000 walk_weight[dump_index][excavator_inedx] += 1000
logger.info("路网禁用关系")
logger.info(walk_weight)
return walk_weight return walk_weight
This diff is collapsed.
...@@ -28,8 +28,8 @@ import time ...@@ -28,8 +28,8 @@ import time
log_path = "/usr/local/fleet-log/dispatch" log_path = "/usr/local/fleet-log/dispatch"
# 创建日志目录 # 创建日志目录
if not os.path.exists(log_path): # if not os.path.exists(log_path):
os.mkdir(log_path) # os.mkdir(log_path)
# logging初始化工作 # logging初始化工作
logging.basicConfig() logging.basicConfig()
...@@ -39,8 +39,8 @@ logger.setLevel(logging.INFO) ...@@ -39,8 +39,8 @@ logger.setLevel(logging.INFO)
# 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) # 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) filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样 # 设置后缀名称,跟strftime的格式一样
filehandler.suffix = "%Y-%m-%d_%H-%M.log" filehandler.suffix = "%Y-%m-%d_%H-%M.log"
......
...@@ -390,13 +390,15 @@ class DumpArea(Base): ...@@ -390,13 +390,15 @@ class DumpArea(Base):
UnloadAbililty = Column(Float) UnloadAbililty = Column(Float)
Disabled = Column(Integer) Disabled = Column(Integer)
Material = Column(VARCHAR(36)) Material = Column(VARCHAR(36))
Priority = Column(Integer)
def __init__(self, Id, BindList, UnloadAbililty, Disabled, Material): def __init__(self, Id, BindList, UnloadAbililty, Disabled, Material, Priority):
self.Id = Id self.Id = Id
self.BindList = BindList self.BindList = BindList
self.UnloadAbililty = UnloadAbililty self.UnloadAbililty = UnloadAbililty
self.Disabled = Disabled self.Disabled = Disabled
self.Material = Material self.Material = Material
self.Priority = Priority
class DiggingWorkArea(Base): class DiggingWorkArea(Base):
...@@ -424,7 +426,7 @@ class DispatchRule(Base): ...@@ -424,7 +426,7 @@ class DispatchRule(Base):
class Material(Base): class Material(Base):
__tablename__ = 'resource_materials' __tablename__ = 'resource_metarials'
id = Column(VARCHAR(40), primary_key=True) id = Column(VARCHAR(40), primary_key=True)
name = Column(VARCHAR(40)) name = Column(VARCHAR(40))
......
...@@ -7,9 +7,8 @@ ...@@ -7,9 +7,8 @@
# @Software: PyCharm # @Software: PyCharm
# import # import
from path_plan.path_plannner import *
from traffic_flow.traffic_flow_planner import * from traffic_flow.traffic_flow_planner import *
from path_plan.path_plannner import *
from para_config import * from para_config import *
from equipment.excavator import ExcavatorInfo from equipment.excavator import ExcavatorInfo
from equipment.dump import DumpInfo from equipment.dump import DumpInfo
...@@ -194,6 +193,7 @@ class Traffic_para(WalkManage): ...@@ -194,6 +193,7 @@ class Traffic_para(WalkManage):
# #
# if rule == 0: # if rule == 0:
# if self.excavator.excavator_material[excavator_id] == 'c8092d59-7597-44d7-a731-5a568b46060e': # 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 # self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
# elif rule == 2: # elif rule == 2:
# if self.excavator.excavator_material[excavator_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418': # if self.excavator.excavator_material[excavator_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418':
...@@ -338,6 +338,7 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu ...@@ -338,6 +338,7 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
# # 设备优先级 # # 设备优先级
# if not device_priority_use: # if not device_priority_use:
# print("here1")
# # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级 # # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# tra_para.priority_coefficient_goto_dump[i][j] = tra_para.excavator_priority_coefficient[i] \ # tra_para.priority_coefficient_goto_dump[i][j] = tra_para.excavator_priority_coefficient[i] \
# * tra_para.dump_priority_coefficient[j] # * tra_para.dump_priority_coefficient[j]
...@@ -347,6 +348,7 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu ...@@ -347,6 +348,7 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
# * tra_para.dump_priority_coefficient[j] # * tra_para.dump_priority_coefficient[j]
# # 物料优先级 # # 物料优先级
# if not material_priority_use: # if not material_priority_use:
# print("here2")
# # # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级 # # # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# # tra_para.priority_coefficient_goto_dump[i][j] += tra_para.excavator_material_priority[i] \ # # tra_para.priority_coefficient_goto_dump[i][j] += tra_para.excavator_material_priority[i] \
# # * tra_para.dump_material_priority[j] # # * tra_para.dump_material_priority[j]
...@@ -364,10 +366,7 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu ...@@ -364,10 +366,7 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
# tra_para.walk_time_to_dump[i][j] = \ # tra_para.walk_time_to_dump[i][j] = \
# tra_para.walk_time_to_unload_area[load_area_index][unload_area_index] # tra_para.walk_time_to_unload_area[load_area_index][unload_area_index]
logger.info("priority_coefficient_goto_dump") print("cout", tra_para.priority_coefficient_goto_dump, tra_para.priority_coefficient_goto_excavator)
logger.info(tra_para.priority_coefficient_goto_dump)
logger.info("priority_coefficient_goto_excavator")
logger.info(tra_para.priority_coefficient_goto_excavator)
# except Exception as es: # except Exception as es:
# logger.error(es) # logger.error(es)
......
...@@ -39,7 +39,7 @@ def transportation_problem_slove(coefficient_goto_dump, coefficient_goto_excavat ...@@ -39,7 +39,7 @@ def transportation_problem_slove(coefficient_goto_dump, coefficient_goto_excavat
if max_unload_weigh_alg_flag == True: if max_unload_weigh_alg_flag == True:
prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMaximize) prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMaximize)
# 得到目标函数,目标函数是使得系统的运输量最大 # 得到目标函数,目标函数是使得系统的运输量最大
prob += (pulp.lpDot(flatten(var_y), coefficient_goto_excavator.flatten())) prob += (pulp.lpDot(flatten(var_x), coefficient_goto_dump.flatten()))
else: else:
prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMinimize) prob = pulp.LpProblem('Transportation Problem', sense=pulp.LpMinimize)
goto_excavator_cost = var_x * walk_time_to_excavator goto_excavator_cost = var_x * walk_time_to_excavator
...@@ -168,7 +168,7 @@ def traffic_flow_plan(): ...@@ -168,7 +168,7 @@ def traffic_flow_plan():
walk_time_to_dump = traffic_programme_para.walk_time_to_dump walk_time_to_dump = traffic_programme_para.walk_time_to_dump
truck_total_num = traffic_programme_para.truck_total_num truck_total_num = traffic_programme_para.truck_total_num
# print(w_ij, s_ij, b_excavator, b_dump) print(w_ij, s_ij, b_excavator, b_dump)
res = transportation_problem_slove(coefficient_goto_dump, coefficient_goto_excavator, w_ij, s_ij, b_excavator, b_dump, res = transportation_problem_slove(coefficient_goto_dump, coefficient_goto_excavator, w_ij, s_ij, b_excavator, b_dump,
grade_loading_array, max_unload_weigh_alg_flag, truck_total_num, grade_loading_array, max_unload_weigh_alg_flag, truck_total_num,
...@@ -184,16 +184,12 @@ def traffic_flow_plan(): ...@@ -184,16 +184,12 @@ def traffic_flow_plan():
print('各变量的取值为:') print('各变量的取值为:')
logger.info('各变量取值:') logger.info('各变量取值:')
logger.info(dynamic_excavator_set)
logger.info(dynamic_dump_set)
print(dynamic_excavator_set)
print(dynamic_dump_set) print(dynamic_dump_set)
print(dynamic_excavator_set)
print(np.array(res['var_x']).round(3)) print(np.array(res['var_x']).round(3))
logger.info(f'重运车流:{res["var_x"]} 单位: 吨/时') logger.info(f'重运车流:{res["var_x"]} 单位: 吨/时')
logger.info(dynamic_dump_set)
logger.info(dynamic_excavator_set)
print(dynamic_dump_set)
print(dynamic_excavator_set) print(dynamic_excavator_set)
print(dynamic_dump_set)
print(np.array(res['var_y']).round(3)) print(np.array(res['var_y']).round(3))
logger.info(f'空运车流:{res["var_y"]} 单位: 吨/时') logger.info(f'空运车流:{res["var_y"]} 单位: 吨/时')
......
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