Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
I
integrated-scheduling-v3
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张晓彤
integrated-scheduling-v3
Commits
7fca8604
Commit
7fca8604
authored
Jan 06, 2022
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
reconstruct 01/06
parent
ab8f868e
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
2366 additions
and
1168 deletions
+2366
-1168
algorithm.py
algorithm.py
+299
-0
dispatcher.py
dispatcher.py
+907
-0
dump.py
equipment/dump.py
+15
-12
excavator.py
equipment/excavator.py
+23
-20
truck.py
equipment/truck.py
+61
-59
para_config.py
para_config.py
+557
-50
path_plannner.py
path_plan/path_plannner.py
+21
-13
priority_control.py
path_plan/priority_control.py
+84
-35
realtime_dispatch.py
realtime_dispatch.py
+36
-959
settings.py
settings.py
+24
-18
static_data_process.py
static_data_process.py
+339
-2
No files found.
algorithm.py
0 → 100644
View file @
7fca8604
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/1/5 14:14
# @Author : Opfer
# @Site :
# @File : algorithm.py
# @Software: PyCharm
from
para_config
import
*
class
ScheduleAlg
(
WalkManage
):
""" class for the schedule algorithm.
Description:
根据设备状态计算调度价值
Attribute:
equipment class: truck, excavator, dump, group
"""
def
__init__
(
self
,
dump
,
excavator
,
truck
,
group
):
self
.
_dump
=
dump
self
.
_excavator
=
excavator
self
.
_truck
=
truck
self
.
_group
=
group
# 获取日志器
self
.
logger
=
get_logger
(
"zxt.alg"
)
def
truck_schedule
(
self
,
current_truck
,
alg
):
"""
计算矿卡驶往各目的地的调度价值
:param truck_id: 待调度矿卡uuid
:param alg: 启用的调度算法
:return: 调度价值
"""
if
alg
==
"congestion"
:
transport_value
=
self
.
congestion_schedule
(
current_truck
.
get_truck_id
(),
current_truck
)
elif
alg
==
"traffic_plan"
:
transport_value
=
self
.
traffic_plan_schedule
(
current_truck
)
elif
alg
==
"saturation"
:
transport_value
=
self
.
saturation_schedule
(
current_truck
)
else
:
return
None
return
transport_value
def
congestion_schedule
(
self
,
truck_id
,
current_truck
):
transport_value
=
None
group_id
=
current_truck
.
get_group_id
()
task
=
current_truck
.
get_task
()
trip
=
current_truck
.
get_trip
()
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
if
task
==
-
2
:
################################################ 矿卡启动 ###############################################
try
:
self
.
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
self
.
logger
.
info
(
f
"涉及挖机:{list(self._excavator.excavator_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
try
:
transport_value
=
self
.
_group
.
group_park_to_excavator
[
group_id
]
except
Exception
as
es
:
transport_value
=
np
.
zeros
(
dynamic_excavator_num
)
self
.
logger
.
info
(
es
)
if
task
in
[
0
,
1
,
2
]:
################################################ 矿卡空载 ###############################################
try
:
self
.
logger
.
info
(
"矿卡状态:矿卡空载"
)
self
.
logger
.
info
(
f
"涉及卸载设备:{list(self._dump.dump_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
excavator_index
=
int
(
trip
[
1
])
try
:
transport_value
=
self
.
_group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
except
Exception
as
es
:
transport_value
=
np
.
zeros
(
dynamic_dump_num
)
self
.
logger
.
error
(
es
)
elif
task
in
[
3
,
4
,
5
]:
################################################ 矿卡重载 ###############################################
try
:
self
.
logger
.
info
(
"矿卡状态:矿卡重载"
)
self
.
logger
.
info
(
f
"涉及挖机设备:{list(self._excavator.excavator_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
try
:
# 正常调度
dump_index
=
int
(
trip
[
1
])
transport_value
=
self
.
_group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
except
Exception
as
es
:
transport_value
=
np
.
zeros
(
dynamic_excavator_num
)
self
.
logger
.
info
(
es
)
return
transport_value
def
traffic_plan_schedule
(
self
,
current_truck
):
traffic_value
=
None
truck_id
=
current_truck
.
get_truck_id
()
group_id
=
current_truck
.
get_group_id
()
task
=
current_truck
.
get_task
()
trip
=
current_truck
.
get_trip
()
if
task
in
[
0
,
1
,
2
]:
excavator_index
=
int
(
trip
[
1
])
excavator_id
=
self
.
_excavator
.
excavator_index_to_uuid_dict
[
excavator_index
]
group_excavator_index
=
self
.
_group
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
try
:
# 计算 group actual traffic flow
group_actual_goto_dump_traffic_flow
=
self
.
_group
.
group_actual_goto_dump_traffic_flow
[
group_id
]
# 计算 group actual traffic flow
group_opt_goto_dump_traffic_flow
=
self
.
_group
.
group_opt_goto_dump_traffic_flow
[
group_id
]
self
.
logger
.
info
(
"驶往卸点分组车流"
)
self
.
logger
.
info
(
group_actual_goto_dump_traffic_flow
)
self
.
logger
.
info
(
group_opt_goto_dump_traffic_flow
)
try
:
traffic_value
=
(
group_actual_goto_dump_traffic_flow
[
group_excavator_index
,
:]
+
0.001
)
\
/
(
group_opt_goto_dump_traffic_flow
[
group_excavator_index
,
:]
+
0.001
)
except
Exception
as
es
:
self
.
logger
.
error
(
"error09"
)
self
.
logger
.
error
(
es
)
except
Exception
as
es
:
self
.
logger
.
error
(
"error11"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
info
(
"traffic_value"
)
self
.
logger
.
info
(
traffic_value
)
self
.
logger
.
info
(
"dump_material_bind_modify"
)
self
.
logger
.
info
(
self
.
_truck
.
dump_material_bind_modify
[
self
.
truck_uuid_to_index_dict
[
truck_id
]])
elif
task
in
[
3
,
4
,
5
]:
dump_index
=
int
(
trip
[
1
])
dump_id
=
self
.
_dump
.
dump_uuid_to_index_dict
[
dump_index
]
group_dump_index
=
self
.
_group
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
# 提取group actual traffic flow
group_actual_goto_excavator_traffic_flow
=
self
.
_group
.
group_actual_goto_excavator_traffic_flow
[
group_id
]
# 提取group actual traffic flow
group_opt_goto_excavator_traffic_flow
=
self
.
_group
.
group_opt_goto_excavator_traffic_flow
[
group_id
]
self
.
logger
.
info
(
"驶往挖机分组车流"
)
self
.
logger
.
info
(
group_actual_goto_excavator_traffic_flow
)
self
.
logger
.
info
(
group_opt_goto_excavator_traffic_flow
)
traffic_value
=
(
group_actual_goto_excavator_traffic_flow
[
group_dump_index
,
:]
+
0.001
)
\
/
(
group_opt_goto_excavator_traffic_flow
[
group_dump_index
,
:]
+
0.001
)
# transport_value = (self.actual_goto_excavator_traffic_flow[trip[1], :] + 0.001) \
# / (self.opt_goto_excavator_traffic_flow[trip[1], :] + 0.001)
self
.
logger
.
info
(
"traffic_value"
)
self
.
logger
.
info
(
traffic_value
)
return
traffic_value
def
saturation_schedule
(
self
,
current_truck
):
transport_value
=
None
group_id
=
current_truck
.
get_group_id
()
task
=
current_truck
.
get_task
()
trip
=
current_truck
.
get_trip
()
if
task
==
-
2
:
self
.
logger
.
info
(
"饱和度调度"
)
transport_value
=
self
.
_group
.
group_park_to_excavator
[
group_id
]
excavator_hold_truck
=
self
.
_group
.
update_excavator_hold_truck
(
self
.
_truck
.
excavator_hold_truck_num
)[
group_id
]
actual_flow_to_excavator
=
excavator_hold_truck
*
np
.
mean
(
self
.
_truck
.
payload
)
/
\
self
.
_group
.
group_park_to_excavator
[
group_id
]
.
reshape
(
1
,
-
1
)
.
flatten
()
allow_flow_to_excavator
=
self
.
_group
.
update_allow_flow_to_excavator
()[
group_id
]
saturation_value
=
(
1
-
(
actual_flow_to_excavator
+
0.01
)
/
(
allow_flow_to_excavator
+
0.01
))
/
transport_value
self
.
logger
.
info
(
f
'实际车流 {actual_flow_to_excavator}'
)
# self.logger.info(actual_flow_to_excavator)
self
.
logger
.
info
(
f
'最大车流 {allow_flow_to_excavator}'
)
# self.logger.info(allow_flow_to_excavator)
self
.
logger
.
info
(
f
'行驶成本 {transport_value}'
)
# self.logger.info(transport_value)
self
.
logger
.
info
(
f
'饱和度价值 {saturation_value}'
)
# self.logger.info(saturation_value)
return
saturation_value
if
task
in
[
0
,
1
,
2
]:
self
.
logger
.
info
(
"饱和度调度"
)
excavator_index
=
int
(
trip
[
1
])
transport_value
=
self
.
_group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
.
reshape
(
1
,
-
1
)
dump_hold_truck
=
self
.
_group
.
update_dump_hold_truck
(
self
.
_truck
.
dump_hold_truck_num
)[
group_id
]
actual_flow_to_dump
=
dump_hold_truck
*
self
.
_truck
.
payload
/
\
self
.
_group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
.
reshape
(
1
,
-
1
)
# allow_flow_to_dump = self.dump.dump_strength
allow_flow_to_dump
=
self
.
_group
.
update_allow_flow_to_dump
()[
group_id
]
saturation_value
=
(
1
-
(
actual_flow_to_dump
+
0.01
)
/
(
allow_flow_to_dump
+
0.01
))
/
transport_value
self
.
logger
.
info
(
f
'实际车流 {actual_flow_to_dump}'
)
# self.logger.info(actual_flow_to_excavator)
self
.
logger
.
info
(
f
'最大车流 {allow_flow_to_dump}'
)
# self.logger.info(allow_flow_to_excavator)
self
.
logger
.
info
(
f
'行驶成本 {transport_value}'
)
# self.logger.info(transport_value)
self
.
logger
.
info
(
f
'饱和度价值 {saturation_value}'
)
# self.logger.info(saturation_value)
return
saturation_value
if
task
in
[
3
,
4
,
5
]:
self
.
logger
.
info
(
"饱和度调度"
)
dump_index
=
int
(
trip
[
1
])
transport_value
=
self
.
_group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
.
reshape
(
1
,
-
1
)
excavator_hold_truck
=
self
.
_group
.
update_excavator_hold_truck
(
self
.
_truck
.
excavator_hold_truck_num
)[
group_id
]
actual_flow_to_excavator
=
excavator_hold_truck
*
self
.
_truck
.
payload
/
\
self
.
_group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
.
reshape
(
1
,
-
1
)
allow_flow_to_excavator
=
self
.
_group
.
update_allow_flow_to_excavator
()[
group_id
]
saturation_value
=
(
1
-
actual_flow_to_excavator
/
allow_flow_to_excavator
)
/
transport_value
self
.
logger
.
info
(
f
'实际车流 {actual_flow_to_excavator}'
)
# self.logger.info(actual_flow_to_excavator)
self
.
logger
.
info
(
f
'最大车流 {allow_flow_to_excavator}'
)
# self.logger.info(allow_flow_to_excavator)
self
.
logger
.
info
(
f
'行驶成本 {transport_value}'
)
# self.logger.info(transport_value)
self
.
logger
.
info
(
f
'饱和度价值 {saturation_value}'
)
# self.logger.info(saturation_value)
return
saturation_value
\ No newline at end of file
dispatcher.py
0 → 100644
View file @
7fca8604
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/12/29 11:36
# @Author : Opfer
# @Site :
# @File : dispatcher.py
# @Software: PyCharm
from
traffic_flow.traffic_flow_planner
import
*
from
para_config
import
*
from
group_control.group_control
import
Group
from
path_plan.priority_control
import
PriorityController
from
algorithm
import
ScheduleAlg
class
CurrentTruck
:
def
__init__
(
self
,
truck_id
,
group_id
,
trip
,
task
):
self
.
_truck_id
=
truck_id
self
.
_group_id
=
group_id
self
.
_trip
=
trip
self
.
_task
=
task
def
get_truck_id
(
self
):
return
self
.
_truck_id
def
get_trip
(
self
):
return
self
.
_trip
def
get_task
(
self
):
return
self
.
_task
def
get_group_id
(
self
):
return
self
.
_group_id
class
RuleHandle
:
""" class for the schedule rule handler.
Description:
基于调度规则对调度价值进行修正
Attribute:
equipment class: truck, excavator, dump, group
"""
def
__init__
(
self
,
dump
,
excavator
,
truck
,
group
):
self
.
_dump
=
dump
self
.
_excavator
=
excavator
self
.
_truck
=
truck
self
.
_group
=
group
self
.
_priority_control
=
PriorityController
()
self
.
_schedule_alg
=
ScheduleAlg
(
dump
,
excavator
,
truck
,
group
)
def
filter
(
self
,
current_truck
):
"""
计算调度规则综合影响调度价值结果
:param truck_id: 矿卡uuid
:return:
"""
# 矿卡uuid
truck_id
=
current_truck
.
get_truck_id
()
# 矿卡序号
truck_index
=
self
.
truck
.
truck_uuid_to_index_dict
[
truck_id
]
# 矿卡行程
trip
=
current_truck
.
get_trip
()
# 矿卡任务
task
=
current_truck
.
get_task
()
# 1. 读取路网权重和可通行性
walk_to_excavator_weight
,
walk_to_excavator_weight
,
park_walk_weight
\
=
self
.
_priority_control
.
weighted_walk_calc
()
walk_available
=
self
.
_priority_control
.
walk_available_calc
()
# 2. 读取挖机禁止关系
# excavator_exclude_truck_factor = self._truck.update_truck_excavator_exclude()
#
# excavator_exclude_truck_factor[np.where(excavator_exclude_truck_factor > M / 2)] = 1
#
# excavator_exclude_truck_factor = 1 - excavator_exclude_truck_factor
excavator_exclude_modify
=
self
.
_group
.
group_excavator_exclude_modify
[
truck_id
]
# 3. 读取调度价值
transport_value
=
self
.
_schedule_alg
.
truck_schedule
(
current_truck
,
"congestion"
)
transport_value_norm
=
np
.
max
(
transport_value
)
/
transport_value
transport_value_norm
=
transport_value_norm
*
walk_available
# def route_modify_factor(self, truck_id):
# """
# 规则及权重因子针对某个矿卡的待的各路线的影响
# :param truck_id:
# :return:
# """
# walk_to_excavator_weight, walk_to_excavator_weight, park_walk_weight \
# = self._priority_control.weighted_walk_calc()
# walk_available = self._priority_control.walk_available_calc()
def
truck_walk_weight
(
self
,
current_truck
):
"""
道路权重性针对某个矿卡到的各目的地的影响
:param current_truck:
:return:
"""
walk_to_excavator_weight
,
walk_to_dump_weight
,
park_walk_weight
\
=
self
.
_priority_control
.
weighted_walk_calc
()
if
current_truck
.
get_task
()
==
2
:
return
park_walk_weight
elif
current_truck
.
get_task
()
in
[
0
,
1
,
2
]:
end_excavator
=
int
(
current_truck
.
get_trip
[
1
])
return
walk_to_dump_weight
[
end_excavator
,
:]
elif
current_truck
.
get_trip
()
in
[
3
,
4
,
5
]:
end_dump
=
int
(
current_truck
.
get_trip
[
1
])
return
walk_to_excavator_weight
[
end_dump
,
:]
def
truck_walk_available
(
self
,
current_truck
):
"""
道路通行性针对某个矿卡到的各目的地的影响
:param current_truck: 当前请调矿卡
:return: 矿卡出发地到各目的地道路可通行性
"""
walk_available
=
self
.
_priority_control
.
walk_available_calc
()
if
current_truck
.
get_task
()
==
2
:
return
np
.
ones
(
get_value
(
"excavator_num"
))
elif
current_truck
.
get_task
()
in
[
0
,
1
,
2
]:
end_excavator
=
int
(
current_truck
.
get_trip
[
1
])
return
walk_available
[:,
end_excavator
]
.
reshape
(
1
,
-
1
)
elif
current_truck
.
get_trip
()
in
[
3
,
4
,
5
]:
end_dump
=
int
(
current_truck
.
get_trip
[
1
])
return
walk_available
[
end_dump
,
:]
.
reshape
(
1
,
-
1
)
class
Dispatcher
(
WalkManage
):
""" class for the truck dispatch.
Description:
计算根据矿卡状态计算最佳派车计划
将派车计划写入redis
Attribute:
equipment class: truck, excavator, dump
schedule start time
equipment available time: truck, excavator, dump
"""
def
__init__
(
self
,
dump
,
excavator
,
truck
,
predict_schedule
):
# 调度开始时间
self
.
start_time
=
datetime
.
now
()
# 路径规划对象
self
.
path
=
PathPlanner
()
# 车流对象
self
.
traffic_flow
=
Traffic_flow
(
dump
,
excavator
,
truck
)
# 分组控制对象
self
.
group
=
Group
(
dump
,
excavator
,
truck
,
self
.
traffic_flow
)
# 行程预测对象
self
.
pre_sch
=
predict_schedule
# 设备对象
self
.
dump
=
dump
self
.
excavator
=
excavator
self
.
truck
=
truck
# 调度算法
self
.
_schedule_alg
=
ScheduleAlg
(
dump
,
excavator
,
truck
,
self
.
group
)
# 获取日志器
self
.
logger
=
get_logger
(
"zxt.dispatcher"
)
def
dispatcher_period_update
(
self
):
# 装载映射参数及
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
# 更新卸载设备对象
self
.
dump
.
para_period_update
()
# 更新挖机对象
self
.
excavator
.
para_period_update
()
# 更新矿卡对象
self
.
truck
.
para_period_update
(
self
.
dump
,
self
.
excavator
)
self
.
truck
.
state_period_update
()
# 更新实时车流
self
.
traffic_flow
.
update_actual_traffic_flow
()
# 获取路网加权行驶成本
self
.
cost_to_excavator
,
self
.
cost_to_dump
,
self
.
cost_park_to_excavator
=
self
.
path
.
walk_cost
()
# 调度分组更新
self
.
group
.
period_update
()
def
truck_schedule
(
self
,
truck_id
):
# 规则读取
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
.
disabled
rule4
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
4
)
.
first
()
.
disabled
# 读取优先级设置
excavator_priority_coefficient
=
self
.
excavator
.
excavator_priority_coefficient
excavator_material_priority
=
self
.
excavator
.
excavator_material_priority
# 矿卡序号
truck_index
=
self
.
truck
.
truck_uuid_to_index_dict
[
truck_id
]
# 矿卡行程
trip
=
self
.
truck
.
get_truck_current_trip
()[
truck_index
]
# 矿卡任务
task
=
self
.
truck
.
get_truck_current_task
()[
self
.
truck
.
truck_index_to_uuid_dict
[
truck_index
]]
# 调度分组
group_id
=
self
.
group
.
dispatch_truck_group
[
truck_id
]
# 记录当前调度车辆信息
current_truck
=
CurrentTruck
(
truck_id
,
group_id
,
trip
,
task
)
if
truck_id
not
in
self
.
group
.
dispatch_truck_group
:
self
.
logger
.
error
(
"无该矿卡"
)
return
-
1
target
=
0
# # 车流计算
# # 驶往卸载设备的实际车流
# actual_goto_dump_traffic_flow = self.traffic_flow.actual_goto_dump_traffic_flow
#
# # 驶往挖机的实际车流
# actual_goto_excavator_traffic_flow = self.traffic_flow.actual_goto_excavator_traffic_flow
#
# # 计算理想车流
# opt_goto_dump_traffic_flow, opt_goto_excavator_traffic_flow = traffic_flow_plan(self.truck)
truck_uuid_to_name_dict
=
get_value
(
"truck_uuid_to_name_dict"
)
self
.
logger
.
info
(
f
"========== 调度矿卡 {truck_id} {truck_index} {truck_uuid_to_name_dict[truck_id]} =========="
)
if
task
==
-
2
:
################################################ 矿卡启动 ###############################################
try
:
self
.
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
self
.
logger
.
info
(
"矿卡行程:无"
)
self
.
logger
.
info
(
f
"涉及挖机:{list(self.excavator.excavator_uuid_to_index_dict.keys())}"
)
if
truck_id
in
self
.
truck
.
truck_material_bind
:
self
.
logger
.
info
(
f
'物料类型 {self.truck.truck_material_bind[truck_id]}'
)
self
.
logger
.
info
(
f
'挖机设备优先级 {excavator_priority_coefficient}'
)
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
# try:
# 1. 绑定调度
if
truck_id
in
self
.
truck
.
truck_excavator_bind
:
self
.
logger
.
info
(
"绑定调度"
)
target
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
truck
.
truck_excavator_bind
[
truck_id
]]
# 2. 正常调度
elif
rule3
and
rule4
:
self
.
logger
.
info
(
"正常调度"
)
transport_value
=
self
.
_schedule_alg
.
truck_schedule
(
current_truck
,
"congestion"
)
self
.
logger
.
info
(
f
'行驶成本-含拥堵度的路径长度 {transport_value}'
)
excavator_exclude_modify
=
self
.
group
.
group_excavator_exclude_modify
[
truck_id
]
self
.
logger
.
info
(
f
'挖机设备禁止因子 {excavator_exclude_modify}'
)
target
=
np
.
argmin
(
transport_value
+
excavator_exclude_modify
)
target
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
self
.
logger
.
info
(
f
'行驶成本-含拥堵度的路径长度 {self.excavator.excavator_uuid_to_index_dict}'
)
# 3. 启用饱和度调度
else
:
self
.
logger
.
info
(
"饱和度调度"
)
saturation_value
=
self
.
_schedule_alg
.
saturation_schedule
(
current_truck
)
self
.
logger
.
info
(
f
'驶往挖机饱和度价值 {saturation_value}'
)
target
=
np
.
argmax
(
saturation_value
)
target
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
self
.
logger
.
info
(
self
.
excavator
.
excavator_uuid_to_index_dict
)
self
.
logger
.
info
(
self
.
group
.
group_excavator_uuid_to_index_dict
)
excavator_uuid_to_name_dict
=
get_value
(
"excavator_uuid_to_name_dict"
)
self
.
logger
.
info
(
f
"目的地:{excavator_uuid_to_name_dict[self.excavator.excavator_index_to_uuid_dict[target]]}"
)
if
task
in
[
0
,
1
,
2
]:
################################################ 矿卡空载 ###############################################
try
:
self
.
logger
.
info
(
"矿卡状态:矿卡空载"
)
self
.
logger
.
info
(
f
"涉及卸载设备:{list(self.dump.dump_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
# 日志记录部分
try
:
self
.
logger
.
info
(
f
'挖机id: {self.excavator.excavator_uuid_to_index_dict}'
)
self
.
logger
.
info
(
f
'卸点id: {self.dump.dump_uuid_to_index_dict}'
)
self
.
logger
.
info
(
f
'空载trip {trip}'
)
if
truck_id
in
self
.
truck
.
truck_material_bind
:
self
.
logger
.
info
(
f
'物料类型 {self.truck.truck_material_bind[truck_id]}'
)
self
.
logger
.
info
(
f
'驶往卸点的运输成本 {self.cost_to_dump}'
)
self
.
logger
.
info
(
"卸点物料修正"
)
self
.
logger
.
info
(
self
.
truck
.
dump_material_bind_modify
)
except
Exception
as
es
:
self
.
logger
.
info
(
"矿卡行程信息异常"
)
self
.
logger
.
info
(
es
)
# 1. 绑定调度
if
truck_id
in
self
.
truck
.
truck_dump_bind
:
self
.
logger
.
info
(
"矿卡已绑定卸点"
)
unload_area_uuid_to_index_dict
=
get_value
(
"unload_area_uuid_to_index_dict"
)
bind_unload_area_id
=
self
.
truck
.
truck_dump_bind
[
truck_id
]
for
key
,
value
in
self
.
dump
.
dump_index_to_unload_area_index_dict
.
items
():
if
value
==
unload_area_uuid_to_index_dict
[
bind_unload_area_id
]:
target
=
key
break
# 2. 正常调度
elif
rule3
and
rule4
:
transport_value
=
self
.
_schedule_alg
.
truck_schedule
(
current_truck
,
"congestion"
)
self
.
logger
.
info
(
f
'行驶成本-含拥堵度的路径长度 {transport_value}'
)
dump_material_bind_modify
=
self
.
group
.
group_dump_material_bind_modify
[
truck_id
]
self
.
logger
.
info
(
f
'卸点物料禁止因子 {dump_material_bind_modify}'
)
target
=
np
.
argmin
(
transport_value
.
T
+
dump_material_bind_modify
)
target
=
self
.
dump
.
dump_uuid_to_index_dict
[
self
.
group
.
group_dump_index_to_uuid_dict
[
group_id
][
target
]]
# 3. 饱和度调度
else
:
self
.
logger
.
info
(
"饱和度调度"
)
# saturation_value = self._schedule_alg.saturation_schedule(current_truck)
saturation_value
=
self
.
_schedule_alg
.
truck_schedule
(
current_truck
,
"saturation"
)
self
.
logger
.
info
(
f
'驶往卸点饱和度价值 {saturation_value}'
)
target
=
np
.
argmax
(
saturation_value
)
target
=
self
.
dump
.
dump_uuid_to_index_dict
[
self
.
group
.
group_dump_index_to_uuid_dict
[
group_id
][
target
]]
dump_uuid_to_name_dict
=
get_value
(
"dump_uuid_to_name_dict"
)
self
.
logger
.
info
(
f
"目的地:{dump_uuid_to_name_dict[self.dump.dump_index_to_uuid_dict[target]]}"
)
elif
task
in
[
3
,
4
,
5
]:
################################################ 矿卡重载 ###############################################
try
:
self
.
logger
.
info
(
"矿卡状态:矿卡重载"
)
self
.
logger
.
info
(
f
"涉及挖机设备:{list(self.excavator.excavator_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
try
:
self
.
logger
.
info
(
"挖机id:"
)
self
.
logger
.
info
(
self
.
excavator
.
excavator_uuid_to_index_dict
)
self
.
logger
.
info
(
"卸点id:"
)
self
.
logger
.
info
(
self
.
dump
.
dump_uuid_to_index_dict
)
self
.
logger
.
info
(
"重载trip"
)
self
.
logger
.
info
(
trip
)
self
.
logger
.
info
(
"物料类型"
)
if
truck_id
in
self
.
truck
.
truck_material_bind
:
self
.
logger
.
info
(
self
.
truck
.
truck_material_bind
[
truck_id
])
self
.
logger
.
info
(
"驶往挖机的运输成本"
)
self
.
logger
.
info
(
self
.
cost_to_excavator
)
self
.
logger
.
info
(
"挖机物料修正"
)
self
.
logger
.
info
(
self
.
truck
.
excavator_material_bind_modify
)
self
.
logger
.
info
(
"挖机优先级修正"
)
self
.
logger
.
info
(
self
.
excavator
.
excavator_priority_coefficient
)
except
Exception
as
es
:
self
.
logger
.
info
(
"矿卡行程信息异常"
)
self
.
logger
.
info
(
es
)
# 计算目的地
try
:
# 1. 绑定调度
if
truck_id
in
self
.
truck
.
truck_excavator_bind
:
target
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
truck
.
truck_excavator_bind
[
truck_id
]]
self
.
logger
.
info
(
"矿卡已绑定挖机"
)
self
.
logger
.
info
(
"cost_to_excavator"
)
self
.
logger
.
info
(
self
.
cost_to_excavator
)
# 2 正常调度
elif
rule3
and
rule4
:
self
.
logger
.
info
(
"正常调度"
)
transport_value
=
self
.
_schedule_alg
.
truck_schedule
(
current_truck
,
"congestion"
)
self
.
logger
.
info
(
f
'行驶成本-含拥堵度的路径长度 {transport_value}'
)
excavator_exclude_modify
=
self
.
group
.
group_excavator_exclude_modify
[
truck_id
]
self
.
logger
.
info
(
f
'挖机设备禁止因子 {excavator_exclude_modify}'
)
self
.
logger
.
info
(
transport_value
)
target
=
np
.
argmin
(
transport_value
.
T
+
excavator_exclude_modify
)
target
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
# 3. 饱和度调度
else
:
self
.
logger
.
info
(
"饱和度调度"
)
# saturation_value = self._schedule_alg.saturation_schedule(current_truck)
saturation_value
=
self
.
_schedule_alg
.
truck_schedule
(
current_truck
,
"saturation"
)
self
.
logger
.
info
(
f
'驶往卸点饱和度价值 {saturation_value}'
)
target
=
np
.
argmax
(
saturation_value
)
target
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
except
Exception
as
es
:
self
.
logger
.
info
(
"trip出错1"
)
self
.
logger
.
info
(
es
)
excavator_uuid_to_name_dict
=
get_value
(
"excavator_uuid_to_name_dict"
)
self
.
logger
.
info
(
f
"目的地:{excavator_uuid_to_name_dict[self.excavator.excavator_index_to_uuid_dict[target]]}"
)
self
.
logger
.
info
(
"=========================================================="
)
print
(
target
)
# except Exception as es:
# self.logger.error("truck_schedule,error")
# self.logger.error(es)
return
target
def
schedule_construct
(
self
):
global
truck
global
excavator
global
dump
# self.reset()
# try:
# 读取所需信息
dynamic_truck_num
=
get_value
(
"dynamic_truck_num"
)
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
# Seq初始化
Seq
=
[[
truck_current_trip
[
i
][
1
],
-
1
]
for
i
in
range
(
dynamic_truck_num
)]
# 获取矿卡最早可用时间
truck_avl_time
=
self
.
pre_sch
.
get_truck_avl_time
()
# 根据矿卡最早可用时间顺序进行规划
temp
=
copy
.
deepcopy
(
truck_avl_time
)
-
self
.
truck
.
truck_priority
try
:
# 没有启动的矿卡加上一个很大的值,降低其优先级
for
i
in
range
(
dynamic_truck_num
):
task
=
truck_current_task
[
self
.
truck
.
truck_index_to_uuid_dict
[
i
]]
if
task
==
-
2
:
temp
[
i
]
=
temp
[
i
]
+
M
except
Exception
as
es
:
self
.
logger
.
error
(
"矿卡排序启动异常"
)
self
.
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:
# 获取矿卡id
try
:
truck_id
=
self
.
truck
.
truck_index_to_uuid_dict
[
truck_index
]
except
Exception
as
es
:
self
.
logger
.
error
(
'error01'
)
self
.
logger
.
error
(
es
)
# 判断矿卡是否禁用
if
truck_id
in
self
.
truck
.
update_truck_disable_list
():
continue
try
:
# 获取矿卡当前任务
task
=
truck_current_task
[
self
.
truck
.
truck_index_to_uuid_dict
[
truck_index
]]
except
Exception
as
es
:
self
.
logger
.
error
(
'error02'
)
self
.
logger
.
error
(
es
)
try
:
# 矿卡结束当前派车计划后的目的地
end_eq_index
=
truck_current_trip
[
truck_index
][
1
]
except
Exception
as
es
:
self
.
logger
.
error
(
'error03'
)
self
.
logger
.
error
(
es
)
# try:
# 调用调度函数,得到最优目的地序号
target_eq_index
=
self
.
truck_schedule
(
self
.
truck
.
truck_index_to_uuid_dict
[
truck_index
])
# except Exception as es:
# self.logger.error('error04')
# self.logger.error(es)
# self.logger.error("truck_index,uuid")
# self.logger.error(truck_index)
# self.logger.error(self.truck.truck_index_to_uuid_dict[truck_index])
# self.logger.("target_eq_index")
# self.logger.error(target_eq_index)
try
:
# 写入Seq序列
Seq
[
truck_index
][
1
]
=
target_eq_index
except
Exception
as
es
:
self
.
logger
.
error
(
'error05'
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
"target_eq_index"
)
self
.
logger
.
error
(
target_eq_index
)
self
.
logger
.
error
(
"target_eq_index,type"
)
self
.
logger
.
error
(
type
(
target_eq_index
))
# except Exception as es:
# self.logger.error("truck,task,end_eq_index,error")
# self.logger.error(es)
try
:
group_id
=
self
.
group
.
dispatch_truck_group
[
truck_id
]
except
Exception
as
es
:
self
.
logger
.
error
(
"非动态调度矿卡"
)
self
.
logger
.
error
(
es
)
for
i
in
range
(
len
(
Seq
)):
try
:
try
:
truck_id
=
self
.
truck
.
truck_index_to_uuid_dict
[
i
]
group_id
=
self
.
group
.
dispatch_truck_group
[
truck_id
]
record
=
{
"truckId"
:
self
.
truck
.
truck_index_to_uuid_dict
[
i
]}
task
=
self
.
truck
.
get_truck_current_task
()[
self
.
truck
.
truck_index_to_uuid_dict
[
i
]]
except
Exception
as
es
:
self
.
logger
.
error
(
"truck_id,group_id,record,task出错"
)
self
.
logger
.
error
(
es
)
if
task
in
empty_task_set
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
self
.
dump
.
dump_index_to_uuid_dict
[
Seq
[
i
][
1
]],
exactor_id
=
self
.
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
0
]],
truck_id
=
truck_id
,
group_id
=
group_id
,
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"
)
redis5
.
set
(
self
.
truck
.
truck_index_to_uuid_dict
[
i
],
str
(
json
.
dumps
(
record
)))
elif
task
in
heavy_task_set
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
self
.
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
dump_id
=
self
.
dump
.
dump_index_to_uuid_dict
[
Seq
[
i
][
0
]],
truck_id
=
truck_id
,
group_id
=
group_id
,
isauto
=
1
,
isdeleted
=
0
,
)
.
first
())
record
[
"exactorId"
]
=
self
.
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"
)
redis5
.
set
(
self
.
truck
.
truck_index_to_uuid_dict
[
i
],
str
(
json
.
dumps
(
record
)))
elif
task
==
-
2
:
try
:
try
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
self
.
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
truck_id
=
truck_id
,
group_id
=
group_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
())
print
(
"item"
)
print
(
item
.
id
,
item
.
truck_id
,
item
.
exactor_id
,
item
.
dump_id
)
except
Exception
as
es
:
self
.
logger
.
error
(
"task-2,error01"
)
try
:
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"
)
redis5
.
set
(
self
.
truck
.
truck_index_to_uuid_dict
[
i
],
str
(
json
.
dumps
(
record
)))
except
Exception
as
es
:
self
.
logger
.
error
(
"task-2,error02"
)
self
.
logger
.
error
(
es
)
except
Exception
as
es
:
self
.
logger
.
error
(
"task为-2时error"
)
self
.
logger
.
error
(
es
)
else
:
pass
except
Exception
as
es
:
self
.
logger
.
error
(
"调度结果写入异常-redis写入异常"
)
self
.
logger
.
error
(
f
"调度结果:{Seq}"
)
self
.
logger
.
error
(
es
)
for
i
in
range
(
dynamic_truck_num
):
print
(
"dispatch_setting:"
)
print
(
redis5
.
get
(
self
.
truck
.
truck_index_to_uuid_dict
[
i
]))
# except Exception as es:
# self.logger.error("更新不及时-1")
# self.logger.error(es)
return
Seq
class
PreSchedule
:
""" class for the prediction of equipments' trip.
Description:
Calculate and update the prediction item.
复杂处理所有预测项的计算与更新
基于矿卡最近一次装卸载时间预测其抵达目的地时间
根据矿卡请求队列及抵达信息,计算设备最早可用时间
Attribute:
equipment class: truck, excavator, dump
schedule start time
equipment available time: truck, excavator, dump
"""
def
__init__
(
self
,
truck
,
excavator
,
dump
):
# 设备对象域
self
.
truck
=
truck
self
.
excavator
=
excavator
self
.
dump
=
dump
# 调度开始时间
self
.
start_time
=
datetime
.
now
()
# 真实设备可用时间
self
.
truck_reach_dump
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
truck_reach_excavator
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
excavator_avl_time
=
np
.
zeros
(
self
.
excavator
.
get_excavator_num
())
self
.
dump_avl_time
=
np
.
zeros
(
self
.
dump
.
get_dump_num
())
# 卡车完成装载及卸载时间(矿卡可用时间)
self
.
truck_avl_time
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
def
update_truck_reach_time
(
self
):
"""
更新矿卡预计抵达目的地时间
:return:
excavator_avl_ls: (list) 驶往挖机的各矿卡抵达时间
dump_avl_ls: (list) 驶往卸点的各矿卡抵达时间
"""
try
:
dynamic_excavator_num
=
self
.
excavator
.
get_excavator_num
()
dumps
=
self
.
dump
.
get_dump_num
()
trucks
=
self
.
truck
.
get_truck_num
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
truck_reach_excavator
=
self
.
truck
.
get_truck_reach_excavator
()
truck_reach_dump
=
self
.
truck
.
get_truck_reach_dump
()
excavator_avl_ls
=
[[]
for
_
in
range
(
dynamic_excavator_num
)]
dump_avl_ls
=
[[]
for
_
in
range
(
dumps
)]
for
i
in
range
(
trucks
):
task
=
truck_current_task
[
self
.
truck
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
truck_current_trip
[
i
][
1
]
if
task
in
[
0
,
1
]:
reach_time
=
truck_reach_excavator
[
i
]
excavator_avl_ls
[
end_area_index
]
.
append
(
[
reach_time
,
i
,
end_area_index
]
)
elif
task
in
[
3
,
4
]:
reach_time
=
truck_reach_dump
[
i
]
dump_avl_ls
[
end_area_index
]
.
append
([
reach_time
,
i
,
end_area_index
])
elif
task
==
-
2
:
self
.
truck_avl_time
[
i
]
=
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
except
Exception
as
es
:
self
.
logger
.
error
(
"矿卡预计抵达时间计算异常"
)
self
.
logger
.
error
(
es
)
return
[],
[]
return
excavator_avl_ls
,
dump_avl_ls
def
update_excavator_avl_time
(
self
,
excavator_avl_ls
):
"""
更新挖机预计可用时间
:param
excavator_avl_ls: (list) 驶往挖机的各矿卡抵达时间
:return:
excavator_avl_time: (array) 各挖机完成所有已分配矿卡装载的时间
"""
# 初始化挖机可用时间
self
.
excavator_avl_time
=
np
.
full
(
get_value
(
"dynamic_excavator_num"
),
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
),
)
loading_time
=
self
.
excavator
.
get_loading_time
()
loading_task_time
=
self
.
excavator
.
get_loading_task_time
()
try
:
now
=
float
(
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
)
for
reach_ls
in
excavator_avl_ls
:
if
len
(
reach_ls
)
!=
0
:
reach_ls
=
np
.
array
(
reach_ls
)
tmp
=
reach_ls
[
np
.
lexsort
(
reach_ls
[:,
::
-
1
]
.
T
)]
for
i
in
range
(
len
(
tmp
)):
excavator_index
=
int
(
tmp
[
i
][
2
])
self
.
excavator_avl_time
[
excavator_index
]
=
(
max
(
tmp
[
i
][
0
],
self
.
excavator_avl_time
[
excavator_index
])
+
loading_task_time
[
excavator_index
]
)
self
.
truck_avl_time
[
int
(
tmp
[
i
][
1
])
]
=
self
.
excavator_avl_time
[
excavator_index
]
# # 若挖机可用时间严重偏离,进行修正
# if abs(self.excavator_avl_time[excavator_index] - now) > 60:
# self.truck_avl_time[int(tmp[i][1])] = now
# if abs(self.excavator_avl_time[excavator_index] - now) > 60:
# self.excavator_avl_time[excavator_index] = now
except
Exception
as
es
:
self
.
logger
.
error
(
"挖机可用时间计算异常"
)
self
.
logger
.
error
(
es
)
return
self
.
excavator_avl_time
def
update_dump_avl_time
(
self
,
dump_avl_ls
):
"""
更新卸载设备预计可用时间
:param
dump_avl_ls: (list) 驶往卸点的各矿卡抵达时间
:return:
dump_avl_time: (array) 各卸点完成所有已分配矿卡卸载的时间
"""
dynamic_dump_num
=
self
.
dump
.
get_dump_num
()
# 初始化卸载设备可用时间
self
.
dump_avl_time
=
np
.
full
(
dynamic_dump_num
,
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
),
)
unloading_time
=
self
.
dump
.
get_unloading_time
()
unloading_task_time
=
self
.
dump
.
get_unloading_task_time
()
try
:
now
=
float
(
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
)
for
reach_ls
in
dump_avl_ls
:
if
len
(
reach_ls
)
!=
0
:
reach_ls
=
np
.
array
(
reach_ls
)
tmp
=
reach_ls
[
np
.
lexsort
(
reach_ls
[:,
::
-
1
]
.
T
)]
for
i
in
range
(
len
(
tmp
)):
dump_index
=
int
(
tmp
[
i
][
2
])
self
.
dump_avl_time
[
dump_index
]
=
(
max
(
tmp
[
i
][
0
],
self
.
dump_avl_time
[
dump_index
])
+
unloading_task_time
[
dump_index
]
)
self
.
truck_avl_time
[
int
(
tmp
[
i
][
1
])
]
=
self
.
dump_avl_time
[
dump_index
]
# # 若卸载设备可用时间严重偏离,进行修正
# if abs(self.dump_avl_time[dump_index] - now) > 60:
# self.dump_avl_time[dump_index] = now
# if abs(self.truck_avl_time[int(tmp[i][1])] - now) > 60:
# self.truck_avl_time[int(tmp[i][1])] = now
except
Exception
as
es
:
self
.
logger
.
error
(
"卸载设备可用时间计算异常"
)
self
.
logger
.
error
(
es
)
return
self
.
dump_avl_time
def
_reset
(
self
):
"""
重置设备可用时间
:return:
"""
# 真实设备可用时间
self
.
truck_reach_dump
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
truck_reach_excavator
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
excavator_avl_time
=
np
.
zeros
(
self
.
excavator
.
get_excavator_num
())
self
.
dump_avl_time
=
np
.
zeros
(
self
.
dump
.
get_dump_num
())
# 卡车完成装载及卸载时间(矿卡可用时间)
self
.
truck_avl_time
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
def
get_dump_avl_time
(
self
):
"""
获取卸载点最早可用时间
:return:
dump_avl_time: (array) 各卸点完成所有已分配矿卡卸载的时间
"""
self
.
_reset
()
excavator_avl_ls
,
dump_avl_ls
=
self
.
update_truck_reach_time
()
dump_avl_time
=
self
.
update_dump_avl_time
(
dump_avl_ls
)
return
dump_avl_time
def
get_excavator_avl_time
(
self
):
"""
获取挖机最早可用时间
:return:
excavator_avl_time: (array) 各挖机完成所有已分配矿卡装载的时间
"""
self
.
_reset
()
excavator_avl_ls
,
dump_avl_ls
=
self
.
update_truck_reach_time
()
return
self
.
update_excavator_avl_time
(
excavator_avl_ls
)
def
get_truck_avl_time
(
self
):
"""
获取矿卡最早可用时间
:return:
truck_avl_time: (array) 各矿卡完成当前装载或卸载任务的时间
"""
self
.
_reset
()
excavator_avl_ls
,
dump_avl_ls
=
self
.
update_truck_reach_time
()
self
.
update_excavator_avl_time
(
excavator_avl_ls
)
self
.
update_dump_avl_time
(
dump_avl_ls
)
return
self
.
truck_avl_time
equipment/dump.py
View file @
7fca8604
...
@@ -36,6 +36,9 @@ class DumpInfo(WalkManage):
...
@@ -36,6 +36,9 @@ class DumpInfo(WalkManage):
self
.
period_map_para_load
()
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
self
.
period_walk_para_load
()
# 日志器
self
.
logger
=
get_logger
(
"zxt.dump"
)
# 参数初始化
# 参数初始化
self
.
para_period_update
()
self
.
para_period_update
()
...
@@ -83,8 +86,8 @@ class DumpInfo(WalkManage):
...
@@ -83,8 +86,8 @@ class DumpInfo(WalkManage):
# ave_unload_time / unload_count
# ave_unload_time / unload_count
# )
# )
# except Exception as es:
# except Exception as es:
# logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
#
self.
logger.error(f"卸载设备 {dump_id} 卸载时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
#
self.
logger.error(es)
self
.
unloading_time
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
5.00
self
.
unloading_time
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
5.00
# print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]])
# print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]])
...
@@ -110,8 +113,8 @@ class DumpInfo(WalkManage):
...
@@ -110,8 +113,8 @@ class DumpInfo(WalkManage):
# query.exit_entrance_time / query.exit_entrance_count
# query.exit_entrance_time / query.exit_entrance_count
# )
# )
# except Exception as es:
# except Exception as es:
# logger.error(f"卸载设备 {dump_id} 出入场时间信息缺失, 已设为默认值(1min)")
#
self.
logger.error(f"卸载设备 {dump_id} 出入场时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
#
self.
logger.error(es)
self
.
entrance_time
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
0.50
self
.
entrance_time
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
0.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
...
@@ -123,8 +126,8 @@ class DumpInfo(WalkManage):
...
@@ -123,8 +126,8 @@ class DumpInfo(WalkManage):
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
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"无动态派车计划可用"
)
self
.
logger
.
error
(
"无动态派车计划可用"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
def
update_dump_priority
(
self
):
def
update_dump_priority
(
self
):
self
.
dump_priority_coefficient
=
np
.
ones
(
self
.
dynamic_dump_num
)
self
.
dump_priority_coefficient
=
np
.
ones
(
self
.
dynamic_dump_num
)
...
@@ -135,14 +138,14 @@ class DumpInfo(WalkManage):
...
@@ -135,14 +138,14 @@ class DumpInfo(WalkManage):
item
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
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
self
.
dump_priority_coefficient
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
+=
item
.
Priority
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"无动态派车计划可用"
)
self
.
logger
.
error
(
"无动态派车计划可用"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
def
update_unload_ability
(
self
):
def
update_unload_ability
(
self
):
try
:
try
:
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
if
not
rule3
.
disabled
:
if
not
rule3
.
disabled
:
for
dump_index
in
range
(
dynamic_dump_num
):
for
dump_index
in
range
(
self
.
dynamic_dump_num
):
unload_area_id
=
unload_area_index_to_uuid_dict
[
self
.
dump_index_to_unload_area_index_dict
[
dump_index
]]
unload_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
unload_ability
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
.
UnloadAbililty
...
@@ -154,8 +157,8 @@ class DumpInfo(WalkManage):
...
@@ -154,8 +157,8 @@ class DumpInfo(WalkManage):
self
.
dump_strength
=
np
.
full
(
self
.
dynamic_dump_num
,
5000
)
self
.
dump_strength
=
np
.
full
(
self
.
dynamic_dump_num
,
5000
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
logger
.
error
(
"卸载点卸载信息读取异常"
)
self
.
logger
.
error
(
"卸载点卸载信息读取异常"
)
def
reset
(
self
):
def
reset
(
self
):
# 卸载设备数量
# 卸载设备数量
...
@@ -181,7 +184,7 @@ class DumpInfo(WalkManage):
...
@@ -181,7 +184,7 @@ class DumpInfo(WalkManage):
# print("Dump update!")
# print("Dump update!")
logger
.
info
(
"Dump update!"
)
self
.
logger
.
info
(
"Dump update!"
)
# 装载周期参数
# 装载周期参数
self
.
period_map_para_load
()
self
.
period_map_para_load
()
...
...
equipment/excavator.py
View file @
7fca8604
...
@@ -40,6 +40,9 @@ class ExcavatorInfo(WalkManage):
...
@@ -40,6 +40,9 @@ class ExcavatorInfo(WalkManage):
self
.
period_map_para_load
()
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
self
.
period_walk_para_load
()
# 日志器
self
.
logger
=
get_logger
(
"zxt.excavator"
)
# 参数初始化
# 参数初始化
self
.
para_period_update
()
self
.
para_period_update
()
...
@@ -77,12 +80,12 @@ class ExcavatorInfo(WalkManage):
...
@@ -77,12 +80,12 @@ class ExcavatorInfo(WalkManage):
# ave_load_time / load_count
# ave_load_time / load_count
# )
# )
# except Exception as es:
# except Exception as es:
# logger.error(f"挖机 {excavator_id} 装载时间信息缺失, 已设为默认值(1min)")
#
self.
logger.error(f"挖机 {excavator_id} 装载时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
#
self.
logger.error(es)
logger
.
info
(
"loading_time"
)
self
.
logger
.
info
(
"loading_time"
)
logger
.
info
(
self
.
loading_time
)
self
.
logger
.
info
(
self
.
loading_time
)
logger
.
info
(
"excavator_uuid_to_index_dict"
)
self
.
logger
.
info
(
"excavator_uuid_to_index_dict"
)
logger
.
info
(
self
.
excavator_uuid_to_index_dict
)
self
.
logger
.
info
(
self
.
excavator_uuid_to_index_dict
)
self
.
loading_time
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
5.00
self
.
loading_time
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
5.00
# 更新挖机设备出入时间
# 更新挖机设备出入时间
...
@@ -108,8 +111,8 @@ class ExcavatorInfo(WalkManage):
...
@@ -108,8 +111,8 @@ class ExcavatorInfo(WalkManage):
# self.excavator_uuid_to_index_dict[excavator_id]
# self.excavator_uuid_to_index_dict[excavator_id]
# ] = float(query.exit_entrance_time / query.exit_entrance_count)
# ] = float(query.exit_entrance_time / query.exit_entrance_count)
# except Exception as es:
# except Exception as es:
# logger.error(f"挖机设备 {excavator_id} 出入场时间信息缺失, 已设为默认值(1min)")
#
self.
logger.error(f"挖机设备 {excavator_id} 出入场时间信息缺失, 已设为默认值(1min)")
# logger.error(es)
#
self.
logger.error(es)
self
.
entrance_time
[
self
.
entrance_time
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]
self
.
excavator_uuid_to_index_dict
[
excavator_id
]
]
=
0.50
]
=
0.50
...
@@ -128,25 +131,25 @@ class ExcavatorInfo(WalkManage):
...
@@ -128,25 +131,25 @@ class ExcavatorInfo(WalkManage):
return
loading_task_time
return
loading_task_time
def
update_excavator_material
(
self
):
def
update_excavator_material
(
self
):
logger
.
info
(
"self.dynamic_excavator_set"
)
self
.
logger
.
info
(
"self.dynamic_excavator_set"
)
logger
.
info
(
self
.
dynamic_excavator_set
)
self
.
logger
.
info
(
self
.
dynamic_excavator_set
)
for
excavator_id
in
self
.
dynamic_excavator_set
:
for
excavator_id
in
self
.
dynamic_excavator_set
:
try
:
try
:
load_area_id
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
excavator_id
,
isdeleted
=
0
,
isauto
=
1
)
.
first
()
.
load_area_id
load_area_id
=
session_mysql
.
query
(
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
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
warning
(
es
)
self
.
logger
.
warning
(
es
)
def
update_excavator_priority
(
self
):
def
update_excavator_priority
(
self
):
logger
.
info
(
"dynamic_excavator_set"
)
self
.
logger
.
info
(
"dynamic_excavator_set"
)
logger
.
info
(
self
.
dynamic_excavator_set
)
self
.
logger
.
info
(
self
.
dynamic_excavator_set
)
for
excavator_id
in
get_value
(
"dynamic_excavator_set"
):
for
excavator_id
in
get_value
(
"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
()
logger
.
info
(
"excavator_priority_coefficient"
)
self
.
logger
.
info
(
"excavator_priority_coefficient"
)
logger
.
info
(
self
.
excavator_priority_coefficient
)
self
.
logger
.
info
(
self
.
excavator_priority_coefficient
)
self
.
excavator_priority_coefficient
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
item
.
priority
+
1
self
.
excavator_priority_coefficient
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
item
.
priority
+
1
# 物料优先级控制
# 物料优先级控制
...
@@ -180,8 +183,8 @@ class ExcavatorInfo(WalkManage):
...
@@ -180,8 +183,8 @@ class ExcavatorInfo(WalkManage):
self
.
excavator_strength
=
np
.
full
(
self
.
dynamic_excavator_num
,
5000
)
self
.
excavator_strength
=
np
.
full
(
self
.
dynamic_excavator_num
,
5000
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
logger
.
error
(
"挖机装载信息信息读取异常"
)
self
.
logger
.
error
(
"挖机装载信息信息读取异常"
)
def
reset
(
self
):
def
reset
(
self
):
...
@@ -208,12 +211,12 @@ class ExcavatorInfo(WalkManage):
...
@@ -208,12 +211,12 @@ class ExcavatorInfo(WalkManage):
self
.
reset
()
self
.
reset
()
logger
.
info
(
"Excavator update!"
)
self
.
logger
.
info
(
"Excavator update!"
)
rule7
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
7
)
.
first
()
.
disabled
rule7
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
7
)
.
first
()
.
disabled
logger
.
info
(
"物料优先级规则"
)
self
.
logger
.
info
(
"物料优先级规则"
)
logger
.
info
(
rule7
)
self
.
logger
.
info
(
rule7
)
# 装载周期参数
# 装载周期参数
self
.
period_map_para_load
()
self
.
period_map_para_load
()
...
...
equipment/truck.py
View file @
7fca8604
...
@@ -11,9 +11,7 @@ from equipment.dump import DumpInfo
...
@@ -11,9 +11,7 @@ from equipment.dump import DumpInfo
from
equipment.excavator
import
ExcavatorInfo
from
equipment.excavator
import
ExcavatorInfo
from
typing
import
List
from
typing
import
List
# 引入对象
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
# 矿卡设备类
# 矿卡设备类
...
@@ -76,6 +74,8 @@ class TruckInfo(WalkManage):
...
@@ -76,6 +74,8 @@ class TruckInfo(WalkManage):
# 初始化读取映射及路网
# 初始化读取映射及路网
self
.
period_map_para_load
()
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
self
.
period_walk_para_load
()
# 日志
self
.
logger
=
get_logger
(
"zxt.truck"
)
# 初始化读取参数
# 初始化读取参数
self
.
para_period_update
(
dump
,
excavator
)
self
.
para_period_update
(
dump
,
excavator
)
# # 矿卡所属group
# # 矿卡所属group
...
@@ -151,11 +151,11 @@ class TruckInfo(WalkManage):
...
@@ -151,11 +151,11 @@ class TruckInfo(WalkManage):
truck_name_to_uuid_dict
[
item
]
truck_name_to_uuid_dict
[
item
]
]
=
currentTask
]
=
currentTask
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"读取矿卡任务异常-reids读取异常"
)
self
.
logger
.
error
(
"读取矿卡任务异常-reids读取异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
logger
.
info
(
"矿卡当前任务:"
)
self
.
logger
.
info
(
"矿卡当前任务:"
)
logger
.
info
(
self
.
truck_current_task
)
self
.
logger
.
info
(
self
.
truck_current_task
)
# logger.info("device_name_set,大小")
# logger.info("device_name_set,大小")
# logger.info(len(device_name_set))
# logger.info(len(device_name_set))
...
@@ -205,19 +205,19 @@ class TruckInfo(WalkManage):
...
@@ -205,19 +205,19 @@ class TruckInfo(WalkManage):
self
.
last_load_time
[
item
]
=
datetime
.
now
()
self
.
last_load_time
[
item
]
=
datetime
.
now
()
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastLoadTime"
),
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastLoadTime"
),
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
logger
.
info
(
"lastLoadTime is Error"
)
self
.
logger
.
info
(
"lastLoadTime is Error"
)
else
:
else
:
self
.
last_load_time
[
item
]
=
datetime
.
now
()
self
.
last_load_time
[
item
]
=
datetime
.
now
()
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastLoadTime"
),
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastLoadTime"
),
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
logger
.
info
(
"lastLoadTime is None"
)
self
.
logger
.
info
(
"lastLoadTime is None"
)
self
.
relative_last_load_time
[
item
]
=
float
(
self
.
relative_last_load_time
[
item
]
=
float
(
(
self
.
last_load_time
[
item
]
-
self
.
start_time
)
(
self
.
last_load_time
[
item
]
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
)
)
# print("相对last_load_time", self.relative_last_load_time[item])
# print("相对last_load_time", self.relative_last_load_time[item])
logger
.
info
(
"相对last_load_time"
)
self
.
logger
.
info
(
"相对last_load_time"
)
logger
.
info
(
self
.
relative_last_load_time
[
item
])
self
.
logger
.
info
(
self
.
relative_last_load_time
[
item
])
if
task
in
empty_task_set
:
if
task
in
empty_task_set
:
if
str_to_byte
(
"lastUnloadTime"
)
in
key_value_dict
.
keys
():
if
str_to_byte
(
"lastUnloadTime"
)
in
key_value_dict
.
keys
():
last_unload_time_tmp
=
eval
(
key_value_dict
[
str_to_byte
(
"lastUnloadTime"
)])
last_unload_time_tmp
=
eval
(
key_value_dict
[
str_to_byte
(
"lastUnloadTime"
)])
...
@@ -228,7 +228,7 @@ class TruckInfo(WalkManage):
...
@@ -228,7 +228,7 @@ class TruckInfo(WalkManage):
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastUnloadTime"
),
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastUnloadTime"
),
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
logger
.
info
(
"lastUnloadTime is Error"
)
self
.
logger
.
info
(
"lastUnloadTime is Error"
)
else
:
else
:
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
# key_value_dict[str_to_byte("lastUnloadTime")] = datetime.now().strftime(
# key_value_dict[str_to_byte("lastUnloadTime")] = datetime.now().strftime(
...
@@ -236,14 +236,14 @@ class TruckInfo(WalkManage):
...
@@ -236,14 +236,14 @@ class TruckInfo(WalkManage):
# )
# )
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastUnloadTime"
),
redis2
.
hsetnx
(
truck_uuid_to_name_dict
[
item
],
str_to_byte
(
"lastUnloadTime"
),
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
logger
.
info
(
"lastUnloadTime is None"
)
self
.
logger
.
info
(
"lastUnloadTime is None"
)
self
.
relative_last_unload_time
[
item
]
=
float
(
self
.
relative_last_unload_time
[
item
]
=
float
(
(
self
.
last_unload_time
[
item
]
-
self
.
start_time
)
(
self
.
last_unload_time
[
item
]
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
)
)
# print("相对last_unload_time", self.relative_last_unload_time[item])
# print("相对last_unload_time", self.relative_last_unload_time[item])
logger
.
info
(
"相对last_unload_time"
)
self
.
logger
.
info
(
"相对last_unload_time"
)
logger
.
info
(
self
.
relative_last_unload_time
[
item
])
self
.
logger
.
info
(
self
.
relative_last_unload_time
[
item
])
elif
task
==
-
2
:
elif
task
==
-
2
:
# print(datetime.now())
# print(datetime.now())
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
...
@@ -259,8 +259,8 @@ class TruckInfo(WalkManage):
...
@@ -259,8 +259,8 @@ class TruckInfo(WalkManage):
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
"
\"
"
+
datetime
.
now
()
.
strftime
(
"
%
Y-
%
m-
%
d
%
H:
%
M:
%
S"
)
+
"
\"
"
)
# redis2.hsetnx(truck_uuid_to_name_dict[item], str(json.dumps(key_value_dict)))
# redis2.hsetnx(truck_uuid_to_name_dict[item], str(json.dumps(key_value_dict)))
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"读取矿卡可用时间异常-redis读取异常"
)
self
.
logger
.
error
(
"读取矿卡可用时间异常-redis读取异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
def
update_truck_trip
(
self
):
def
update_truck_trip
(
self
):
...
@@ -283,8 +283,8 @@ class TruckInfo(WalkManage):
...
@@ -283,8 +283,8 @@ class TruckInfo(WalkManage):
if
task
in
empty_task_set
+
heavy_task_set
and
item
is
None
:
if
task
in
empty_task_set
+
heavy_task_set
and
item
is
None
:
raise
Exception
(
f
"矿卡 {truck_id} 配对关系异常"
)
raise
Exception
(
f
"矿卡 {truck_id} 配对关系异常"
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"配对关系异常"
)
self
.
logger
.
error
(
"配对关系异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
continue
continue
# try:
# try:
...
@@ -356,8 +356,8 @@ class TruckInfo(WalkManage):
...
@@ -356,8 +356,8 @@ class TruckInfo(WalkManage):
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
# self.excavator_hold_truck_num[end_eqp_index] = self.excavator_hold_truck_num[end_eqp_index] + 1
pass
pass
# except Exception as es:
# except Exception as es:
# logger.error("矿卡行程读取异常")
#
self.
logger.error("矿卡行程读取异常")
# logger.error(es)
#
self.
logger.error(es)
# print("self.dump_hold_truck_num")
# print("self.dump_hold_truck_num")
# print(self.dump_hold_truck_num)
# print(self.dump_hold_truck_num)
...
@@ -384,8 +384,8 @@ class TruckInfo(WalkManage):
...
@@ -384,8 +384,8 @@ class TruckInfo(WalkManage):
if
task
in
empty_task_set
+
heavy_task_set
and
item
is
None
:
if
task
in
empty_task_set
+
heavy_task_set
and
item
is
None
:
raise
Exception
(
f
"矿卡 {truck_id} 配对关系异常"
)
raise
Exception
(
f
"矿卡 {truck_id} 配对关系异常"
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"配对关系异常"
)
self
.
logger
.
error
(
"配对关系异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
continue
continue
# try:
# try:
...
@@ -409,8 +409,8 @@ class TruckInfo(WalkManage):
...
@@ -409,8 +409,8 @@ class TruckInfo(WalkManage):
else
:
else
:
pass
pass
# except Exception as es:
# except Exception as es:
# logger.error("矿卡行程读取异常")
#
self.
logger.error("矿卡行程读取异常")
# logger.error(es)
#
self.
logger.error(es)
print
(
"self.dump_hold_truck_num"
)
print
(
"self.dump_hold_truck_num"
)
print
(
self
.
dump_hold_truck_num
)
print
(
self
.
dump_hold_truck_num
)
...
@@ -441,8 +441,8 @@ class TruckInfo(WalkManage):
...
@@ -441,8 +441,8 @@ class TruckInfo(WalkManage):
# .capacity
# .capacity
# )
# )
# except Exception as es:
# except Exception as es:
# logger.error("读取矿卡有效载重异常-矿卡型号信息缺失")
#
self.
logger.error("读取矿卡有效载重异常-矿卡型号信息缺失")
# logger.error(es)
#
self.
logger.error(es)
def
update_truck_priority
(
self
):
def
update_truck_priority
(
self
):
self
.
truck_priority
=
np
.
full
(
self
.
dynamic_truck_num
,
0
)
self
.
truck_priority
=
np
.
full
(
self
.
dynamic_truck_num
,
0
)
...
@@ -473,8 +473,8 @@ class TruckInfo(WalkManage):
...
@@ -473,8 +473,8 @@ class TruckInfo(WalkManage):
dump_area
.
Id
dump_area
.
Id
)
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"矿卡-卸载区域绑定关系读取异常"
)
self
.
logger
.
error
(
"矿卡-卸载区域绑定关系读取异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
def
update_truck_excavator_bind
(
self
):
def
update_truck_excavator_bind
(
self
):
try
:
try
:
...
@@ -489,8 +489,8 @@ class TruckInfo(WalkManage):
...
@@ -489,8 +489,8 @@ class TruckInfo(WalkManage):
truck_name_to_uuid_dict
[
truck_name
]
truck_name_to_uuid_dict
[
truck_name
]
]
=
excavator_id
]
=
excavator_id
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"矿卡-挖机绑定关系读取异常"
)
self
.
logger
.
error
(
"矿卡-挖机绑定关系读取异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
def
update_truck_excavator_exclude
(
self
):
def
update_truck_excavator_exclude
(
self
):
...
@@ -519,8 +519,10 @@ class TruckInfo(WalkManage):
...
@@ -519,8 +519,10 @@ class TruckInfo(WalkManage):
self
.
excavator_uuid_to_index_dict
[
excavator_id
]
self
.
excavator_uuid_to_index_dict
[
excavator_id
]
]
=
1000000
]
=
1000000
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
"矿卡-挖机禁止关系读取异常"
)
self
.
logger
.
error
(
"矿卡-挖机禁止关系读取异常"
)
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
return
self
.
excavator_exclude_modify
def
update_truck_dump_exclude
(
self
):
def
update_truck_dump_exclude
(
self
):
pass
pass
...
@@ -570,8 +572,8 @@ class TruckInfo(WalkManage):
...
@@ -570,8 +572,8 @@ 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
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
logger
.
error
(
"矿卡物料更新异常"
)
self
.
logger
.
error
(
"矿卡物料更新异常"
)
def
update_truck_spec
(
self
):
def
update_truck_spec
(
self
):
for
truck_id
in
self
.
dynamic_truck_set
:
for
truck_id
in
self
.
dynamic_truck_set
:
...
@@ -653,7 +655,7 @@ class TruckInfo(WalkManage):
...
@@ -653,7 +655,7 @@ class TruckInfo(WalkManage):
# 设备优先级启用
# 设备优先级启用
rule6
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
6
)
.
first
()
.
disabled
rule6
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
6
)
.
first
()
.
disabled
# logger.info("Para truck update!")
#
self.
logger.info("Para truck update!")
#
#
# # 装载周期参数
# # 装载周期参数
# self.period_map_para_load()
# self.period_map_para_load()
...
@@ -663,20 +665,20 @@ class TruckInfo(WalkManage):
...
@@ -663,20 +665,20 @@ class TruckInfo(WalkManage):
# # 更新有效载重
# # 更新有效载重
# self.update_truck_payload()
# self.update_truck_payload()
#
#
# logger.info("距离成本规则")
#
self.
logger.info("距离成本规则")
# logger.info(rule1)
#
self.
logger.info(rule1)
#
#
# logger.info("拥堵成本规则")
#
self.
logger.info("拥堵成本规则")
# logger.info(rule2)
#
self.
logger.info(rule2)
#
#
# logger.info("车流规划规则")
#
self.
logger.info("车流规划规则")
# logger.info(rule3 or rule4)
#
self.
logger.info(rule3 or rule4)
#
#
# logger.info("生产组织规则")
#
self.
logger.info("生产组织规则")
# logger.info(rule5)
#
self.
logger.info(rule5)
#
#
# logger.info("设备优先级规则")
#
self.
logger.info("设备优先级规则")
# logger.info(rule6)
#
self.
logger.info(rule6)
#
#
# if not rule5:
# if not rule5:
# # 更新绑定关系
# # 更新绑定关系
...
@@ -701,7 +703,7 @@ class TruckInfo(WalkManage):
...
@@ -701,7 +703,7 @@ class TruckInfo(WalkManage):
# 物料优先级启用
# 物料优先级启用
rule7
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
7
)
.
first
()
.
disabled
rule7
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
7
)
.
first
()
.
disabled
logger
.
info
(
"Para truck update!"
)
self
.
logger
.
info
(
"Para truck update!"
)
# 装载周期参数
# 装载周期参数
self
.
period_map_para_update
()
self
.
period_map_para_update
()
...
@@ -712,41 +714,41 @@ class TruckInfo(WalkManage):
...
@@ -712,41 +714,41 @@ class TruckInfo(WalkManage):
self
.
update_truck_payload
()
self
.
update_truck_payload
()
if
rule1
:
if
rule1
:
logger
.
info
(
"距离成本规则未启用"
)
self
.
logger
.
info
(
"距离成本规则未启用"
)
else
:
else
:
logger
.
info
(
"距离成本规则启用"
)
self
.
logger
.
info
(
"距离成本规则启用"
)
if
rule2
:
if
rule2
:
logger
.
info
(
"拥堵成本规则未启用"
)
self
.
logger
.
info
(
"拥堵成本规则未启用"
)
else
:
else
:
logger
.
info
(
"拥堵成本规则启用"
)
self
.
logger
.
info
(
"拥堵成本规则启用"
)
if
rule3
or
rule4
:
if
rule3
or
rule4
:
logger
.
info
(
"车流规划规则未启用"
)
self
.
logger
.
info
(
"车流规划规则未启用"
)
else
:
else
:
logger
.
info
(
"车流规划规则启用"
)
self
.
logger
.
info
(
"车流规划规则启用"
)
if
rule5
:
if
rule5
:
logger
.
info
(
"生产组织规则未启用"
)
self
.
logger
.
info
(
"生产组织规则未启用"
)
else
:
else
:
# 更新绑定关系
# 更新绑定关系
self
.
update_truck_dump_area_bind
()
self
.
update_truck_dump_area_bind
()
self
.
update_truck_excavator_bind
()
self
.
update_truck_excavator_bind
()
# 更新禁止关系
# 更新禁止关系
self
.
update_truck_excavator_exclude
()
self
.
update_truck_excavator_exclude
()
logger
.
info
(
"生产组织规划规则启用"
)
self
.
logger
.
info
(
"生产组织规划规则启用"
)
if
rule6
:
if
rule6
:
logger
.
info
(
"设备优先级规则未启用"
)
self
.
logger
.
info
(
"设备优先级规则未启用"
)
else
:
else
:
# 更新矿卡调度优先级
# 更新矿卡调度优先级
self
.
update_truck_priority
()
self
.
update_truck_priority
()
logger
.
info
(
"设备优先级规则启用"
)
self
.
logger
.
info
(
"设备优先级规则启用"
)
if
rule7
:
if
rule7
:
logger
.
info
(
"物料优先级规则未启用"
)
self
.
logger
.
info
(
"物料优先级规则未启用"
)
else
:
else
:
logger
.
info
(
"物料优先级规则启用"
)
self
.
logger
.
info
(
"物料优先级规则启用"
)
# 更新矿卡物料类型
# 更新矿卡物料类型
self
.
update_truck_material
()
self
.
update_truck_material
()
...
...
para_config.py
View file @
7fca8604
...
@@ -18,33 +18,14 @@ empty_task_set = [0, 1, 5]
...
@@ -18,33 +18,14 @@ empty_task_set = [0, 1, 5]
# 重载任务集合
# 重载任务集合
heavy_task_set
=
[
2
,
3
,
4
]
heavy_task_set
=
[
2
,
3
,
4
]
# # 空载矿卡速度,单位(km/h)
# global empty_speed
#
# empty_speed = 25
#
# # 重载矿卡速度,单位(km/h)
# global heavy_speed
#
# heavy_speed = 22
#
# # 卸载设备目标卸载量
# dump_target_mass = 5000
#
# # 挖机目标装载量
# excavator_target_mass = 5000
# 任务集合
# 任务集合
task_set
=
[
-
2
,
0
,
1
,
2
,
3
,
4
,
5
]
task_set
=
[
-
2
,
0
,
1
,
2
,
3
,
4
,
5
]
#
# truck = TruckInfo()
# excavator = ExcavatorInfo()
# dump = DumpInfo()
# Big integer
# Big integer
M
=
100000000
M
=
100000000
logger
=
get_logger
(
"zxt.para"
)
# 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# (uuid,index(id)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
# (uuid,index(id)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
(
(
...
@@ -64,6 +45,8 @@ park_num = len(park_uuid_to_index_dict)
...
@@ -64,6 +45,8 @@ park_num = len(park_uuid_to_index_dict)
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
=
build_truck_uuid_name_map
()
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
=
build_truck_uuid_name_map
()
excavator_uuid_to_name_dict
,
dump_uuid_to_name_dict
=
build_equipment_uuid_name_map
()
# 矿卡集合
# 矿卡集合
truck_set
=
set
(
update_total_truck
())
truck_set
=
set
(
update_total_truck
())
...
@@ -305,9 +288,7 @@ class WalkManage(DeviceMap):
...
@@ -305,9 +288,7 @@ class WalkManage(DeviceMap):
self
.
walk_time_to_unload_area
=
np
.
full
((
unload_area_num
,
load_area_num
),
M
)
self
.
walk_time_to_unload_area
=
np
.
full
((
unload_area_num
,
load_area_num
),
M
)
# 路网行驶时间
# 路网行驶时间
self
.
distance_to_excavator
=
np
.
full
(
self
.
distance_to_excavator
=
np
.
full
((
dynamic_dump_num
,
dynamic_excavator_num
),
M
)
(
dynamic_dump_num
,
dynamic_excavator_num
),
M
)
self
.
distance_to_dump
=
np
.
full
((
dynamic_dump_num
,
dynamic_excavator_num
),
M
)
self
.
distance_to_dump
=
np
.
full
((
dynamic_dump_num
,
dynamic_excavator_num
),
M
)
self
.
distance_park_to_excavator
=
np
.
full
((
park_num
,
dynamic_excavator_num
),
M
)
self
.
distance_park_to_excavator
=
np
.
full
((
park_num
,
dynamic_excavator_num
),
M
)
self
.
distance_park_to_load_area
=
np
.
full
((
park_num
,
load_area_num
),
M
)
self
.
distance_park_to_load_area
=
np
.
full
((
park_num
,
load_area_num
),
M
)
...
@@ -394,6 +375,9 @@ class WalkManage(DeviceMap):
...
@@ -394,6 +375,9 @@ class WalkManage(DeviceMap):
logger
.
error
(
"备停区设备路网信息异常"
)
logger
.
error
(
"备停区设备路网信息异常"
)
logger
.
error
(
es
)
logger
.
error
(
es
)
logger
.
info
(
"distance_park_to_excavator"
)
logger
.
info
(
self
.
distance_park_to_excavator
)
def
period_walk_para_load
(
self
):
def
period_walk_para_load
(
self
):
# 装载路网信息
# 装载路网信息
self
.
distance_to_load_area
=
walk_manage
.
distance_to_load_area
self
.
distance_to_load_area
=
walk_manage
.
distance_to_load_area
...
@@ -431,6 +415,7 @@ def period_para_update():
...
@@ -431,6 +415,7 @@ def period_para_update():
global
park_uuid_to_index_dict
,
park_index_to_uuid_dict
global
park_uuid_to_index_dict
,
park_index_to_uuid_dict
global
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
global
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
global
dynamic_truck_num
,
dynamic_excavator_num
,
dynamic_dump_num
global
dynamic_truck_num
,
dynamic_excavator_num
,
dynamic_dump_num
global
excavator_uuid_to_name_dict
,
dump_uuid_to_name_dict
# 清空数据库缓存
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
commit
()
...
@@ -455,6 +440,8 @@ def period_para_update():
...
@@ -455,6 +440,8 @@ def period_para_update():
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
=
build_truck_uuid_name_map
()
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
=
build_truck_uuid_name_map
()
excavator_uuid_to_name_dict
,
dump_uuid_to_name_dict
=
build_equipment_uuid_name_map
()
# 矿卡集合
# 矿卡集合
truck_set
=
set
(
update_total_truck
())
truck_set
=
set
(
update_total_truck
())
...
@@ -495,35 +482,555 @@ def period_para_update():
...
@@ -495,35 +482,555 @@ def period_para_update():
global_dict
[
"dynamic_dump_set"
]
=
dynamic_dump_set
global_dict
[
"dynamic_dump_set"
]
=
dynamic_dump_set
global_dict
[
"dynamic_dump_num"
]
=
dynamic_dump_num
global_dict
[
"dynamic_dump_num"
]
=
dynamic_dump_num
global_dict
[
"park_num"
]
=
park_num
global_dict
[
"park_num"
]
=
park_num
global_dict
[
"load_area_num"
]
=
load_area_num
global_dict
[
"unload_area_num"
]
=
unload_area_num
print
(
"walk_manage.distance_to_excavator"
)
global_dict
[
"truck_uuid_to_name_dict"
]
=
truck_uuid_to_name_dict
print
(
dynamic_dump_num
,
dynamic_excavator_num
)
global_dict
[
"excavator_uuid_to_name_dict"
]
=
excavator_uuid_to_name_dict
print
(
walk_manage
.
distance_to_excavator
)
global_dict
[
"dump_uuid_to_name_dict"
]
=
dump_uuid_to_name_dict
global_dict
[
"unload_area_uuid_to_index_dict"
]
=
unload_area_uuid_to_index_dict
print
(
"walk_manage.excavator_dict"
)
global_dict
[
"unload_area_index_to_uuid_dict"
]
=
unload_area_index_to_uuid_dict
print
(
walk_manage
.
excavator_uuid_to_index_dict
)
global_dict
[
"park_uuid_to_index_dict"
]
=
park_uuid_to_index_dict
print
(
"walk_manage.dump_dict"
)
global_dict
[
"park_index_to_uuid_dict"
]
=
park_index_to_uuid_dict
print
(
walk_manage
.
dump_uuid_to_index_dict
)
global_dict
[
"distance_to_excavator"
]
=
walk_manage
.
distance_to_excavator
global_dict
[
"distance_to_excavator"
]
=
walk_manage
.
distance_to_excavator
global_dict
[
"distance_park_to_excavator"
]
=
walk_manage
.
distance_park_to_excavator
global_dict
[
"distance_park_to_excavator"
]
=
walk_manage
.
distance_park_to_excavator
global_dict
[
"distance_to_dump"
]
=
walk_manage
.
distance_to_dump
global_dict
[
"distance_to_dump"
]
=
walk_manage
.
distance_to_dump
logger
.
info
(
"walk_manage_para"
)
# logger.info("walk_manage_para")
logger
.
info
(
"distance_to_excavator"
)
# logger.info("distance_to_excavator")
logger
.
info
(
walk_manage
.
distance_to_excavator
)
# logger.info(walk_manage.distance_to_excavator)
logger
.
info
(
"distance_park_to_excavator"
)
# logger.info("distance_park_to_excavator")
logger
.
info
(
walk_manage
.
distance_park_to_excavator
)
# logger.info(walk_manage.distance_park_to_excavator)
logger
.
info
(
"distance_to_dump"
)
# logger.info("distance_to_dump")
logger
.
info
(
walk_manage
.
distance_to_dump
)
# logger.info(walk_manage.distance_to_dump)
logger
.
info
(
"excavator_uuid_to_index_dict"
)
# logger.info("excavator_uuid_to_index_dict")
logger
.
info
(
walk_manage
.
excavator_uuid_to_index_dict
)
# logger.info(walk_manage.excavator_uuid_to_index_dict)
logger
.
info
(
"dump_uuid_to_index_dict"
)
# logger.info("dump_uuid_to_index_dict")
logger
.
info
(
walk_manage
.
dump_uuid_to_index_dict
)
# logger.info(walk_manage.dump_uuid_to_index_dict)
logger
.
info
(
"walk_manage.distance_park_to_excavator"
)
# logger.info("walk_manage.distance_park_to_excavator")
logger
.
info
(
walk_manage
.
distance_park_to_excavator
)
# logger.info(walk_manage.distance_park_to_excavator)
#
logger
.
info
(
"walk_manage.truck_index_to_uuid_dict"
)
# logger.info("walk_manage.truck_index_to_uuid_dict")
logger
.
info
(
walk_manage
.
truck_index_to_uuid_dict
)
# logger.info(walk_manage.truck_index_to_uuid_dict)
logger
.
info
(
"walk_manage.dynamic_truck_set"
)
# logger.info("walk_manage.dynamic_truck_set")
logger
.
info
(
dynamic_truck_set
)
# logger.info(dynamic_truck_set)
# # 全局参数设定
#
# # 空载任务集合
# empty_task_set = [0, 1, 5]
#
# # 重载任务集合
# heavy_task_set = [2, 3, 4]
#
# # # 空载矿卡速度,单位(km/h)
# # global empty_speed
# #
# # empty_speed = 25
# #
# # # 重载矿卡速度,单位(km/h)
# # global heavy_speed
# #
# # heavy_speed = 22
# #
# # # 卸载设备目标卸载量
# # dump_target_mass = 5000
# #
# # # 挖机目标装载量
# # excavator_target_mass = 5000
#
# # 任务集合
# task_set = [-2, 0, 1, 2, 3, 4, 5]
#
# #
# # truck = TruckInfo()
# # excavator = ExcavatorInfo()
# # dump = DumpInfo()
#
# # Big integer
# M = 100000000
#
# # 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# # (uuid,index(id)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
# (
# load_area_uuid_to_index_dict,
# unload_area_uuid_to_index_dict,
# load_area_index_to_uuid_dict,
# unload_area_index_to_uuid_dict,
# ) = build_work_area_uuid_index_map()
#
# load_area_num, unload_area_num = len(load_area_uuid_to_index_dict), len(
# unload_area_uuid_to_index_dict
# )
#
# park_uuid_to_index_dict, park_index_to_uuid_dict = build_park_uuid_index_map()
#
# park_num = len(park_uuid_to_index_dict)
#
# truck_uuid_to_name_dict, truck_name_to_uuid_dict = build_truck_uuid_name_map()
#
# # 矿卡集合
# truck_set = set(update_total_truck())
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 动态派车矿卡集合
# # dynamic_truck_set = truck_set.difference(fixed_truck_set)
# dynamic_truck_set = update_dynamic_truck()
#
# dynamic_truck_num = len(dynamic_truck_set)
#
# logger.info("可用于动态派车的矿卡:")
# logger.info(dynamic_truck_set)
#
# # 用于动态调度的挖机及卸载设备
# dynamic_excavator_set = set(update_autodisp_excavator())
# 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
# global_dict["park_num"] = park_num
#
#
# def get_value(name):
# return global_dict[name]
#
# # 设备映射类, 存储除工作区以外的映射关系
# # 其余设备类继承该类
# class DeviceMap:
# def __init__(self):
# self.excavator_uuid_to_index_dict = {}
# self.dump_uuid_to_index_dict = {}
# self.excavator_index_to_uuid_dict = {}
# self.dump_index_to_uuid_dict = {}
#
# self.dump_uuid_to_unload_area_uuid_dict = {}
# self.excavator_uuid_to_load_area_uuid_dict = {}
# self.excavator_index_to_load_area_index_dict = {}
# self.dump_index_to_unload_area_index_dict = {}
#
# self.truck_uuid_to_index_dict = {}
# self.truck_index_to_uuid_dict = {}
#
# def get_excavator_uuid_to_index_dict(self):
# return self.excavator_uuid_to_index_dict
#
# def get_dump_uuid_to_index_dict(self):
# return self.dump_uuid_to_index_dict
#
# def get_excavator_index_to_uuid_dict(self):
# return self.excavator_index_to_uuid_dict
#
# def get_dump_index_to_uuid_dict(self):
# return self.dump_index_to_uuid_dict
#
# def get_dump_uuid_to_unload_area_uuid_dict(self):
# return self.dump_uuid_to_unload_area_uuid_dict
#
# def get_excavator_uuid_to_load_area_uuid_dict(self):
# return self.excavator_uuid_to_load_area_uuid_dict
#
# def get_excavator_index_to_load_area_index_dict(self):
# return self.excavator_index_to_load_area_index_dict
#
# def get_dump_index_to_unload_area_index_dict(self):
# return self.dump_index_to_unload_area_index_dict
#
# def get_truck_uuid_to_index_dict(self):
# return self.truck_uuid_to_index_dict
#
# def get_truck_index_to_uuid_dict(self):
# return self.truck_index_to_uuid_dict
#
# def reset(self):
# self.excavator_uuid_to_index_dict = {}
# self.dump_uuid_to_index_dict = {}
# self.excavator_index_to_uuid_dict = {}
# self.dump_index_to_uuid_dict = {}
#
# self.dump_uuid_to_unload_area_uuid_dict = {}
# self.excavator_uuid_to_load_area_uuid_dict = {}
# self.excavator_index_to_load_area_index_dict = {}
# self.dump_index_to_unload_area_index_dict = {}
#
# self.truck_uuid_to_index_dict = {}
# self.truck_index_to_uuid_dict = {}
#
# def period_map_para_update(self):
#
# self.reset()
#
# device_map_dict = update_deveices_map(
# unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict
# )
#
# self.excavator_uuid_to_index_dict = device_map_dict[
# "excavator_uuid_to_index_dict"
# ]
#
# print("device.dump_uuid_to_index_dict")
# print(self.dump_uuid_to_index_dict)
#
# self.dump_uuid_to_index_dict = device_map_dict["dump_uuid_to_index_dict"]
# self.excavator_index_to_uuid_dict = device_map_dict[
# "excavator_index_to_uuid_dict"
# ]
# self.dump_index_to_uuid_dict = device_map_dict["dump_index_to_uuid_dict"]
#
# self.dump_uuid_to_unload_area_uuid_dict = device_map_dict[
# "dump_uuid_to_unload_area_uuid_dict"
# ]
# self.excavator_uuid_to_load_area_uuid_dict = device_map_dict[
# "excavator_uuid_to_load_area_uuid_dict"
# ]
# self.excavator_index_to_load_area_index_dict = device_map_dict[
# "excavator_index_to_load_area_index_dict"
# ]
# self.dump_index_to_unload_area_index_dict = device_map_dict[
# "dump_index_to_unload_area_index_dict"
# ]
#
# truck_map_dict = update_truck_uuid_index_map(get_value("dynamic_truck_set"))
#
# self.truck_uuid_to_index_dict = truck_map_dict["truck_uuid_to_index_dict"]
#
# self.truck_index_to_uuid_dict = truck_map_dict["truck_index_to_uuid_dict"]
#
# def period_map_para_load(self):
# # 装载关系映射
# self.excavator_uuid_to_index_dict = device_map.excavator_uuid_to_index_dict
# self.dump_uuid_to_index_dict = device_map.dump_uuid_to_index_dict
# self.excavator_index_to_uuid_dict = device_map.excavator_index_to_uuid_dict
# self.dump_index_to_uuid_dict = device_map.dump_index_to_uuid_dict
#
# self.dump_uuid_to_unload_area_uuid_dict = (
# device_map.dump_uuid_to_unload_area_uuid_dict
# )
# self.excavator_uuid_to_load_area_uuid_dict = (
# device_map.excavator_uuid_to_load_area_uuid_dict
# )
# self.excavator_index_to_load_area_index_dict = (
# device_map.excavator_index_to_load_area_index_dict
# )
# self.dump_index_to_unload_area_index_dict = (
# device_map.dump_index_to_unload_area_index_dict
# )
#
# self.truck_uuid_to_index_dict = device_map.truck_uuid_to_index_dict
# self.truck_index_to_uuid_dict = device_map.truck_index_to_uuid_dict
#
#
# # 路网信息类
# class WalkManage(DeviceMap):
# def __init__(self):
# # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
#
# # 路网真实距离
# self.walk_time_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.walk_time_park_to_load_area = np.full((park_num, load_area_num), M)
# self.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# # 路网行驶时间
# self.distance_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.distance_park_to_load_area = np.full((park_num, load_area_num), M)
# self.distance_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.distance_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# def get_walk_time_to_load_area(self):
# return self.walk_time_to_load_area
#
# def get_walk_time_to_unload_area(self):
# return self.walk_time_to_unload_area
#
# def get_walk_time_to_excavator(self):
# return self.walk_time_to_excavator
#
# def get_walk_time_to_dump(self):
# return self.walk_time_to_dump
#
# def get_walk_time_park_to_load_area(self):
# return self.walk_time_park_to_load_area
#
# def get_walk_time_park_to_excavator(self):
# return self.walk_time_park_to_excavator
#
# def get_distance_to_load_area(self):
# return self.distance_to_load_area
#
# def get_distance_to_unload_area(self):
# return self.distance_to_unload_area
#
# def get_distance_to_excavator(self):
# return self.distance_to_excavator
#
# def get_distance_to_dump(self):
# return self.distance_to_dump
#
# def get_distance_park_to_load_area(self):
# return self.distance_park_to_load_area
#
# def get_distance_park_to_excavator(self):
# return self.distance_park_to_excavator
#
# def reset(self):
#
# # dynamic_excavator_num
# # dynamic_dump_num
# # park_num
#
# # 路网真实距离
# self.walk_time_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.walk_time_park_to_load_area = np.full((park_num, load_area_num), M)
# self.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# # 路网行驶时间
# self.distance_to_excavator = np.full(
# (dynamic_dump_num, dynamic_excavator_num), M
# )
# self.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M)
# self.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M)
# self.distance_park_to_load_area = np.full((park_num, load_area_num), M)
# self.distance_to_load_area = np.full((unload_area_num, load_area_num), M)
# self.distance_to_unload_area = np.full((unload_area_num, load_area_num), M)
#
# def period_walk_para_update(self):
#
# self.reset()
#
# self.period_map_para_update()
#
# # 计算路网距离及行走时间
# try:
# # 处理距离
# for item in session_postgre.query(WalkTime).all():
# load_area = str(item.load_area_id)
# unload_area = str(item.unload_area_id)
# load_area_index = load_area_uuid_to_index_dict[load_area]
# unload_area_index = unload_area_uuid_to_index_dict[unload_area]
# self.distance_to_load_area[unload_area_index][load_area_index] = float(
# item.to_load_distance
# )
# self.walk_time_to_load_area[unload_area_index][load_area_index] = float(
# 60 / 1000 * item.to_load_distance / empty_speed
# )
# self.distance_to_unload_area[unload_area_index][
# load_area_index
# ] = float(item.to_unload_distance)
# self.walk_time_to_unload_area[unload_area_index][
# load_area_index
# ] = float(60 / 1000 * item.to_unload_distance / heavy_speed)
# except Exception as es:
# logger.error("路网信息异常")
# logger.error(es)
#
# # 计算设备路网距离及行走时间
# try:
# for i in range(dynamic_dump_num):
# for j in range(dynamic_excavator_num):
# self.distance_to_excavator[i][j] = self.distance_to_load_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.walk_time_to_excavator[i][j] = self.walk_time_to_load_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.distance_to_dump[i][j] = self.distance_to_unload_area[
# self.dump_index_to_unload_area_index_dict[i]
# ][self.excavator_index_to_load_area_index_dict[j]]
# self.walk_time_to_dump[i][j] = self.walk_time_to_unload_area[
# self.dump_index_to_unload_area_index_dict[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):
# # 装载路网信息
# self.distance_to_load_area = walk_manage.distance_to_load_area
# self.distance_to_unload_area = walk_manage.distance_to_unload_area
# self.distance_park_to_load_area = walk_manage.distance_park_to_load_area
#
# self.distance_to_excavator = walk_manage.distance_to_excavator
# self.distance_to_dump = walk_manage.distance_to_dump
# self.distance_park_to_excavator = walk_manage.distance_park_to_excavator
#
# self.walk_time_to_excavator = walk_manage.walk_time_to_excavator
# self.walk_time_to_dump = walk_manage.walk_time_to_dump
# self.walk_time_park_to_excavator = walk_manage.walk_time_park_to_excavator
#
# self.walk_time_to_load_area = walk_manage.walk_time_to_load_area
# self.walk_time_to_unload_area = walk_manage.walk_time_to_unload_area
# self.walk_time_park_to_load_area = walk_manage.walk_time_park_to_load_area
#
#
# device_map = DeviceMap()
#
# walk_manage = WalkManage()
#
# device_map.period_map_para_update()
#
# walk_manage.period_map_para_load()
#
# walk_manage.period_walk_para_update()
#
#
# def period_para_update():
# global load_area_uuid_to_index_dict, load_area_index_to_uuid_dict
# global unload_area_uuid_to_index_dict, unload_area_index_to_uuid_dict
# global load_area_num, unload_area_num, park_num
# 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)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
# (
# load_area_uuid_to_index_dict,
# unload_area_uuid_to_index_dict,
# load_area_index_to_uuid_dict,
# unload_area_index_to_uuid_dict,
# ) = build_work_area_uuid_index_map()
#
# load_area_num, unload_area_num = len(load_area_uuid_to_index_dict), len(
# unload_area_uuid_to_index_dict
# )
#
# park_uuid_to_index_dict, park_index_to_uuid_dict = build_park_uuid_index_map()
#
# park_num = len(park_uuid_to_index_dict)
#
# truck_uuid_to_name_dict, truck_name_to_uuid_dict = build_truck_uuid_name_map()
#
# # 矿卡集合
# truck_set = set(update_total_truck())
#
# logger.info("truck_set")
# logger.info(truck_set)
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# logger.info("fixed_truck_set")
# logger.info(fixed_truck_set)
#
# # 动态派车矿卡集合
# # dynamic_truck_set = truck_set.difference(fixed_truck_set)
# dynamic_truck_set = update_dynamic_truck()
#
# dynamic_truck_num = len(dynamic_truck_set)
#
# logger.info("可用于动态派车的矿卡:")
# logger.info(dynamic_truck_num)
# logger.info(dynamic_truck_set)
#
# # 用于动态调度的挖机及卸载设备
# dynamic_excavator_set = set(update_autodisp_excavator())
# dynamic_excavator_num = len(dynamic_excavator_set)
#
# dynamic_dump_set = set(update_autodisp_dump())
# dynamic_dump_num = len(dynamic_dump_set)
#
# 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
# global_dict["park_num"] = park_num
#
# print("walk_manage.distance_to_excavator")
# print(dynamic_dump_num, dynamic_excavator_num)
# print(walk_manage.distance_to_excavator)
#
# print("walk_manage.excavator_dict")
# print(walk_manage.excavator_uuid_to_index_dict)
# print("walk_manage.dump_dict")
# print(walk_manage.dump_uuid_to_index_dict)
#
# global_dict["distance_to_excavator"] = walk_manage.distance_to_excavator
# global_dict["distance_park_to_excavator"] = walk_manage.distance_park_to_excavator
# global_dict["distance_to_dump"] = walk_manage.distance_to_dump
#
# logger.info("walk_manage_para")
# logger.info("distance_to_excavator")
# logger.info(walk_manage.distance_to_excavator)
# logger.info("distance_park_to_excavator")
# logger.info(walk_manage.distance_park_to_excavator)
# logger.info("distance_to_dump")
# logger.info(walk_manage.distance_to_dump)
# logger.info("excavator_uuid_to_index_dict")
# logger.info(walk_manage.excavator_uuid_to_index_dict)
# logger.info("dump_uuid_to_index_dict")
# logger.info(walk_manage.dump_uuid_to_index_dict)
# logger.info("walk_manage.distance_park_to_excavator")
# logger.info(walk_manage.distance_park_to_excavator)
#
# logger.info("walk_manage.truck_index_to_uuid_dict")
# logger.info(walk_manage.truck_index_to_uuid_dict)
# logger.info("walk_manage.dynamic_truck_set")
# logger.info(dynamic_truck_set)
path_plan/path_plannner.py
View file @
7fca8604
...
@@ -7,6 +7,7 @@
...
@@ -7,6 +7,7 @@
# @Software: PyCharm
# @Software: PyCharm
from
equipment.truck
import
TruckInfo
,
DumpInfo
,
ExcavatorInfo
from
equipment.truck
import
TruckInfo
,
DumpInfo
,
ExcavatorInfo
# from path_plan.priority_control import PriorityController
from
path_plan.priority_control
import
PriorityController
from
path_plan.priority_control
import
PriorityController
from
para_config
import
*
from
para_config
import
*
from
tables
import
*
from
tables
import
*
...
@@ -27,7 +28,6 @@ class PathPlanner(WalkManage):
...
@@ -27,7 +28,6 @@ class PathPlanner(WalkManage):
# 控制类
# 控制类
self
.
controller
=
PriorityController
(
self
.
dump
,
self
.
excavator
,
self
.
truck
)
self
.
controller
=
PriorityController
(
self
.
dump
,
self
.
excavator
,
self
.
truck
)
# 路线行驶成本
# 路线行驶成本
self
.
rout_cost
=
np
.
array
((
unload_area_num
,
load_area_num
))
self
.
rout_cost
=
np
.
array
((
unload_area_num
,
load_area_num
))
# 路段集合
# 路段集合
...
@@ -123,7 +123,7 @@ class PathPlanner(WalkManage):
...
@@ -123,7 +123,7 @@ class PathPlanner(WalkManage):
# print("拥堵因子-卸点")
# print("拥堵因子-卸点")
# print(alpha, cost_to_unload_blockage)
# print(alpha, cost_to_unload_blockage)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
error
(
f
'道路{load_area_id + "-" +unload_area_id}行驶成本计算异常'
)
logger
.
error
(
f
'道路{load_area_id + "-" +
unload_area_id}行驶成本计算异常'
)
logger
.
error
(
es
)
logger
.
error
(
es
)
return
to_load_cost
,
to_unload_cost
return
to_load_cost
,
to_unload_cost
...
@@ -165,7 +165,7 @@ class PathPlanner(WalkManage):
...
@@ -165,7 +165,7 @@ class PathPlanner(WalkManage):
self
.
period_map_para_load
()
self
.
period_map_para_load
()
self
.
controller
.
period_update
(
self
.
dump
,
self
.
excavator
,
self
.
truck
)
#
self.controller.period_update(self.dump, self.excavator, self.truck)
# 计算行驶成本前,更新路网速度信息
# 计算行驶成本前,更新路网速度信息
self
.
lane
.
lane_speed_generate
()
self
.
lane
.
lane_speed_generate
()
...
@@ -191,8 +191,6 @@ class PathPlanner(WalkManage):
...
@@ -191,8 +191,6 @@ class PathPlanner(WalkManage):
logger
.
error
(
es
)
logger
.
error
(
es
)
self
.
cost_to_excavator
=
np
.
zeros_like
(
get_value
(
"distance_to_excavator"
))
self
.
cost_to_excavator
=
np
.
zeros_like
(
get_value
(
"distance_to_excavator"
))
print
(
"distance_to_excavator"
)
print
(
self
.
cost_to_excavator
)
self
.
cost_to_dump
=
np
.
zeros_like
(
get_value
(
"distance_to_dump"
))
self
.
cost_to_dump
=
np
.
zeros_like
(
get_value
(
"distance_to_dump"
))
self
.
cost_park_to_excavator
=
np
.
zeros_like
(
get_value
(
"distance_park_to_excavator"
))
self
.
cost_park_to_excavator
=
np
.
zeros_like
(
get_value
(
"distance_park_to_excavator"
))
...
@@ -201,15 +199,17 @@ class PathPlanner(WalkManage):
...
@@ -201,15 +199,17 @@ class PathPlanner(WalkManage):
# try:
# try:
# 路网权重
# 路网权重
walk_
weight
,
park_walk_weight
=
self
.
controller
.
weighted_walk_cost
()
walk_
to_excavator_weight
,
walk_to_dump_weight
,
park_walk_weight
=
self
.
controller
.
weighted_walk_calc
()
# 路网禁用关系
# 路网禁用关系
walk_available
=
self
.
controller
.
available_walk
()
walk_available
=
self
.
controller
.
walk_available_calc
()
group_walk_available
=
self
.
controller
.
update_group_walk_available
()
#
group_walk_available = self.controller.update_group_walk_available()
logger
.
info
(
"path_weight"
)
logger
.
info
(
"path_weight"
)
logger
.
info
(
walk_weight
)
logger
.
info
(
walk_to_excavator_weight
)
logger
.
info
(
walk_to_dump_weight
)
logger
.
info
(
park_walk_weight
)
logger
.
info
(
"walk_avail"
)
logger
.
info
(
"walk_avail"
)
logger
.
info
(
walk_available
)
logger
.
info
(
walk_available
)
...
@@ -223,8 +223,12 @@ class PathPlanner(WalkManage):
...
@@ -223,8 +223,12 @@ class PathPlanner(WalkManage):
unload_area_index
=
self
.
dump_index_to_unload_area_index_dict
[
i
]
unload_area_index
=
self
.
dump_index_to_unload_area_index_dict
[
i
]
logger
.
info
(
"cost_to_excavator"
)
logger
.
info
(
"cost_to_excavator"
)
logger
.
info
(
self
.
cost_to_excavator
)
logger
.
info
(
self
.
cost_to_excavator
)
self
.
cost_to_excavator
[
i
][
j
]
=
self
.
cost_to_load_area
[
unload_area_index
][
load_area_index
]
/
walk_weight
[
i
][
j
]
+
group_walk_available
[
i
][
j
]
# self.cost_to_excavator[i][j] = self.cost_to_load_area[unload_area_index][load_area_index] / walk_weight[i][j] + group_walk_available[i][j]
self
.
cost_to_dump
[
i
][
j
]
=
self
.
cost_to_unload_area
[
unload_area_index
][
load_area_index
]
/
walk_weight
[
i
][
j
]
+
walk_available
[
i
][
j
]
+
group_walk_available
[
i
][
j
]
self
.
cost_to_excavator
[
i
][
j
]
=
self
.
cost_to_load_area
[
unload_area_index
][
load_area_index
]
/
\
walk_to_excavator_weight
[
i
][
j
]
+
walk_available
[
i
][
j
]
# self.cost_to_dump[i][j] = self.cost_to_unload_area[unload_area_index][load_area_index] / walk_weight[i][j] + walk_available[i][j] + group_walk_available[i][j]
self
.
cost_to_dump
[
i
][
j
]
=
self
.
cost_to_unload_area
[
unload_area_index
][
load_area_index
]
/
\
walk_to_dump_weight
[
j
][
i
]
+
walk_available
[
i
][
j
]
for
j
in
range
(
get_value
(
"dynamic_excavator_num"
)):
for
j
in
range
(
get_value
(
"dynamic_excavator_num"
)):
load_area_index
=
self
.
excavator_index_to_load_area_index_dict
[
j
]
load_area_index
=
self
.
excavator_index_to_load_area_index_dict
[
j
]
...
@@ -289,7 +293,10 @@ class LaneInfo:
...
@@ -289,7 +293,10 @@ class LaneInfo:
device_type
=
key_value_dict
[
str_to_byte
(
'type'
)]
device_type
=
key_value_dict
[
str_to_byte
(
'type'
)]
is_online
=
key_value_dict
[
str_to_byte
(
'online'
)]
is_online
=
key_value_dict
[
str_to_byte
(
'online'
)]
key_set
=
key_value_dict
.
keys
()
key_set
=
key_value_dict
.
keys
()
if
(
device_type
==
str_to_byte
(
"1"
))
and
((
str_to_byte
(
'online'
)
in
key_set
)
and
bytes
.
decode
(
is_online
))
and
(
str_to_byte
(
'laneId'
)
in
key_set
):
if
(
device_type
==
str_to_byte
(
"1"
))
\
and
(
str_to_byte
(
'online'
)
in
key_set
)
\
and
(
bytes
.
decode
(
is_online
)
in
[
"true"
or
"True"
])
\
and
(
str_to_byte
(
'laneId'
)
in
key_set
):
truck_locate
=
key_value_dict
[
str_to_byte
(
'laneId'
)]
truck_locate
=
key_value_dict
[
str_to_byte
(
'laneId'
)]
truck_locate_dict
[
truck_name_to_uuid_dict
[
item
]]
=
eval
(
truck_locate
)
truck_locate_dict
[
truck_name_to_uuid_dict
[
item
]]
=
eval
(
truck_locate
)
except
Exception
as
es
:
except
Exception
as
es
:
...
@@ -370,7 +377,8 @@ class LaneInfo:
...
@@ -370,7 +377,8 @@ class LaneInfo:
# 对不存在的矿卡路段,实时速度设置为最高
# 对不存在的矿卡路段,实时速度设置为最高
for
lane_id
in
lane_set
:
for
lane_id
in
lane_set
:
if
lane_id
not
in
tmp_lane_set
:
if
lane_id
not
in
tmp_lane_set
:
self
.
lane_speed_dict
[
str
(
lane_id
)]
=
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
MaxSpeed
self
.
lane_speed_dict
[
str
(
lane_id
)]
=
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
MaxSpeed
lane_trucks_dict
[
str
(
lane_id
)]
=
1
lane_trucks_dict
[
str
(
lane_id
)]
=
1
# 各路段实时速度取平均
# 各路段实时速度取平均
...
...
path_plan/priority_control.py
View file @
7fca8604
...
@@ -20,18 +20,23 @@ class PriorityController():
...
@@ -20,18 +20,23 @@ class PriorityController():
self
.
excavator
=
excavator
self
.
excavator
=
excavator
self
.
truck
=
truck
self
.
truck
=
truck
def
period_update
(
self
,
dump
,
excavator
,
truck
):
# 获取日志器
# 设备类
self
.
logger
=
get_logger
(
"zxt.prio"
)
self
.
dump
=
dump
self
.
excavator
=
excavator
self
.
truck
=
truck
def
weighted_walk_cost
(
self
):
def
weighted_walk_calc
(
self
):
"""
计算运输路线权重, 权重影响因素:设备优先级, 物料优先级,
:return:
walk_weight: 卸载-装载区 路网权重
park_walk_weight: 备停区-装载区 路网权重
"""
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_dump_set
=
get_value
(
"dynamic_dump_set"
)
dynamic_dump_set
=
get_value
(
"dynamic_dump_set"
)
dynamic_excavator_set
=
get_value
(
"dynamic_excavator_set"
)
dynamic_excavator_set
=
get_value
(
"dynamic_excavator_set"
)
walk_weight
=
np
.
ones
((
dynamic_dump_num
,
dynamic_excavator_num
))
walk_to_excavator_weight
=
np
.
ones
((
dynamic_dump_num
,
dynamic_excavator_num
))
walk_to_dump_weight
=
np
.
ones
((
dynamic_excavator_num
,
dynamic_dump_num
))
excavator_priority
=
self
.
excavator
.
excavator_priority_coefficient
excavator_priority
=
self
.
excavator
.
excavator_priority_coefficient
excavator_material_priority
=
self
.
excavator
.
excavator_material_priority
excavator_material_priority
=
self
.
excavator
.
excavator_material_priority
dump_priority
=
self
.
dump
.
dump_priority_coefficient
dump_priority
=
self
.
dump
.
dump_priority_coefficient
...
@@ -45,8 +50,8 @@ class PriorityController():
...
@@ -45,8 +50,8 @@ class PriorityController():
for
excavator_id
in
dynamic_excavator_set
:
for
excavator_id
in
dynamic_excavator_set
:
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
excavator_inedx
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
excavator_inedx
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
walk_
weight
[
dump_index
][
excavator_inedx
]
+=
dump_priority
[
dump_index
]
*
\
walk_
to_excavator_weight
[
dump_index
][
excavator_inedx
]
+=
excavator_priority
[
excavator_inedx
]
excavator_priority
[
excavator_ined
x
]
walk_to_dump_weight
[
excavator_inedx
][
dump_index
]
+=
dump_priority
[
dump_inde
x
]
park_walk_weight
=
park_walk_weight
*
self
.
excavator
.
excavator_priority_coefficient
park_walk_weight
=
park_walk_weight
*
self
.
excavator
.
excavator_priority_coefficient
rule7
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
7
)
.
first
()
rule7
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
7
)
.
first
()
...
@@ -56,29 +61,67 @@ class PriorityController():
...
@@ -56,29 +61,67 @@ class PriorityController():
for
excavator_id
in
dynamic_excavator_set
:
for
excavator_id
in
dynamic_excavator_set
:
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
excavator_inedx
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
excavator_inedx
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
walk_
weight
[
dump_index
][
excavator_inedx
]
+=
dump_material_priority
[
dump_index
]
*
\
walk_
to_excavator_weight
[
dump_index
][
excavator_inedx
]
+=
excavator_material_priority
[
excavator_inedx
]
excavator_material_priority
[
excavator_ined
x
]
walk_to_dump_weight
[
excavator_inedx
][
dump_index
]
+=
dump_material_priority
[
dump_inde
x
]
park_walk_weight
=
park_walk_weight
*
self
.
excavator
.
excavator_material_priority
park_walk_weight
=
park_walk_weight
*
self
.
excavator
.
excavator_material_priority
try
:
try
:
walk_weight
=
walk_weight
-
(
walk_weight
.
min
()
-
1
)
walk_to_excavator_weight
=
walk_to_excavator_weight
-
(
walk_to_excavator_weight
.
min
()
-
1
)
walk_to_dump_weight
=
walk_to_dump_weight
-
(
walk_to_dump_weight
.
min
()
-
1
)
park_walk_weight
=
park_walk_weight
-
(
park_walk_weight
.
min
()
-
1
)
park_walk_weight
=
park_walk_weight
-
(
park_walk_weight
.
min
()
-
1
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
errro
(
es
)
self
.
logger
.
errro
(
es
)
logger
.
error
(
"数值异常"
)
self
.
logger
.
error
(
"优先级归一化异常"
)
return
walk_to_excavator_weight
,
walk_to_dump_weight
,
park_walk_weight
def
walk_available_calc
(
self
):
"""
计算路网可通行性(物料, 地图, 分组三者综合)
:return:
walk_available: 路网可通行性(dump_num, excavator_num)
"""
map_walk_available
=
self
.
update_map_walk_available
()
group_walk_available
=
self
.
update_group_walk_available
()
material_walk_available
=
self
.
update_material_walk_available
()
return
walk_weight
,
park_walk_weight
walk_available
=
map_walk_available
*
group_walk_available
*
material_walk_available
def
available_walk
(
self
):
return
walk_available
def
update_group_walk_available
(
self
):
"""
计算调度分组间的路网可通行性, 不同分组间路网不可通行
:return:
group_walk_available: 调度分组路网可通行性矩阵(dump_num, excavator_num)
"""
group_walk_available
=
np
.
zeros
((
get_value
(
"dynamic_dump_num"
),
get_value
(
"dynamic_excavator_num"
)))
for
dump_id
in
get_value
(
"dynamic_dump_set"
):
for
excavator_id
in
get_value
(
"dynamic_excavator_set"
):
item
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
dump_id
,
exactor_id
=
excavator_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
()
if
item
is
not
None
:
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
excavator_index
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
group_walk_available
[
dump_index
][
excavator_index
]
=
1
return
group_walk_available
def
update_material_walk_available
(
self
):
"""
更新物料兼容性下路网可通行性
:return:
walk_available: 物料兼容路网可通行性矩阵(dump_num, excavator_num)
"""
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_dump_set
=
get_value
(
"dynamic_dump_set"
)
dynamic_dump_set
=
get_value
(
"dynamic_dump_set"
)
dynamic_excavator_set
=
get_value
(
"dynamic_excavator_set"
)
dynamic_excavator_set
=
get_value
(
"dynamic_excavator_set"
)
walk_weight
=
np
.
zeros
((
dynamic_dump_num
,
dynamic_excavator_num
))
walk_available
=
np
.
ones
((
dynamic_dump_num
,
dynamic_excavator_num
))
print
(
"here"
)
print
(
dynamic_dump_set
)
try
:
try
:
...
@@ -86,24 +129,30 @@ class PriorityController():
...
@@ -86,24 +129,30 @@ class PriorityController():
for
excavator_id
in
dynamic_excavator_set
:
for
excavator_id
in
dynamic_excavator_set
:
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
excavator_inedx
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
excavator_inedx
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
# 两设备处理物料不同, 相关路网不可通行
if
self
.
excavator
.
excavator_material
[
excavator_id
]
!=
self
.
dump
.
dump_material
[
dump_id
]:
if
self
.
excavator
.
excavator_material
[
excavator_id
]
!=
self
.
dump
.
dump_material
[
dump_id
]:
walk_
weight
[
dump_index
][
excavator_inedx
]
+=
100000
0
walk_
available
[
dump_index
][
excavator_inedx
]
=
0
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
info
(
es
)
self
.
logger
.
info
(
es
)
logger
.
info
(
"error-12"
)
self
.
logger
.
info
(
"error-12"
)
return
walk_
weight
return
walk_
available
def
update_group_walk_available
(
self
):
def
update_map_walk_available
(
self
):
group_walk_available
=
np
.
full
((
get_value
(
"dynamic_dump_num"
),
get_value
(
"dynamic_excavator_num"
)),
1000000
)
"""
更新物理路网可通行性
:return:
walk_available: 物理路网可通行性矩阵(dump_num, excavator_num)
"""
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
walk_available
=
np
.
ones
((
dynamic_dump_num
,
dynamic_excavator_num
))
for
dump_id
in
get_value
(
"dynamic_dump_set"
):
walk_manage
.
period_walk_para_update
()
for
excavator_id
in
get_value
(
"dynamic_excavator_set"
):
item
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
dump_id
,
exactor_id
=
excavator_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
()
if
item
is
not
None
:
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
excavator_index
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
group_walk_available
[
dump_index
][
excavator_index
]
=
0
return
group_walk_available
for
dump_index
in
range
(
dynamic_dump_num
):
for
excavator_index
in
range
(
dynamic_excavator_num
):
if
walk_manage
.
distance_to_excavator
[
dump_index
][
excavator_index
]
>
M
/
2
:
walk_available
[
dump_index
][
excavator_index
]
=
0
return
walk_available
realtime_dispatch.py
View file @
7fca8604
...
@@ -16,952 +16,9 @@ from equipment.excavator import ExcavatorInfo
...
@@ -16,952 +16,9 @@ from equipment.excavator import ExcavatorInfo
from
equipment.dump
import
DumpInfo
from
equipment.dump
import
DumpInfo
import
sched
import
sched
import
time
import
time
from
group_control.group_control
import
Group
from
dispatcher
import
Dispatcher
,
PreSchedule
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
truck
=
TruckInfo
(
dump
,
excavator
)
# 调度类
class
Dispatcher
(
WalkManage
):
def
__init__
(
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
())
# 卡车完成装载及卸载时间(矿卡可用时间)
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
.
start_time
=
datetime
.
now
()
# self.relative_now_time = datetime.now() - self.start_time
self
.
path
=
PathPlanner
()
# 读取车流信息
self
.
traffic_flow
=
Traffic_flow
(
dump
,
excavator
,
truck
)
self
.
group
=
Group
(
dump
,
excavator
,
truck
,
self
.
traffic_flow
)
# 更新矿卡预计抵达目的地时间
def
update_truck_reach_time
(
self
):
try
:
dynamic_excavator_num
=
excavator
.
get_excavator_num
()
dumps
=
dump
.
get_dump_num
()
trucks
=
truck
.
get_truck_num
()
truck_current_task
=
truck
.
get_truck_current_task
()
truck_current_trip
=
truck
.
get_truck_current_trip
()
cur_truck_reach_excavator
=
truck
.
get_truck_reach_excavator
()
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
[
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
]
excavator_ava_ls
[
end_area_index
]
.
append
(
[
reach_time
,
i
,
end_area_index
]
)
elif
task
in
[
3
,
4
]:
reach_time
=
cur_truck_reach_dump
[
i
]
dump_ava_ls
[
end_area_index
]
.
append
([
reach_time
,
i
,
end_area_index
])
elif
task
==
-
2
:
self
.
cur_truck_ava_time
[
i
]
=
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
# print(truck_index_to_uuid_dict)
# print(excavator_ava_ls)
# print(dump_ava_ls)
except
Exception
as
es
:
logger
.
error
(
"矿卡预计抵达时间计算异常"
)
logger
.
error
(
es
)
return
excavator_ava_ls
,
dump_ava_ls
# 更新挖机预计可用时间
def
update_excavator_ava_time
(
self
,
excavator_ava_ls
):
# 初始化挖机可用时间
self
.
cur_excavator_ava_time
=
np
.
full
(
get_value
(
"dynamic_excavator_num"
),
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
),
)
loading_time
=
excavator
.
get_loading_time
()
loading_task_time
=
excavator
.
get_loading_task_time
()
try
:
now
=
float
(
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
)
for
reach_ls
in
excavator_ava_ls
:
if
len
(
reach_ls
)
!=
0
:
reach_ls
=
np
.
array
(
reach_ls
)
tmp
=
reach_ls
[
np
.
lexsort
(
reach_ls
[:,
::
-
1
]
.
T
)]
for
i
in
range
(
len
(
tmp
)):
excavator_index
=
int
(
tmp
[
i
][
2
])
self
.
cur_excavator_ava_time
[
excavator_index
]
=
(
max
(
tmp
[
i
][
0
],
self
.
cur_excavator_ava_time
[
excavator_index
])
+
loading_task_time
[
excavator_index
]
)
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])
]
=
self
.
cur_excavator_ava_time
[
excavator_index
]
# # 若挖机可用时间严重偏离,进行修正
# if abs(self.cur_excavator_ava_time[excavator_index] - now) > 60:
# self.cur_truck_ava_time[int(tmp[i][1])] = now
# if abs(self.cur_excavator_ava_time[excavator_index] - now) > 60:
# self.cur_excavator_ava_time[excavator_index] = now
except
Exception
as
es
:
logger
.
error
(
"挖机可用时间计算异常"
)
logger
.
error
(
es
)
# 更新卸载设备预计可用时间
def
update_dump_ava_time
(
self
,
dump_ava_ls
):
dynamic_dump_num
=
dump
.
get_dump_num
()
# 初始化卸载设备可用时间
self
.
cur_dump_ava_time
=
np
.
full
(
dynamic_dump_num
,
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
),
)
unloading_time
=
dump
.
get_unloading_time
()
unloading_task_time
=
dump
.
get_unloading_task_time
()
try
:
now
=
float
(
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
)
for
reach_ls
in
dump_ava_ls
:
if
len
(
reach_ls
)
!=
0
:
reach_ls
=
np
.
array
(
reach_ls
)
tmp
=
reach_ls
[
np
.
lexsort
(
reach_ls
[:,
::
-
1
]
.
T
)]
for
i
in
range
(
len
(
tmp
)):
dump_index
=
int
(
tmp
[
i
][
2
])
self
.
cur_dump_ava_time
[
dump_index
]
=
(
max
(
tmp
[
i
][
0
],
self
.
cur_dump_ava_time
[
dump_index
])
+
unloading_task_time
[
dump_index
]
)
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])
]
=
self
.
cur_dump_ava_time
[
dump_index
]
# # 若卸载设备可用时间严重偏离,进行修正
# if abs(self.cur_dump_ava_time[dump_index] - now) > 60:
# self.cur_dump_ava_time[dump_index] = now
# if abs(self.cur_truck_ava_time[int(tmp[i][1])] - now) > 60:
# self.cur_truck_ava_time[int(tmp[i][1])] = now
except
Exception
as
es
:
logger
.
error
(
"卸载设备可用时间计算异常"
)
logger
.
error
(
es
)
def
dispatcher_period_update
(
self
):
# 装载映射参数及
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
# 更新卸载设备对象
dump
.
para_period_update
()
# 更新挖机对象
excavator
.
para_period_update
()
# 更新矿卡对象
truck
.
para_period_update
(
dump
,
excavator
)
truck
.
state_period_update
()
# 更新实时车流
# self.update_actual_traffic_flow()
self
.
traffic_flow
.
update_actual_traffic_flow
()
# 矿卡抵达时间
excavator_reach_list
,
dump_reach_list
=
self
.
update_truck_reach_time
()
# 挖机可用时间
self
.
update_excavator_ava_time
(
excavator_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
.
group
.
period_update
()
def
sim_para_reset
(
self
):
# 设备可用时间重置
self
.
sim_truck_ava_time
=
copy
.
deepcopy
(
self
.
cur_truck_ava_time
)
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
())
# 卡车完成装载及卸载时间(矿卡可用时间)
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
())]
def
truck_schedule
(
self
,
truck_id
):
# 规则读取
global
transport_value
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
.
disabled
rule4
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
4
)
.
first
()
.
disabled
# 读取优先级设置
excavator_priority_coefficient
=
excavator
.
excavator_priority_coefficient
excavator_material_priority
=
excavator
.
excavator_material_priority
# 矿卡对应序号
truck_index
=
truck
.
truck_uuid_to_index_dict
[
truck_id
]
# 矿卡行程
trip
=
truck
.
get_truck_current_trip
()[
truck_index
]
# 矿卡当前任务
task
=
truck
.
get_truck_current_task
()[
truck
.
truck_index_to_uuid_dict
[
truck_index
]]
if
truck_id
not
in
self
.
group
.
dispatch_truck_group
:
logger
.
error
(
"无该矿卡"
)
return
-
1
# 矿卡调度分组
group_id
=
self
.
group
.
dispatch_truck_group
[
truck_id
]
dynamic_dump_num
=
dump
.
get_dump_num
()
dynamic_excavator_num
=
excavator
.
get_excavator_num
()
target
=
0
# 是否启用挖机均衡
rule_ex
=
False
# 车流计算
# 驶往卸载设备的实际车流
actual_goto_dump_traffic_flow
=
self
.
traffic_flow
.
actual_goto_dump_traffic_flow
# 驶往挖机的实际车流
actual_goto_excavator_traffic_flow
=
self
.
traffic_flow
.
actual_goto_excavator_traffic_flow
# 计算理想车流
opt_goto_dump_traffic_flow
,
opt_goto_excavator_traffic_flow
=
traffic_flow_plan
(
truck
)
logger
.
info
(
"=========================================================="
)
logger
.
info
(
f
"调度矿卡 {truck_id} {truck_index} {truck_uuid_to_name_dict[truck_id]}"
)
if
task
==
-
2
:
try
:
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
logger
.
info
(
"矿卡行程:无"
)
logger
.
info
(
f
"涉及挖机:{list(excavator.excavator_uuid_to_index_dict.keys())}"
)
logger
.
info
(
"物料类型"
)
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
(
"挖机设备优先级"
)
logger
.
info
(
excavator_priority_coefficient
)
logger
.
info
(
"分组车流"
)
logger
.
info
(
self
.
group
.
group_actual_goto_dump_traffic_flow
[
group_id
])
logger
.
info
(
self
.
group
.
group_opt_goto_dump_traffic_flow
[
group_id
])
except
Exception
as
es
:
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
logger
.
error
(
es
)
try
:
# 1. 矿卡是否存在绑定挖机
if
truck_id
in
truck
.
truck_excavator_bind
:
target
=
excavator
.
excavator_uuid_to_index_dict
[
truck
.
truck_excavator_bind
[
truck_id
]]
# 2. 正常调度
elif
not
rule_ex
:
transport_value
=
self
.
group
.
group_park_to_excavator
[
group_id
]
excavator_exclude_modify
=
self
.
group
.
group_excavator_exclude_modify
[
truck_id
]
# excavator_material_bind_modify = self.group.group_excavator_material_bind_modify[truck_id]
logger
.
info
(
"transport_value"
)
logger
.
info
(
transport_value
)
target
=
np
.
argmin
(
transport_value
+
excavator_exclude_modify
)
# + excavator_material_bind_modify)
target
=
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
# 3. 启用饱和度调度
else
:
logger
.
info
(
"饱和度调度"
)
logger
.
info
(
truck
.
excavator_hold_truck_num
)
logger
.
info
(
np
.
mean
(
truck
.
payload
))
logger
.
info
(
self
.
group
.
update_excavator_hold_truck
(
truck
.
excavator_hold_truck_num
))
excavator_hold_truck
=
self
.
group
.
update_excavator_hold_truck
(
truck
.
excavator_hold_truck_num
)[
group_id
]
actual_flow_to_excavator
=
excavator_hold_truck
*
np
.
mean
(
truck
.
payload
)
/
self
.
group
.
group_park_to_excavator
[
group_id
]
.
reshape
(
1
,
-
1
)
.
flatten
()
# allow_flow_to_excavator = excavator.excavator_strength
allow_flow_to_excavator
=
self
.
group
.
update_allow_flow_to_excavator
()[
group_id
]
target
=
np
.
argmin
(
actual_flow_to_excavator
/
allow_flow_to_excavator
)
target
=
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
logger
.
info
(
excavator
.
excavator_uuid_to_index_dict
)
logger
.
info
(
self
.
group
.
group_excavator_uuid_to_index_dict
)
logger
.
info
(
f
"目的地:{excavator.excavator_index_to_uuid_dict[target]}"
)
except
Exception
as
es
:
logger
.
error
(
"error07"
)
logger
.
error
(
es
)
if
task
in
[
0
,
1
,
2
]:
try
:
logger
.
info
(
"矿卡状态:矿卡空载"
)
logger
.
info
(
f
"涉及卸载设备:{list(dump.dump_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
logger
.
error
(
es
)
try
:
assert
np
.
array
(
actual_goto_dump_traffic_flow
)
.
shape
==
(
dynamic_excavator_num
,
dynamic_dump_num
,)
assert
np
.
array
(
opt_goto_dump_traffic_flow
)
.
shape
==
(
dynamic_excavator_num
,
dynamic_dump_num
,)
except
Exception
as
es
:
logger
.
warning
(
es
)
actual_goto_dump_traffic_flow
=
np
.
array
(
actual_goto_dump_traffic_flow
)
.
reshape
((
dynamic_excavator_num
,
dynamic_dump_num
))
opt_goto_dump_traffic_flow
=
np
.
array
(
opt_goto_dump_traffic_flow
)
.
reshape
((
dynamic_excavator_num
,
dynamic_dump_num
))
actual_goto_dump_traffic_flow
=
np
.
array
(
actual_goto_dump_traffic_flow
)
opt_goto_dump_traffic_flow
=
np
.
array
(
opt_goto_dump_traffic_flow
)
# 日志记录部分
try
:
logger
.
info
(
"挖机id:"
)
logger
.
info
(
excavator
.
excavator_uuid_to_index_dict
)
logger
.
info
(
"卸点id:"
)
logger
.
info
(
dump
.
dump_uuid_to_index_dict
)
logger
.
info
(
f
"卸载点实际车流:"
)
logger
.
info
(
actual_goto_dump_traffic_flow
)
logger
.
info
(
f
"卸载点理想车流:"
)
logger
.
info
(
opt_goto_dump_traffic_flow
)
logger
.
info
(
"卸载点实际车流"
)
logger
.
info
(
actual_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:])
logger
.
info
(
"卸载点理想车流"
)
logger
.
info
(
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:])
logger
.
info
(
"空载trip"
)
logger
.
info
(
trip
)
logger
.
info
(
"物料类型"
)
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
(
truck
.
dump_material_bind_modify
)
except
Exception
as
es
:
logger
.
info
(
"车流及修正因子"
)
logger
.
info
(
es
)
# 1. 绑定调度
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
# 2. 正常调度
elif
not
rule_ex
:
try
:
excavator_index
=
int
(
trip
[
1
])
excavator_id
=
excavator
.
excavator_index_to_uuid_dict
[
excavator_index
]
print
(
self
.
group
.
group_excavator_uuid_to_index_dict
[
group_id
])
group_excavator_index
=
self
.
group
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
# 2.1 正常调度
if
rule3
and
rule4
:
try
:
# ga changed
# transport_value = self.cost_to_dump[:, int(trip[1])]
# transport_value = self.group.group_walk_to_dump_cost[group_excavator_index]
transport_value
=
self
.
group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
except
Exception
as
es
:
logger
.
error
(
"error10"
)
logger
.
error
(
es
)
logger
.
error
(
"group_id"
)
logger
.
error
(
group_id
)
logger
.
error
(
'self.group.group_walk_to_dump_cost'
)
logger
.
error
(
self
.
group
.
group_walk_to_dump_cost
)
logger
.
error
(
'self.group.group_walk_to_excavator_cost'
)
logger
.
error
(
self
.
group
.
group_walk_to_excavator_cost
)
logger
.
error
(
'self.group.group_excavator_uuid_to_index_dict[group_id][excavator_id]'
)
logger
.
error
(
self
.
group
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
])
logger
.
error
(
"self.group.group_excavator_uuid_to_index_dict[group_id]"
)
logger
.
error
(
self
.
group
.
group_excavator_uuid_to_index_dict
[
group_id
])
# 2.2 车流规划
else
:
try
:
# 计算 group actual traffic flow
group_actual_goto_dump_traffic_flow
=
self
.
group
.
group_actual_goto_dump_traffic_flow
[
group_id
]
# 计算 group actual traffic flow
group_opt_goto_dump_traffic_flow
=
self
.
group
.
group_opt_goto_dump_traffic_flow
[
group_id
]
logger
.
info
(
"驶往卸点分组车流"
)
logger
.
info
(
group_actual_goto_dump_traffic_flow
)
logger
.
info
(
group_opt_goto_dump_traffic_flow
)
try
:
transport_value
=
(
group_actual_goto_dump_traffic_flow
[
group_excavator_index
,
:]
+
0.001
)
\
/
(
group_opt_goto_dump_traffic_flow
[
group_excavator_index
,
:]
+
0.001
)
except
Exception
as
es
:
logger
.
error
(
"error09"
)
logger
.
error
(
es
)
except
Exception
as
es
:
logger
.
error
(
"error11"
)
logger
.
error
(
es
)
logger
.
info
(
"transport_value"
)
logger
.
info
(
transport_value
)
logger
.
info
(
"dump_material_bind_modify"
)
logger
.
info
(
truck
.
dump_material_bind_modify
[
truck_index
])
try
:
dump_material_bind_modify
=
self
.
group
.
group_dump_material_bind_modify
[
truck_id
]
except
Exception
as
es
:
logger
.
error
(
"error13"
)
logger
.
error
(
es
)
logger
.
error
(
"self.group.group_dump_material_bind_modify"
)
logger
.
error
(
self
.
group
.
group_dump_material_bind_modify
)
try
:
target
=
np
.
argmin
(
transport_value
.
T
+
dump_material_bind_modify
)
target
=
dump
.
dump_uuid_to_index_dict
[
self
.
group
.
group_dump_index_to_uuid_dict
[
group_id
][
target
]]
logger
.
info
(
"target"
)
logger
.
info
(
target
)
except
Exception
as
es
:
logger
.
error
(
"error12"
)
logger
.
error
(
es
)
logger
.
error
(
"target"
)
logger
.
error
(
target
)
logger
.
error
(
"transport_value"
)
logger
.
error
(
transport_value
)
logger
.
error
(
type
(
transport_value
))
logger
.
error
(
transport_value
.
T
)
logger
.
error
(
"dump_material_bind_modify"
)
logger
.
error
(
dump_material_bind_modify
)
logger
.
error
(
"self.group.group_dump_index_to_uuid_dict"
)
logger
.
error
(
self
.
group
.
group_dump_index_to_uuid_dict
)
logger
.
error
(
"self.group.group_dump_index_to_uuid_dict[group_id]"
)
logger
.
error
(
self
.
group
.
group_dump_index_to_uuid_dict
[
group_id
])
try
:
logger
.
info
(
"车流比:"
)
logger
.
info
((
actual_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
)
\
/
(
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
))
except
Exception
as
es
:
logger
.
error
(
"error08"
)
logger
.
error
(
es
)
except
Exception
as
es
:
logger
.
error
(
"error06"
)
logger
.
error
(
es
)
# 3. 饱和度调度
else
:
logger
.
info
(
"和度调度"
)
excavator_index
=
int
(
trip
[
1
])
transport_value
=
self
.
group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
.
reshape
(
1
,
-
1
)
dump_hold_truck
=
self
.
group
.
update_dump_hold_truck
(
truck
.
dump_hold_truck_num
)[
group_id
]
actual_flow_to_dump
=
dump_hold_truck
*
truck
.
payload
/
\
self
.
group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
.
reshape
(
1
,
-
1
)
allow_flow_to_dump
=
dump
.
dump_strength
allow_flow_to_dump
=
self
.
group
.
update_allow_flow_to_dump
()[
group_id
]
target
=
np
.
argmax
((
1
-
actual_flow_to_dump
/
allow_flow_to_dump
)
/
transport_value
)
target
=
dump
.
dump_uuid_to_index_dict
[
self
.
group
.
group_dump_index_to_uuid_dict
[
group_id
][
target
]]
logger
.
info
(
f
"目的地:{dump.dump_index_to_uuid_dict[target]}"
)
elif
task
in
[
3
,
4
,
5
]:
try
:
logger
.
info
(
"矿卡状态:矿卡重载"
)
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
(
actual_goto_excavator_traffic_flow
)
.
shape
==
(
dynamic_dump_num
,
dynamic_excavator_num
,)
assert
np
.
array
(
opt_goto_excavator_traffic_flow
)
.
shape
==
(
dynamic_dump_num
,
dynamic_excavator_num
,)
except
Exception
as
es
:
logger
.
warning
(
es
)
actual_goto_excavator_traffic_flow
=
np
.
array
(
actual_goto_excavator_traffic_flow
)
.
reshape
((
dynamic_dump_num
,
dynamic_excavator_num
))
opt_goto_excavator_traffic_flow
=
np
.
array
(
opt_goto_excavator_traffic_flow
)
.
reshape
((
dynamic_dump_num
,
dynamic_excavator_num
))
# 不知道为什么,偶尔变成了list
actual_goto_excavator_traffic_flow
=
np
.
array
(
actual_goto_excavator_traffic_flow
)
opt_goto_excavator_traffic_flow
=
np
.
array
(
opt_goto_excavator_traffic_flow
)
try
:
logger
.
info
(
"挖机id:"
)
logger
.
info
(
excavator
.
excavator_uuid_to_index_dict
)
logger
.
info
(
"卸点id:"
)
logger
.
info
(
dump
.
dump_uuid_to_index_dict
)
logger
.
info
(
f
"挖机实际车流:"
)
logger
.
info
(
actual_goto_excavator_traffic_flow
)
logger
.
info
(
f
"挖机理想车流:"
)
logger
.
info
(
opt_goto_excavator_traffic_flow
)
logger
.
info
(
"重载trip"
)
logger
.
info
(
trip
)
logger
.
info
(
"物料类型"
)
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
(
truck
.
excavator_material_bind_modify
)
logger
.
info
(
"挖机优先级修正"
)
logger
.
info
(
excavator
.
excavator_priority_coefficient
)
except
Exception
as
es
:
logger
.
info
(
"车流及修正因子"
)
logger
.
info
(
es
)
# 计算目的地
try
:
# 1. 绑定调度
if
truck_id
in
truck
.
truck_excavator_bind
:
target
=
excavator
.
excavator_uuid_to_index_dict
[
truck
.
truck_excavator_bind
[
truck_id
]]
logger
.
info
(
"矿卡已绑定挖机"
)
# 2. 正常调度
elif
not
rule_ex
:
logger
.
info
(
"cost_to_excavator"
)
logger
.
info
(
self
.
cost_to_excavator
)
dump_index
=
int
(
trip
[
1
])
dump_id
=
dump
.
dump_uuid_to_index_dict
[
dump_index
]
# 2.1 正常调度
if
rule3
and
rule4
:
# transport_value = self.cost_to_excavator[int(trip[1]), :]
transport_value
=
self
.
group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
# 2.2 车流规划
else
:
group_dump_index
=
self
.
group
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
# 提取group actual traffic flow
group_actual_goto_excavator_traffic_flow
=
self
.
group
.
group_actual_goto_excavator_traffic_flow
[
group_id
]
# 提取group actual traffic flow
group_opt_goto_excavator_traffic_flow
=
self
.
group
.
group_opt_goto_excavator_traffic_flow
[
group_id
]
logger
.
info
(
"驶往挖机分组车流"
)
logger
.
info
(
group_actual_goto_excavator_traffic_flow
)
logger
.
info
(
group_opt_goto_excavator_traffic_flow
)
transport_value
=
(
group_actual_goto_excavator_traffic_flow
[
group_dump_index
,
:]
+
0.001
)
\
/
(
group_opt_goto_excavator_traffic_flow
[
group_dump_index
,
:]
+
0.001
)
# 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])
excavator_exclude_modify
=
self
.
group
.
group_excavator_exclude_modify
[
truck_id
]
excavator_material_bind_modify
=
self
.
group
.
group_excavator_material_bind_modify
[
truck_id
]
logger
.
info
(
transport_value
)
target
=
np
.
argmin
(
transport_value
.
T
+
excavator_exclude_modify
)
# + excavator_material_bind_modify)
target
=
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
# 3. 饱和度调度
else
:
logger
.
info
(
"和度调度"
)
dump_index
=
int
(
trip
[
1
])
transport_value
=
self
.
group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
.
reshape
(
1
,
-
1
)
excavator_hold_truck
=
self
.
group
.
update_excavator_hold_truck
(
truck
.
excavator_hold_truck_num
)[
group_id
]
actual_flow_to_excavator
=
excavator_hold_truck
*
truck
.
payload
/
\
self
.
group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
.
reshape
(
1
,
-
1
)
# allow_flow_to_excavator = excavator.excavator_strength
allow_flow_to_excavator
=
self
.
group
.
update_allow_flow_to_excavator
()[
group_id
]
target
=
np
.
argmax
((
1
-
actual_flow_to_excavator
/
allow_flow_to_excavator
)
/
transport_value
)
target
=
excavator
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
except
Exception
as
es
:
logger
.
info
(
"trip出错1"
)
logger
.
info
(
es
)
try
:
logger
.
info
(
"车流比:"
)
logger
.
info
(
(
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
/
(
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
))
except
Exception
as
es
:
logger
.
info
(
"trip出错2"
)
logger
.
info
(
es
)
logger
.
info
(
f
"目的地:{excavator.excavator_index_to_uuid_dict[target]}"
)
logger
.
info
(
"=========================================================="
)
print
(
target
)
# except Exception as es:
# logger.error("truck_schedule,error")
# logger.error(es)
return
target
def
schedule_construct
(
self
):
global
truck
global
excavator
global
dump
self
.
reset
()
print
(
"self.cur_truck_ava_time"
,
self
.
cur_truck_ava_time
)
try
:
# 读取所需信息
dynamic_truck_num
=
get_value
(
"dynamic_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
()
# 出入场时间
loading_task_time
=
excavator
.
get_loading_task_time
()
unloading_task_time
=
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
()
# Seq初始化
Seq
=
[[
truck_current_trip
[
i
][
1
],
-
1
]
for
i
in
range
(
dynamic_truck_num
)]
# 根据矿卡最早可用时间顺序进行规划
print
(
self
.
cur_truck_ava_time
)
print
(
truck
.
truck_priority
)
temp
=
copy
.
deepcopy
(
self
.
cur_truck_ava_time
)
-
truck
.
truck_priority
try
:
# 没有启动的矿卡加上一个很大的值,降低其优先级
for
i
in
range
(
dynamic_truck_num
):
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
i
]]
if
task
==
-
2
:
temp
[
i
]
=
temp
[
i
]
+
M
except
Exception
as
es
:
logger
.
error
(
"矿卡排序启动异常"
)
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:
# 获取矿卡id
try
:
truck_id
=
truck
.
truck_index_to_uuid_dict
[
truck_index
]
except
Exception
as
es
:
logger
.
error
(
'error01'
)
logger
.
error
(
es
)
# 判断矿卡是否禁用
if
truck_id
in
truck
.
update_truck_disable_list
():
continue
try
:
# 获取矿卡当前任务
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
truck_index
]]
except
Exception
as
es
:
logger
.
error
(
'error02'
)
logger
.
error
(
es
)
try
:
# 矿卡结束当前派车计划后的目的地
end_eq_index
=
truck_current_trip
[
truck_index
][
1
]
except
Exception
as
es
:
logger
.
error
(
'error03'
)
logger
.
error
(
es
)
try
:
# 调用调度函数,得到最优目的地序号
target_eq_index
=
self
.
truck_schedule
(
truck
.
truck_index_to_uuid_dict
[
truck_index
])
except
Exception
as
es
:
logger
.
error
(
'error04'
)
logger
.
error
(
es
)
logger
.
error
(
"truck_index,uuid"
)
logger
.
error
(
truck_index
)
logger
.
error
(
truck
.
truck_index_to_uuid_dict
[
truck_index
])
# logger.("target_eq_index")
# logger.error(target_eq_index)
try
:
# 写入Seq序列
Seq
[
truck_index
][
1
]
=
target_eq_index
except
Exception
as
es
:
logger
.
error
(
'error05'
)
logger
.
error
(
es
)
logger
.
error
(
"target_eq_index"
)
logger
.
error
(
target_eq_index
)
logger
.
error
(
"target_eq_index,type"
)
logger
.
error
(
type
(
target_eq_index
))
# except Exception as es:
# logger.error("truck,task,end_eq_index,error")
# logger.error(es)
try
:
group_id
=
self
.
group
.
dispatch_truck_group
[
truck_id
]
except
Exception
as
es
:
logger
.
error
(
"非动态调度矿卡"
)
logger
.
error
(
es
)
# except Exception as es:
# # logger.error(f'矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck_index]]} 派车计划计算异常')
# logger.error(f'矿卡派车计划计算异常')
# 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
]
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
:
try
:
truck_id
=
truck
.
truck_index_to_uuid_dict
[
i
]
group_id
=
self
.
group
.
dispatch_truck_group
[
truck_id
]
record
=
{
"truckId"
:
truck
.
truck_index_to_uuid_dict
[
i
]}
task
=
truck
.
get_truck_current_task
()[
truck
.
truck_index_to_uuid_dict
[
i
]]
except
Exception
as
es
:
logger
.
error
(
"truck_id,group_id,record,task出错"
)
logger
.
error
(
es
)
if
task
in
empty_task_set
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
dump
.
dump_index_to_uuid_dict
[
Seq
[
i
][
1
]],
exactor_id
=
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
0
]],
truck_id
=
truck_id
,
group_id
=
group_id
,
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
=
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
dump_id
=
dump
.
dump_index_to_uuid_dict
[
Seq
[
i
][
0
]],
truck_id
=
truck_id
,
group_id
=
group_id
,
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
:
try
:
try
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
# truck_id=truck_id,
group_id
=
group_id
,
isauto
=
1
,
isdeleted
=
0
,
)
.
first
())
except
Exception
as
es
:
logger
.
error
(
"task-2,error01"
)
logger
.
error
(
es
)
logger
.
error
(
'excavator.excavator_index_to_uuid_dict[Seq[i][1]]'
)
logger
.
error
(
excavator
.
excavator_index_to_uuid_dict
)
logger
.
error
(
"seq[i]"
)
logger
.
error
(
Seq
[
i
])
logger
.
error
(
"group_id"
)
logger
.
error
(
group_id
)
try
:
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"
)
except
Exception
as
es
:
logger
.
error
(
"task-2,error02"
)
logger
.
error
(
es
)
except
Exception
as
es
:
logger
.
error
(
"task为-2时error"
)
logger
.
error
(
es
)
else
:
pass
redis5
.
set
(
truck
.
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
(
dynamic_truck_num
):
print
(
"dispatch_setting:"
)
print
(
redis5
.
get
(
truck
.
truck_index_to_uuid_dict
[
i
]))
except
Exception
as
es
:
logger
.
error
(
"更新不及时-1"
)
logger
.
error
(
es
)
return
Seq
# 下面三个函数保证程序定期执行,不用管他
def
process
(
dispatcher
):
def
process
(
dispatcher
):
try
:
try
:
...
@@ -975,9 +32,6 @@ def process(dispatcher):
...
@@ -975,9 +32,6 @@ def process(dispatcher):
if
get_value
(
"dynamic_truck_num"
)
==
0
:
if
get_value
(
"dynamic_truck_num"
)
==
0
:
raise
Exception
(
"无动态派车可用矿卡"
)
raise
Exception
(
"无动态派车可用矿卡"
)
return
return
# para_process(dispatcher)
#
# state_process(dispatcher)
# 清空数据库缓存
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
commit
()
...
@@ -986,16 +40,10 @@ def process(dispatcher):
...
@@ -986,16 +40,10 @@ def process(dispatcher):
# 清空数据库缓存
# 清空数据库缓存
session_postgre
.
commit
()
session_postgre
.
commit
()
session_postgre
.
flush
()
session_postgre
.
flush
()
#
# # 周期更新
# dispatcher.para_period_update()
# 周期更新
# 周期更新
dispatcher
.
dispatcher_period_update
()
dispatcher
.
dispatcher_period_update
()
# 参数重置
dispatcher
.
sim_para_reset
()
# try:
# try:
# 调度计算
# 调度计算
...
@@ -1011,25 +59,54 @@ def process(dispatcher):
...
@@ -1011,25 +59,54 @@ def process(dispatcher):
logger
.
error
(
"最外层异常捕获"
)
logger
.
error
(
"最外层异常捕获"
)
logger
.
error
(
es
)
logger
.
error
(
es
)
period_para_update
()
scheduler
=
sched
.
scheduler
(
time
.
time
,
time
.
sleep
)
dispatcher
=
Dispatcher
()
def
perform
(
inc
,
dispatcher
):
def
perform
(
inc
,
dispatcher
):
"""
控制程序循环执行
:param inc: (int) 循环周期, 单位, 秒
:param dispatcher: (Dispatch Class) 矿卡调度类对象
:return: None
"""
scheduler
.
enter
(
inc
,
0
,
perform
,
(
inc
,
dispatcher
))
scheduler
.
enter
(
inc
,
0
,
perform
,
(
inc
,
dispatcher
))
process
(
dispatcher
)
process
(
dispatcher
)
def
main
(
inc
,
dispatcher
):
def
main
(
inc
,
dispatcher
):
"""
程序循环入口函数
:param inc: (int) 循环周期, 单位, 秒
:param dispatcher: (Dispatch Class) 矿卡调度类对象
:return: None
"""
scheduler
.
enter
(
0
,
0
,
perform
,
(
inc
,
dispatcher
))
scheduler
.
enter
(
0
,
0
,
perform
,
(
inc
,
dispatcher
))
scheduler
.
run
()
scheduler
.
run
()
if
__name__
==
"__main__"
:
if
__name__
==
"__main__"
:
# 初始化日志
set_log
()
# 获取日志器
logger
=
get_logger
(
"zxt.main"
)
# 全局参数更新
period_para_update
()
# 实例化设备对象
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
truck
=
TruckInfo
(
dump
,
excavator
)
# 实例化程序调度器
scheduler
=
sched
.
scheduler
(
time
.
time
,
time
.
sleep
)
# 实例化调度预测器
pre_sch
=
PreSchedule
(
truck
,
excavator
,
dump
)
# 实例化矿卡调度器
dispatcher
=
Dispatcher
(
dump
,
excavator
,
truck
,
pre_sch
)
logger
.
info
(
" "
)
logger
.
info
(
" "
)
logger
.
info
(
"调度系统启动"
)
logger
.
info
(
"调度系统启动"
)
# dispatcher = Dispatcher()
main
(
10
,
dispatcher
)
main
(
10
,
dispatcher
)
settings.py
View file @
7fca8604
...
@@ -48,32 +48,38 @@ dump_target_mass = para_config["dump_target_mass"]
...
@@ -48,32 +48,38 @@ dump_target_mass = para_config["dump_target_mass"]
excavator_target_mass
=
para_config
[
"excavator_target_mass"
]
excavator_target_mass
=
para_config
[
"excavator_target_mass"
]
# 创建日志
def
set_log
():
########################################################################################################################
# 日志存储地址
# 创建日志
log_path
=
para_config
[
"log_path"
]
########################################################################################################################
# 日志存储地址
log_path
=
para_config
[
"log_path"
]
# 创建日志目录
# 创建日志目录
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
()
logger
=
logging
.
getLogger
(
"zxt"
)
logger
.
setLevel
(
logging
.
INFO
)
logger
=
logging
.
getLogger
(
__name__
)
logger
.
setLevel
(
logging
.
INFO
)
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
filehandler
=
logging
.
handlers
.
RotatingFileHandler
(
log_path
+
"/dispatch.log"
,
maxBytes
=
3
*
1024
*
1024
,
backupCount
=
10
)
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样
filehandler
.
suffix
=
"
%
Y-
%
m-
%
d_
%
H-
%
M.log"
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
formatter
=
logging
.
Formatter
(
"
%(asctime)
s -
%(name)
s:
%(levelname)
s
%(filename)
s
%(message)
s"
)
filehandler
.
setFormatter
(
formatter
)
logger
.
addHandler
(
filehandler
)
filehandler
=
logging
.
handlers
.
RotatingFileHandler
(
log_path
+
"/dispatch.log"
,
maxBytes
=
3
*
1024
*
1024
,
backupCount
=
10
)
# filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10)
# 设置后缀名称,跟strftime的格式一样
filehandler
.
suffix
=
"
%
Y-
%
m-
%
d_
%
H-
%
M.log"
formatter
=
logging
.
Formatter
(
"
%(asctime)
s -
%(name)
s:
%(levelname)
s
%(filename)
s
%(message)
s"
)
def
get_logger
(
module_name
):
filehandler
.
setFormatter
(
formatter
)
logger
=
logging
.
getLogger
(
module_name
)
logger
.
addHandler
(
filehandler
)
return
logger
# 连接reids
# 连接reids
...
...
static_data_process.py
View file @
7fca8604
...
@@ -11,6 +11,7 @@
...
@@ -11,6 +11,7 @@
from
settings
import
*
from
settings
import
*
logger
=
get_logger
(
"zxt.static_data_process"
)
def
build_work_area_uuid_index_map
():
def
build_work_area_uuid_index_map
():
# load_area_id <-> load_area_index
# load_area_id <-> load_area_index
...
@@ -20,6 +21,8 @@ def build_work_area_uuid_index_map():
...
@@ -20,6 +21,8 @@ def build_work_area_uuid_index_map():
load_area_index_to_uuid_dict
=
{}
load_area_index_to_uuid_dict
=
{}
unload_area_index_to_uuid_dict
=
{}
unload_area_index_to_uuid_dict
=
{}
logger
=
logging
.
getLogger
(
"build_work_area_uuid_index_map"
)
unload_area_num
=
0
unload_area_num
=
0
load_area_num
=
0
load_area_num
=
0
...
@@ -90,7 +93,41 @@ def build_truck_uuid_name_map():
...
@@ -90,7 +93,41 @@ def build_truck_uuid_name_map():
return
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
return
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
def
build_equipment_uuid_name_map
():
# excavator_id <-> excavator_name
# dump_id <-> dump_name
excavator_uuid_to_name_dict
=
{}
dump_uuid_to_name_dict
=
{}
try
:
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
2
)
.
all
():
truck_id
=
item
.
id
truck_name
=
item
.
equipment_id
excavator_uuid_to_name_dict
[
truck_id
]
=
truck_name
if
len
(
excavator_uuid_to_name_dict
)
<
1
:
raise
Exception
(
"无挖机设备可用"
)
except
Exception
as
es
:
logger
.
warning
(
es
)
try
:
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
3
)
.
all
():
truck_id
=
item
.
id
truck_name
=
item
.
equipment_id
dump_uuid_to_name_dict
[
truck_id
]
=
truck_name
if
len
(
dump_uuid_to_name_dict
)
<
1
:
raise
Exception
(
"无卸载设备可用"
)
except
Exception
as
es
:
logger
.
warning
(
es
)
return
excavator_uuid_to_name_dict
,
dump_uuid_to_name_dict
def
update_deveices_map
(
unload_area_uuid_to_index_dict
,
load_area_uuid_to_index_dict
):
def
update_deveices_map
(
unload_area_uuid_to_index_dict
,
load_area_uuid_to_index_dict
):
logger
=
get_logger
(
"zxt.update_deveices_map"
)
excavator_uuid_to_index_dict
=
{}
# 用于将Excavator表中的area_id映射到index
excavator_uuid_to_index_dict
=
{}
# 用于将Excavator表中的area_id映射到index
dump_uuid_to_index_dict
=
{}
# 用于将Dump表中的area_id映射到index
dump_uuid_to_index_dict
=
{}
# 用于将Dump表中的area_id映射到index
excavator_index_to_uuid_dict
=
{}
# 用于将index映射到Excavator表中的area_id
excavator_index_to_uuid_dict
=
{}
# 用于将index映射到Excavator表中的area_id
...
@@ -288,8 +325,6 @@ def update_autodisp_dump():
...
@@ -288,8 +325,6 @@ def update_autodisp_dump():
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
warning
(
es
)
logger
.
warning
(
es
)
print
(
"here1"
)
print
(
set
(
dynamic_dump_list
))
return
set
(
dynamic_dump_list
)
return
set
(
dynamic_dump_list
)
...
@@ -313,3 +348,305 @@ def update_park_area():
...
@@ -313,3 +348,305 @@ def update_park_area():
for
walk_time_park
in
session_postgre
.
query
(
WalkTimePark
)
.
all
():
for
walk_time_park
in
session_postgre
.
query
(
WalkTimePark
)
.
all
():
park_area_list
.
append
(
walk_time_park
.
park_area_id
)
park_area_list
.
append
(
walk_time_park
.
park_area_id
)
return
park_area_list
return
park_area_list
# def build_work_area_uuid_index_map():
# # load_area_id <-> load_area_index
# # unload_area_id <-> unload_area_index
# load_area_uuid_to_index_dict = {}
# unload_area_uuid_to_index_dict = {}
# load_area_index_to_uuid_dict = {}
# unload_area_index_to_uuid_dict = {}
#
# unload_area_num = 0
# load_area_num = 0
#
# try:
# for item in session_postgre.query(WalkTime).all():
# load_area = str(item.load_area_id)
# unload_area = str(item.unload_area_id)
# if load_area not in load_area_uuid_to_index_dict:
# load_area_uuid_to_index_dict[load_area] = load_area_num
# load_area_index_to_uuid_dict[load_area_num] = load_area
# load_area_num = load_area_num + 1
# if unload_area not in unload_area_uuid_to_index_dict:
# unload_area_uuid_to_index_dict[unload_area] = unload_area_num
# unload_area_index_to_uuid_dict[unload_area_num] = unload_area
# unload_area_num = unload_area_num + 1
# if unload_area_num < 1 or load_area_num < 1:
# raise Exception("无路网信息")
# except Exception as es:
# logger.error("路网读取")
# logger.error(es)
# return (
# load_area_uuid_to_index_dict,
# unload_area_uuid_to_index_dict,
# load_area_index_to_uuid_dict,
# unload_area_index_to_uuid_dict,
# )
#
#
# def build_park_uuid_index_map():
# # park_id <-> park_index
# park_uuid_to_index_dict = {}
# park_index_to_uuid_dict = {}
#
# park_num = 0
#
# try:
# for item in session_postgre.query(WalkTimePark).all():
# park = str(item.park_area_id)
# if park not in park_uuid_to_index_dict:
# park_uuid_to_index_dict[park] = park_num
# park_index_to_uuid_dict[park_num] = park
# park_num = park_num + 1
# if park_num < 1:
# raise Exception("无备停区路网信息")
# except Exception as es:
# logger.info("备停区路网读取")
# logger.error(es)
#
# return park_uuid_to_index_dict, park_index_to_uuid_dict
#
#
# def build_truck_uuid_name_map():
# # truck_id <-> truck_name
# truck_uuid_to_name_dict = {}
# truck_name_to_uuid_dict = {}
#
# try:
# for item in session_mysql.query(Equipment).filter_by(device_type=1).all():
# truck_id = item.id
# truck_name = item.equipment_id
#
# truck_name_to_uuid_dict[truck_name] = truck_id
# truck_uuid_to_name_dict[truck_id] = truck_name
# if len(truck_uuid_to_name_dict) < 1 or len(truck_name_to_uuid_dict) < 1:
# raise Exception("无矿卡设备可用-矿卡设备映射异常")
# except Exception as es:
# logger.warning(es)
# return truck_uuid_to_name_dict, truck_name_to_uuid_dict
#
#
# def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_dict):
# excavator_uuid_to_index_dict = {} # 用于将Excavator表中的area_id映射到index
# dump_uuid_to_index_dict = {} # 用于将Dump表中的area_id映射到index
# excavator_index_to_uuid_dict = {} # 用于将index映射到Excavator表中的area_id
# dump_index_to_uuid_dict = {} # 用于将index映射到Dump表中的area_id
#
# dump_uuid_to_unload_area_uuid_dict = {}
# excavator_uuid_to_load_area_uuid_dict = {}
# excavator_index_to_load_area_index_dict = {}
# dump_index_to_unload_area_index_dict = {}
#
# try:
# excavator_num = 0
# dump_num = 0
# for item in (
# session_mysql.query(Dispatch).filter_by(isdeleted=0, isauto=1).all()
# ):
# # excavator_id <-> excavator_index
# # dump_id <-> dump_index
# # excavator_id <-> load_area_id
# # dump_id <-> unload_area_id
# # excavator_index <-> load_area_index
# # dump_index <-> unload_area_index
# excavator_id = item.exactor_id
# load_area_id = item.load_area_id
# unload_area_id = item.unload_area_id
# dump_id = item.dump_id
# if dump_id not in dump_uuid_to_unload_area_uuid_dict:
# dump_uuid_to_index_dict[dump_id] = dump_num
# dump_index_to_uuid_dict[dump_num] = dump_id
# dump_uuid_to_unload_area_uuid_dict[dump_id] = unload_area_id
# dump_index_to_unload_area_index_dict[
# dump_uuid_to_index_dict[dump_id]
# ] = unload_area_uuid_to_index_dict[unload_area_id]
# dump_num = dump_num + 1
# if excavator_id not in excavator_uuid_to_index_dict:
# excavator_uuid_to_index_dict[excavator_id] = excavator_num
# excavator_index_to_uuid_dict[excavator_num] = excavator_id
# excavator_uuid_to_load_area_uuid_dict[excavator_id] = load_area_id
# excavator_index_to_load_area_index_dict[
# excavator_uuid_to_index_dict[excavator_id]
# ] = load_area_uuid_to_index_dict[load_area_id]
# excavator_num = excavator_num + 1
# if excavator_num < 1 or dump_num < 1:
# raise Exception("无动态派车计划可用-动态派车挖机/卸载设备映射失败")
# except Exception as es:
# logger.error("卸载区信息异常")
# logger.error(es)
#
# logger.info("excavator_index_to_load_area_index_dict")
# logger.info(excavator_index_to_load_area_index_dict)
#
# logger.info("load_area_uuid_to_index_dict")
# logger.info(load_area_uuid_to_index_dict)
# logger.info("static_excavator_uuid_to_index_dict")
# logger.info(excavator_uuid_to_index_dict)
#
# return {
# "excavator_uuid_to_index_dict": excavator_uuid_to_index_dict,
# "dump_uuid_to_index_dict": dump_uuid_to_index_dict,
# "excavator_index_to_uuid_dict": excavator_index_to_uuid_dict,
# "dump_index_to_uuid_dict": dump_index_to_uuid_dict,
# "dump_uuid_to_unload_area_uuid_dict": dump_uuid_to_unload_area_uuid_dict,
# "excavator_uuid_to_load_area_uuid_dict": excavator_uuid_to_load_area_uuid_dict,
# "excavator_index_to_load_area_index_dict": excavator_index_to_load_area_index_dict,
# "dump_index_to_unload_area_index_dict": dump_index_to_unload_area_index_dict,
# }
#
#
# def update_truck_uuid_index_map(dynamic_truck_set):
# truck_uuid_to_index_dict = {}
# truck_index_to_uuid_dict = {}
#
# # truck_id <-> truck_index
# truck_num = 0
# for truck_id in dynamic_truck_set:
# truck_uuid_to_index_dict[truck_id] = truck_num
# truck_index_to_uuid_dict[truck_num] = truck_id
# truck_num = truck_num + 1
#
# logger.info("static_data_process.py-truck_uuid_to_index_dict")
# logger.info(truck_uuid_to_index_dict)
#
# return {
# "truck_uuid_to_index_dict": truck_uuid_to_index_dict,
# "truck_index_to_uuid_dict": truck_index_to_uuid_dict,
# }
#
#
# def update_total_truck():
# # 矿卡集合
# truck_list = []
#
# try:
# query = np.array(
# session_mysql.query(Equipment)
# .filter_by(device_type=1, isdeleted=0)
# .all()
# )
#
# # for item in query:
# # json_value = json.loads(redis2.get(item.equipment_id))
# # is_online = json_value.get('isOnline')
# # if is_online:
# # truck_list.append(item.id)
#
# for item in query:
# truck_list.append(item.id)
#
# if len(truck_list) < 1:
# raise Exception("无矿卡设备可用-矿卡集合读取异常")
# except Exception as es:
# logger.info("矿卡读取")
# logger.error(es)
#
# return truck_list
#
#
# def update_dynamic_truck():
# dynamic_truck_list = []
#
# try:
# query = np.array(
# session_mysql.query(Dispatch).filter_by(isauto=1, isdeleted=0).all()
# )
#
# for item in query:
# if item.truck_id is not None:
# dynamic_truck_list.append(item.truck_id)
#
# except Exception as es:
# logger.error(es)
# logger.error("动态调度矿卡读取异常")
#
# return set(dynamic_truck_list)
#
#
# def update_fixdisp_truck():
# # 固定派车矿卡集合
# fixed_truck_list = []
#
# try:
# query = np.array(
# session_mysql.query(Dispatch).filter_by(isauto=0, isdeleted=0).all()
# )
#
# for item in query:
# fixed_truck_list.append(item.truck_id)
#
# rule5 = session_mysql.query(DispatchRule).filter_by(id=5).first().disabled
#
# if not rule5:
# query = np.array(
# session_mysql.query(Equipment)
# .filter_by(device_type=1, isdeleted=0, disabled=1)
# .all()
# )
#
# for item in query:
# fixed_truck_list.append(item.id)
#
# if len(fixed_truck_list) < 1:
# raise Exception("无固定派车计划可用-固定派车矿卡集合读取异常")
# except Exception as es:
# logger.info("派车计划读取")
# logger.error(es)
# return set(fixed_truck_list)
#
#
# def update_autodisp_excavator():
# # 用于动态派车的挖机集合
# dynamic_excavator_list = []
# try:
# for item in (
# session_mysql.query(Dispatch).filter_by(isdeleted=0, isauto=1).all()
# ):
# dynamic_excavator_list.append(item.exactor_id)
# if len(dynamic_excavator_list) < 1:
# raise Exception("无动态派车计划可用-动态派车挖机/卸载设备集合读取异常")
# except Exception as es:
# logger.warning(es)
#
# return set(dynamic_excavator_list)
#
#
# def update_autodisp_dump():
# # 用于动态调度的卸载点集合
# dynamic_dump_list = []
# try:
# for item in (
# session_mysql.query(Dispatch).filter_by(isdeleted=0, isauto=1).all()
# ):
# dynamic_dump_list.append(item.dump_id)
# if len(dynamic_dump_list) < 1:
# raise Exception("无动态派车计划可用-动态派车挖机/卸载设备集合读取异常")
# except Exception as es:
# logger.warning(es)
#
# print("here1")
# print(set(dynamic_dump_list))
# return set(dynamic_dump_list)
#
#
# def update_load_area():
# load_area_list = []
# for walk_time in session_postgre.query(WalkTime).all():
# load_area_list.append(walk_time.load_area_id)
#
# return load_area_list
#
#
# def update_unload_area():
# unload_area_list = []
# for walk_time in session_postgre.query(WalkTime).all():
# unload_area_list.append(walk_time.unload_area_id)
# return unload_area_list
#
#
# def update_park_area():
# park_area_list = []
# for walk_time_park in session_postgre.query(WalkTimePark).all():
# park_area_list.append(walk_time_park.park_area_id)
# return park_area_list
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment