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
0
Merge Requests
0
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
670e5b13
Commit
670e5b13
authored
Nov 26, 2021
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复无派车计划算法终止异常
parent
435b229f
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
719 additions
and
650 deletions
+719
-650
dump.py
equipment/dump.py
+27
-0
excavator.py
equipment/excavator.py
+26
-1
__init__.py
group_control/__init__.py
+8
-0
group_control.py
group_control/group_control.py
+371
-0
path_plannner.py
path_plan/path_plannner.py
+6
-2
realtime_dispatch.py
realtime_dispatch.py
+129
-643
settings.py
settings.py
+4
-4
traffic_flow_info.py
traffic_flow/traffic_flow_info.py
+148
-0
No files found.
equipment/dump.py
View file @
670e5b13
...
...
@@ -29,6 +29,8 @@ class DumpInfo(WalkManage):
self
.
dump_material
=
{}
# 卸点优先级
self
.
dump_priority_coefficient
=
np
.
ones
(
self
.
dynamic_dump_num
)
# 卸点卸载能力
self
.
dump_strength
=
np
.
zeros
(
self
.
dynamic_dump_num
)
# 初始化读取映射及路网
self
.
period_map_para_load
()
...
...
@@ -136,6 +138,25 @@ class DumpInfo(WalkManage):
logger
.
error
(
"无动态派车计划可用"
)
logger
.
error
(
es
)
def
update_unload_ability
(
self
):
try
:
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
if
not
rule3
.
disabled
:
for
dump_index
in
range
(
dynamic_dump_num
):
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
self
.
dump_strength
[
dump_index
]
=
unload_ability
# 卸载设备最大卸载能力,单位吨/小时
if
unload_ability
<
200
:
raise
Exception
(
"卸载点卸载能力异常"
)
else
:
self
.
dump_strength
=
np
.
full
(
self
.
num_of_dump
,
5000
)
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
"卸载点卸载信息读取异常"
)
def
reset
(
self
):
# 卸载设备数量
self
.
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
...
...
@@ -151,6 +172,8 @@ class DumpInfo(WalkManage):
self
.
dump_material
=
{}
# 卸点优先级
self
.
dump_priority_coefficient
=
np
.
ones
(
self
.
dynamic_dump_num
)
# 卸点卸载能力
self
.
dump_strength
=
np
.
zeros
(
self
.
dynamic_dump_num
)
def
para_period_update
(
self
):
...
...
@@ -176,6 +199,9 @@ class DumpInfo(WalkManage):
# 更新设备优先级
self
.
update_dump_priority
()
# 更新卸点卸载能力
self
.
update_unload_ability
()
#
# # 卸载目标产量
# self.dump_target_mass = np.full(self.dynamic_dump_num, dump_target_mass)
\ No newline at end of file
equipment/excavator.py
View file @
670e5b13
...
...
@@ -33,6 +33,8 @@ class ExcavatorInfo(WalkManage):
self
.
excavator_priority_coefficient
=
np
.
ones
(
self
.
dynamic_excavator_num
)
# 挖机物料优先级
self
.
excavator_material_priority
=
np
.
ones
(
self
.
dynamic_excavator_num
)
# 挖机装载能力
self
.
excavator_strength
=
np
.
zeros
(
self
.
dynamic_excavator_num
)
# 初始化读取映射及路网
self
.
period_map_para_load
()
...
...
@@ -162,6 +164,25 @@ class ExcavatorInfo(WalkManage):
if
self
.
excavator_material
[
excavator_id
]
==
'81bb175d-50fe-4be3-937e-6791ac4d6fec'
:
self
.
excavator_material_priority
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
5
def
update_mining_ability
(
self
):
try
:
rule4
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
4
)
.
first
()
if
not
rule4
.
disabled
:
for
excavator_index
in
range
(
len
(
self
.
excavator_index_to_uuid_dict
)):
load_ability
=
session_mysql
.
query
(
EquipmentSpec
.
mining_abililty
)
.
\
join
(
Equipment
,
Equipment
.
equipment_spec
==
EquipmentSpec
.
id
)
.
\
filter
(
Equipment
.
id
==
self
.
excavator_index_to_uuid_dict
[
excavator_index
])
.
first
()
self
.
excavator_strength
[
excavator_index
]
=
load_ability
.
mining_abililty
if
load_ability
.
mining_abililty
<
200
:
raise
Exception
(
"挖机装载能力异常"
)
else
:
self
.
excavator_strength
=
np
.
full
(
self
.
num_of_excavator
,
5000
)
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
"挖机装载信息信息读取异常"
)
def
reset
(
self
):
# 装载设备数量
...
...
@@ -180,7 +201,8 @@ class ExcavatorInfo(WalkManage):
self
.
excavator_priority_coefficient
=
np
.
ones
(
self
.
dynamic_excavator_num
)
# 挖机物料优先级
self
.
excavator_material_priority
=
np
.
ones
(
self
.
dynamic_excavator_num
)
# 挖机装载能力
self
.
excavator_strength
=
np
.
zeros
(
get_value
(
"dynamic_excavator_num"
))
def
para_period_update
(
self
):
...
...
@@ -214,3 +236,6 @@ class ExcavatorInfo(WalkManage):
# 更新挖机优先级
self
.
update_excavator_priority
()
# 更新挖机装载能力
self
.
update_mining_ability
()
group_control/__init__.py
0 → 100644
View file @
670e5b13
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:38
# @Author : Opfer
# @Site :
# @File : __init__.py
# @Software: PyCharm
\ No newline at end of file
group_control/group_control.py
0 → 100644
View file @
670e5b13
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/11/26 11:34
# @Author : Opfer
# @Site :
# @File : group_control.py
# @Software: PyCharm
from
settings
import
*
from
para_config
import
*
from
path_plan.path_plannner
import
PathPlanner
from
traffic_flow.traffic_flow_planner
import
traffic_flow_plan
class
Group
(
WalkManage
):
def
__init__
(
self
,
dump
,
excavator
,
truck
,
traffic_flow
):
self
.
dump
=
dump
self
.
excavator
=
excavator
self
.
truck
=
truck
self
.
traffic_flow
=
traffic_flow
self
.
dispatch_truck_group
=
{}
self
.
group_num
=
1
self
.
group_set
=
set
()
self
.
device_group
=
{}
self
.
group_walk_to_excavator_cost
=
{}
self
.
group_walk_to_dump_cost
=
{}
self
.
group_park_to_excavator
=
{}
self
.
group_opt_goto_dump_traffic_flow
=
{}
self
.
group_opt_goto_excavator_traffic_flow
=
{}
self
.
group_actual_goto_dump_traffic_flow
=
{}
self
.
group_actual_goto_excavator_traffic_flow
=
{}
self
.
group_excavator_uuid_to_index_dict
=
{}
self
.
group_dump_uuid_to_index_dict
=
{}
self
.
group_excavator_index_to_uuid_dict
=
{}
self
.
group_dump_index_to_uuid_dict
=
{}
self
.
group_excavator_exclude_modify
=
{}
self
.
group_excavator_material_bind_modify
=
{}
self
.
group_dump_material_bind_modify
=
{}
self
.
path
=
PathPlanner
()
def
update_dispatch_truck_group
(
self
):
# 更新矿卡-调度分组隶属关系
self
.
dispatch_truck_group
=
{}
dynamic_truck_set
=
get_value
(
"dynamic_truck_set"
)
print
(
"dispatch_truck_group-dynamic_truck_set"
)
print
(
dynamic_truck_set
)
# 动态派车数量没变,但是此时某条派车计划被删除,dispatch_truck_group 就会缺失矿卡
for
truck_id
in
dynamic_truck_set
:
item
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
truck_id
=
truck_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
()
if
item
is
None
:
print
(
truck_id
)
continue
self
.
dispatch_truck_group
[
truck_id
]
=
item
.
group_id
print
(
self
.
dispatch_truck_group
)
def
update_group_set
(
self
):
# 更新调度组
self
.
group_set
=
set
()
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isauto
=
1
,
isdeleted
=
0
)
.
all
():
if
item
.
group_id
is
not
None
:
self
.
group_set
.
add
(
item
.
group_id
)
self
.
group_num
=
len
(
self
.
group_set
)
def
update_device_group
(
self
):
# 更新设备分组group_id -> {set(dump_id), set(excavator_id)}
self
.
device_group
=
{}
for
group_id
in
self
.
get_group_set
():
if
group_id
not
in
self
.
device_group
:
self
.
device_group
[
group_id
]
=
[
set
(),
set
()]
else
:
continue
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
group_id
=
group_id
,
isauto
=
1
,
isdeleted
=
0
)
.
all
():
self
.
device_group
[
group_id
][
0
]
.
add
(
item
.
dump_id
)
self
.
device_group
[
group_id
][
1
]
.
add
(
item
.
exactor_id
)
# 更新实际交通流
def
update_actual_traffic_flow
(
self
):
loading_task_time
=
self
.
excavator
.
get_loading_task_time
()
unloading_task_time
=
self
.
dump
.
get_unloading_task_time
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
payload
=
self
.
truck
.
get_payload
()
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_truck_num
=
get_value
(
"dynamic_truck_num"
)
self
.
goto_dump_truck_num
=
np
.
zeros
((
dynamic_excavator_num
,
dynamic_dump_num
))
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
dynamic_excavator_num
,
dynamic_dump_num
)
)
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dynamic_dump_num
,
dynamic_excavator_num
)
)
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dynamic_dump_num
,
dynamic_excavator_num
)
)
# try:
logger
.
info
(
"dynamic_truck_num"
)
logger
.
info
(
dynamic_truck_num
)
print
(
"truck.truck_index_to_uuid_dict"
)
print
(
self
.
truck
.
truck_index_to_uuid_dict
)
print
(
"truck_current_task"
)
print
(
truck_current_task
)
for
i
in
range
(
dynamic_truck_num
):
task
=
truck_current_task
[
self
.
truck
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
truck_current_trip
[
i
][
1
]
start_area_index
=
truck_current_trip
[
i
][
0
]
if
task
in
heavy_task_set
:
self
.
goto_dump_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_dump_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
# logger.info("debug2")
if
task
in
empty_task_set
:
self
.
goto_excavator_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_excavator_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
self
.
actual_goto_dump_traffic_flow
=
self
.
actual_goto_dump_traffic_flow
/
(
self
.
distance_to_dump
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
empty_speed
)
+
np
.
expand_dims
(
unloading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_excavator_num
,
axis
=
0
)
)
self
.
actual_goto_excavator_traffic_flow
=
(
self
.
actual_goto_excavator_traffic_flow
/
(
self
.
distance_to_excavator
.
reshape
(
dynamic_dump_num
,
dynamic_excavator_num
)
/
(
1000
*
heavy_speed
)
+
np
.
expand_dims
(
loading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_dump_num
,
axis
=
0
)
)
)
def
update_group_truck_flow
(
self
):
# 更新调度分组内车实时/最佳车流
global
dispatcher
actual_goto_excavator_traffic_flow
,
actual_goto_dump_traffic_flow
=
\
self
.
traffic_flow
.
actual_goto_excavator_traffic_flow
,
self
.
traffic_flow
.
actual_goto_dump_traffic_flow
opt_goto_dump_traffic_flow
,
opt_goto_excavator_traffic_flow
=
traffic_flow_plan
(
self
.
truck
)
try
:
# print("uuid_to_index_dict")
# print(dump.dump_uuid_to_index_dict)
# print(excavator.excavator_uuid_to_index_dict)
for
group_id
in
self
.
group_set
:
dump_group
=
self
.
device_group
[
group_id
][
0
]
# group 类最后更新,读取派车计划及分组情况,和前面的uuid 可能不一致
excavator_group
=
self
.
device_group
[
group_id
][
1
]
print
(
"group"
)
print
(
self
.
device_group
)
local_opt_goto_dump_traffic_flow
=
np
.
zeros
((
len
(
excavator_group
),
len
(
dump_group
)))
local_opt_goto_excavator_traffic_flow
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
local_actual_goto_dump_traffic_flow
=
np
.
zeros
((
len
(
excavator_group
),
len
(
dump_group
)))
local_actual_goto_excavator_traffic_flow
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
for
excavator_id
in
excavator_group
:
for
dump_id
in
dump_group
:
dump_group_index
=
self
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
excavator_group_index
=
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
local_opt_goto_dump_traffic_flow
[
excavator_group_index
][
dump_group_index
]
=
\
opt_goto_dump_traffic_flow
[
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]][
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]]
local_opt_goto_excavator_traffic_flow
[
dump_group_index
][
excavator_group_index
]
=
\
opt_goto_excavator_traffic_flow
[
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
local_actual_goto_dump_traffic_flow
[
excavator_group_index
][
dump_group_index
]
=
\
actual_goto_dump_traffic_flow
[
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]][
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]]
local_actual_goto_excavator_traffic_flow
[
dump_group_index
][
excavator_group_index
]
=
\
actual_goto_excavator_traffic_flow
[
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
self
.
group_opt_goto_dump_traffic_flow
[
group_id
]
=
local_opt_goto_dump_traffic_flow
self
.
group_opt_goto_excavator_traffic_flow
[
group_id
]
=
local_opt_goto_excavator_traffic_flow
self
.
group_actual_goto_dump_traffic_flow
[
group_id
]
=
local_actual_goto_dump_traffic_flow
self
.
group_actual_goto_excavator_traffic_flow
[
group_id
]
=
local_actual_goto_excavator_traffic_flow
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
"分组车流更新异常"
)
logger
.
info
(
"group_opt_traffic_flow"
)
logger
.
info
(
self
.
group_opt_goto_dump_traffic_flow
)
logger
.
info
(
self
.
group_opt_goto_excavator_traffic_flow
)
def
update_group_walk_cost
(
self
):
# 更新调度分组路网行驶成本
walk_to_excavator_cost
,
walk_to_dump_cost
,
park_to_excavator_cost
=
self
.
path
.
walk_cost
()
try
:
for
group_id
in
self
.
group_set
:
dump_group
=
self
.
device_group
[
group_id
][
0
]
excavator_group
=
self
.
device_group
[
group_id
][
1
]
local_walk_to_excavator_cost
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
local_walk_to_dump_cost
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
local_park_to_excavator_cost
=
np
.
zeros
((
park_num
,
len
(
excavator_group
)))
for
excavator_id
in
excavator_group
:
for
dump_id
in
dump_group
:
dump_group_index
=
self
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
excavator_group_index
=
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
print
(
"dump_group"
)
print
(
dump_group
)
local_walk_to_excavator_cost
[
dump_group_index
][
excavator_group_index
]
=
\
walk_to_excavator_cost
[
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
local_walk_to_dump_cost
[
dump_group_index
][
excavator_group_index
]
=
\
walk_to_dump_cost
[
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
for
park_index
in
range
(
park_num
):
for
excavator_id
in
excavator_group
:
excavator_group_index
=
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
local_park_to_excavator_cost
[
park_index
][
excavator_group_index
]
=
\
park_to_excavator_cost
[
park_index
][
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
self
.
group_walk_to_excavator_cost
[
group_id
]
=
local_walk_to_excavator_cost
self
.
group_walk_to_dump_cost
[
group_id
]
=
local_walk_to_dump_cost
self
.
group_park_to_excavator
[
group_id
]
=
local_park_to_excavator_cost
except
Exception
as
es
:
logger
.
info
(
es
)
logger
.
info
(
"error-11"
)
def
update_group_device_map
(
self
):
# 更新调度分组内设备映射
self
.
group_excavator_uuid_to_index_dict
=
{}
self
.
group_dump_uuid_to_index_dict
=
{}
self
.
group_excavator_index_to_uuid_dict
=
{}
self
.
group_dump_index_to_uuid_dict
=
{}
for
group_id
in
self
.
group_set
:
excavator_num
=
0
dump_num
=
0
dump_group
=
self
.
device_group
[
group_id
][
0
]
excavator_group
=
self
.
device_group
[
group_id
][
1
]
self
.
group_excavator_uuid_to_index_dict
[
group_id
]
=
{}
self
.
group_excavator_index_to_uuid_dict
[
group_id
]
=
{}
self
.
group_dump_uuid_to_index_dict
[
group_id
]
=
{}
self
.
group_dump_index_to_uuid_dict
[
group_id
]
=
{}
for
excavator_id
in
excavator_group
:
if
excavator_id
not
in
self
.
group_excavator_uuid_to_index_dict
:
self
.
group_excavator_index_to_uuid_dict
[
group_id
][
excavator_num
]
=
excavator_id
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
=
excavator_num
excavator_num
=
excavator_num
+
1
for
dump_id
in
dump_group
:
if
dump_id
not
in
self
.
group_dump_uuid_to_index_dict
:
self
.
group_dump_index_to_uuid_dict
[
group_id
][
dump_num
]
=
dump_id
self
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
=
dump_num
dump_num
=
dump_num
+
1
logger
.
info
(
"group_map"
)
logger
.
info
(
self
.
group_dump_uuid_to_index_dict
)
logger
.
info
(
self
.
group_excavator_uuid_to_index_dict
)
def
update_modify
(
self
):
try
:
dynamic_truck_set
=
get_value
(
"dynamic_truck_set"
)
print
(
"update_modify"
)
print
(
dynamic_truck_set
)
print
(
"self.dispatch_truck_group"
)
print
(
self
.
dispatch_truck_group
)
self
.
group_excavator_exclude_modify
=
{}
self
.
group_excavator_material_bind_modify
=
{}
self
.
group_dump_material_bind_modify
=
{}
for
truck_id
in
dynamic_truck_set
:
group_id
=
self
.
dispatch_truck_group
[
truck_id
]
group_dump_num
=
len
(
self
.
device_group
[
group_id
][
0
])
group_excavator_num
=
len
(
self
.
device_group
[
group_id
][
1
])
excavator_exclude_modify
=
np
.
zeros
(
group_excavator_num
)
excavator_material_bind_modify
=
np
.
zeros
(
group_excavator_num
)
dump_material_bind_modify
=
np
.
zeros
(
group_dump_num
)
truck_index
=
self
.
truck
.
truck_uuid_to_index_dict
[
truck_id
]
for
group_excavator_index
in
range
(
group_excavator_num
):
excavator_index
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
group_excavator_index_to_uuid_dict
[
group_id
][
group_excavator_index
]]
excavator_exclude_modify
[
group_excavator_index
]
=
self
.
truck
.
excavator_exclude_modify
[
truck_index
][
excavator_index
]
for
group_excavator_index
in
range
(
group_excavator_num
):
excavator_index
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
self
.
group_excavator_index_to_uuid_dict
[
group_id
][
group_excavator_index
]]
excavator_material_bind_modify
[
group_excavator_index
]
=
self
.
truck
.
excavator_material_bind_modify
[
truck_index
][
excavator_index
]
for
group_dump_index
in
range
(
group_dump_num
):
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
self
.
group_dump_index_to_uuid_dict
[
group_id
][
group_dump_index
]]
print
(
self
.
truck
.
dump_material_bind_modify
,
truck_index
,
dump_index
)
print
(
self
.
truck
.
dump_material_bind_modify
[
truck_index
][
dump_index
],
truck_index
,
dump_index
)
dump_material_bind_modify
[
group_dump_index
]
=
self
.
truck
.
dump_material_bind_modify
[
truck_index
][
dump_index
]
self
.
group_excavator_exclude_modify
[
truck_id
]
=
excavator_exclude_modify
self
.
group_excavator_material_bind_modify
[
truck_id
]
=
excavator_material_bind_modify
self
.
group_dump_material_bind_modify
[
truck_id
]
=
dump_material_bind_modify
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
"modify update 异常"
)
def
period_update
(
self
):
self
.
reset
()
self
.
update_dispatch_truck_group
()
self
.
update_group_set
()
self
.
update_device_group
()
self
.
update_group_device_map
()
self
.
update_group_walk_cost
()
self
.
update_group_truck_flow
()
self
.
update_modify
()
def
get_diaptch_truck_group
(
self
):
return
self
.
dispatch_truck_group
def
get_group_num
(
self
):
return
self
.
group_num
def
get_group_set
(
self
):
return
self
.
group_set
def
reset
(
self
):
self
.
dispatch_truck_group
=
{}
self
.
group_num
=
1
self
.
group_set
=
set
()
self
.
device_group
=
{}
self
.
group_walk_to_excavator_cost
=
{}
self
.
group_walk_to_dump_cost
=
{}
self
.
group_park_to_excavator
=
{}
self
.
group_opt_goto_dump_traffic_flow
=
{}
self
.
group_opt_goto_excavator_traffic_flow
=
{}
self
.
group_actual_goto_dump_traffic_flow
=
{}
self
.
group_actual_goto_excavator_traffic_flow
=
{}
self
.
group_excavator_uuid_to_index_dict
=
{}
self
.
group_dump_uuid_to_index_dict
=
{}
self
.
group_excavator_index_to_uuid_dict
=
{}
self
.
group_dump_index_to_uuid_dict
=
{}
self
.
group_excavator_exclude_modify
=
{}
self
.
group_excavator_material_bind_modify
=
{}
self
.
group_dump_material_bind_modify
=
{}
\ No newline at end of file
path_plan/path_plannner.py
View file @
670e5b13
...
...
@@ -33,8 +33,12 @@ class PathPlanner(WalkManage):
# 路段集合
self
.
lane_set
=
{}
# 车辆长度(暂)
self
.
truck_length
=
float
(
sum
(
self
.
truck
.
get_length
()
.
values
()))
/
len
(
self
.
truck
.
get_length
())
self
.
truck_length
=
3
try
:
self
.
truck_length
=
float
(
sum
(
self
.
truck
.
get_length
()
.
values
()))
/
len
(
self
.
truck
.
get_length
())
except
Exception
as
es
:
logger
.
error
(
"无矿卡数据"
)
logger
.
error
(
es
)
self
.
truck_length
=
3
# 装载区数量
self
.
num_of_load_area
=
len
(
set
(
update_load_area
()))
# 卸载区数量
...
...
realtime_dispatch.py
View file @
670e5b13
...
...
@@ -16,6 +16,7 @@ from equipment.excavator import ExcavatorInfo
from
equipment.dump
import
DumpInfo
import
sched
import
time
from
group_control.group_control
import
Group
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
...
...
@@ -51,37 +52,12 @@ class Dispatcher(WalkManage):
self
.
start_time
=
datetime
.
now
()
# self.relative_now_time = datetime.now() - self.start_time
# 下面是交通流调度部分
# 驶往挖机的实际车流
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往挖机的实际车次
self
.
goto_dump_truck_num
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往卸载设备的实际车次
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
self
.
path
=
PathPlanner
()
# 驶往挖机的理想车流
self
.
opt_goto_dump_traffic_flow
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往卸载设备的实际车流
self
.
opt_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
self
.
traffic_flow
=
Traffic_flow
(
dump
,
excavator
,
truck
)
self
.
path
=
PathPlanner
(
)
self
.
group
=
Group
(
dump
,
excavator
,
truck
,
self
.
traffic_flow
)
self
.
group
=
Group
()
# 更新矿卡预计抵达目的地时间
def
update_truck_reach_time
(
self
):
...
...
@@ -215,151 +191,6 @@ class Dispatcher(WalkManage):
logger
.
error
(
"卸载设备可用时间计算异常"
)
logger
.
error
(
es
)
# 更新实际交通流
def
update_actual_traffic_flow
(
self
):
loading_task_time
=
excavator
.
get_loading_task_time
()
unloading_task_time
=
dump
.
get_unloading_task_time
()
truck_current_task
=
truck
.
get_truck_current_task
()
truck_current_trip
=
truck
.
get_truck_current_trip
()
payload
=
truck
.
get_payload
()
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_truck_num
=
get_value
(
"dynamic_truck_num"
)
self
.
goto_dump_truck_num
=
np
.
zeros
((
dynamic_excavator_num
,
dynamic_dump_num
))
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
dynamic_excavator_num
,
dynamic_dump_num
)
)
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dynamic_dump_num
,
dynamic_excavator_num
)
)
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dynamic_dump_num
,
dynamic_excavator_num
)
)
# try:
logger
.
info
(
"dynamic_truck_num"
)
logger
.
info
(
dynamic_truck_num
)
print
(
"truck.truck_index_to_uuid_dict"
)
print
(
truck
.
truck_index_to_uuid_dict
)
print
(
"truck_current_task"
)
print
(
truck_current_task
)
for
i
in
range
(
dynamic_truck_num
):
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
truck_current_trip
[
i
][
1
]
start_area_index
=
truck_current_trip
[
i
][
0
]
if
task
in
heavy_task_set
:
self
.
goto_dump_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_dump_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
# logger.info("debug2")
if
task
in
empty_task_set
:
self
.
goto_excavator_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_excavator_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
self
.
actual_goto_dump_traffic_flow
=
self
.
actual_goto_dump_traffic_flow
/
(
self
.
distance_to_dump
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
empty_speed
)
+
np
.
expand_dims
(
unloading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_excavator_num
,
axis
=
0
)
)
self
.
actual_goto_excavator_traffic_flow
=
(
self
.
actual_goto_excavator_traffic_flow
/
(
self
.
distance_to_excavator
.
reshape
(
dynamic_dump_num
,
dynamic_excavator_num
)
/
(
1000
*
heavy_speed
)
+
np
.
expand_dims
(
loading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_dump_num
,
axis
=
0
)
)
)
logger
.
info
(
"self.goto_dump_truck_num"
)
logger
.
info
(
self
.
goto_dump_truck_num
)
logger
.
info
(
"self.actual_goto_dump_traffic_flow"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"self.goto_excavator_truck_num"
)
logger
.
info
(
self
.
goto_excavator_truck_num
)
logger
.
info
(
"self.actual_goto_excavator_traffic_flow"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
# except Exception as es:
# logger.error("未知错误001")
# logger.error(es)
# print("驶往卸点实际载重")
# print(self.actual_goto_dump_traffic_flow)
# print("卸点路段行驶时间(h)")
# print((self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num) / (1000 * empty_speed)))
# print("驶往卸点实际车流")
# print(self.actual_goto_dump_traffic_flow)
logger
.
info
(
"驶往卸点实际载重"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"卸点路段行驶时间(h)"
)
logger
.
info
(
(
self
.
distance_to_dump
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
empty_speed
)
)
)
logger
.
info
(
"驶往卸点实际车流"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"________________loading_task_time__________"
)
logger
.
info
(
loading_task_time
)
# self.actual_goto_excavator_traffic_flow = (
# self.actual_goto_excavator_traffic_flow
# / (
# self.distance_to_excavator.reshape(
# dynamic_dump_num, dynamic_excavator_num
# )
# / (1000 * heavy_speed)
# + np.expand_dims(loading_task_time, axis=0).repeat(
# dynamic_dump_num, axis=0
# )
# )
# )
# print("驶往挖机实际载重")
# print(self.actual_goto_excavator_traffic_flow)
# print("挖机路段行驶时间(h)")
# print((self.distance_to_excavator.reshape(dynamic_excavator_num, dynamic_dump_num) / (1000 * heavy_speed)))
# print("驶往挖机实际车流")
# print(self.actual_goto_excavator_traffic_flow)
logger
.
info
(
"驶往挖机实际载重"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
logger
.
info
(
"挖机路段行驶时间(h)"
)
logger
.
info
(
(
self
.
distance_to_excavator
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
heavy_speed
)
)
)
logger
.
info
(
"驶往挖机实际车流"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
def
dispatcher_period_update
(
self
):
# 装载映射参数及
...
...
@@ -379,10 +210,8 @@ class Dispatcher(WalkManage):
truck
.
state_period_update
()
# 更新实时车流
self
.
update_actual_traffic_flow
()
# 计算理想车流
(
self
.
opt_goto_dump_traffic_flow
,
self
.
opt_goto_excavator_traffic_flow
,)
=
traffic_flow_plan
(
truck
)
# self.update_actual_traffic_flow()
self
.
traffic_flow
.
update_actual_traffic_flow
()
# 矿卡抵达时间
excavator_reach_list
,
dump_reach_list
=
self
.
update_truck_reach_time
()
...
...
@@ -428,83 +257,61 @@ class Dispatcher(WalkManage):
# 维护一个矿卡调度表
self
.
Seq
=
[[]
for
_
in
range
(
truck
.
get_truck_num
())]
# 下面是交通流调度部分
# 驶往挖机的实际车流
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往挖机的实际车次
self
.
goto_dump_truck_num
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往卸载设备的实际车次
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往挖机的理想车流
self
.
opt_goto_dump_traffic_flow
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往卸载设备的实际车流
self
.
opt_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
def
truck_schedule
(
self
,
truck_id
):
# 规则读取
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
.
disabled
rule4
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
4
)
.
first
()
.
disabled
# cost_to_excavator, cost_to_dump, cost_park_to_excavator = self.path.walk_cost()
# try:
# 读取优先级设置
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
]]
# 挖机装载时间
loading_time
=
excavator
.
get_loading_time
()
# 路网信息
walk_time_park_to_excavator
=
walk_manage
.
get_walk_time_park_to_excavator
()
\
*
(
empty_speed
/
float
(
truck
.
empty_speed
[
truck_id
]))
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
()
now
=
float
(
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
target
=
0
# 是否启用挖机均衡
rule_ex
=
True
# 车流计算
# 驶往卸载设备的实际车流
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]}"
)
target
=
0
if
task
==
-
2
:
try
:
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
logger
.
info
(
"矿卡行程:无"
)
logger
.
info
(
f
"涉及挖机:{list(excavator.excavator_uuid_to_index_dict.keys())}"
)
logger
.
info
(
f
"行程时间:{(np.maximum(self.sim_excavator_ava_time, now + walk_time_park_to_excavator[0, :]) + loading_time - now)}"
)
logger
.
info
(
f
"行驶时间:{walk_time_park_to_excavator[0, :] + loading_time}"
)
logger
.
info
(
"物料类型"
)
if
truck_id
in
truck
.
truck_material_bind
:
logger
.
info
(
truck
.
truck_material_bind
[
truck_id
])
...
...
@@ -525,25 +332,28 @@ class Dispatcher(WalkManage):
try
:
if
truck_id
in
truck
.
truck_excavator_bind
:
target
=
excavator
.
excavator_uuid_to_index_dict
[
truck
.
truck_excavator_bind
[
truck_id
]]
el
se
:
el
if
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
]
#
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
# + truck.excavator_exclude_modify[truck_index]
# + truck.excavator_material_bind_modify[truck_index])
logger
.
info
(
transport_value
)
target
=
np
.
argmin
(
transport_value
+
excavator_exclude_modify
)
# + excavator_material_bind_modify)
target
=
self
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
else
:
actual_flow_to_excavator
=
truck
.
excavator_hold_truck_num
*
truck
.
payload
/
self
.
group
.
group_park_to_excavator
[
group_id
]
.
reshape
(
1
,
-
1
)
allow_flow_to_excavator
=
excavator
.
excavator_strength
target
=
np
.
argmin
(
actual_flow_to_excavator
/
allow_flow_to_excavator
)
target
=
self
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
group_id
][
target
]]
logger
.
info
(
f
"目的地:{excavator.excavator_index_to_uuid_dict[target]}"
)
except
Exception
as
es
:
...
...
@@ -558,34 +368,35 @@ class Dispatcher(WalkManage):
logger
.
error
(
es
)
try
:
assert
np
.
array
(
self
.
actual_goto_dump_traffic_flow
)
.
shape
==
(
assert
np
.
array
(
actual_goto_dump_traffic_flow
)
.
shape
==
(
dynamic_excavator_num
,
dynamic_dump_num
,)
assert
np
.
array
(
self
.
opt_goto_dump_traffic_flow
)
.
shape
==
(
assert
np
.
array
(
opt_goto_dump_traffic_flow
)
.
shape
==
(
dynamic_excavator_num
,
dynamic_dump_num
,)
except
Exception
as
es
:
logger
.
warning
(
es
)
self
.
actual_goto_dump_traffic_flow
=
np
.
array
(
self
.
actual_goto_dump_traffic_flow
)
.
reshape
((
dynamic_excavator_num
,
dynamic_dump_num
))
self
.
opt_goto_dump_traffic_flow
=
np
.
array
(
self
.
opt_goto_dump_traffic_flow
)
.
reshape
((
dynamic_excavator_num
,
dynamic_dump_num
))
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
))
self
.
actual_goto_dump_traffic_flow
=
np
.
array
(
self
.
actual_goto_dump_traffic_flow
)
self
.
opt_goto_dump_traffic_flow
=
np
.
array
(
self
.
opt_goto_dump_traffic_flow
)
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
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
actual_goto_dump_traffic_flow
)
logger
.
info
(
f
"卸载点理想车流:"
)
logger
.
info
(
self
.
opt_goto_dump_traffic_flow
)
logger
.
info
(
"卸载点实际车流"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:])
logger
.
info
(
actual_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:])
logger
.
info
(
"卸载点理想车流"
)
logger
.
info
(
self
.
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:])
...
...
@@ -611,7 +422,7 @@ class Dispatcher(WalkManage):
target
=
key
break
el
se
:
el
if
not
rule_ex
:
try
:
excavator_index
=
int
(
trip
[
1
])
excavator_id
=
self
.
excavator_index_to_uuid_dict
[
excavator_index
]
...
...
@@ -642,10 +453,10 @@ class Dispatcher(WalkManage):
else
:
try
:
#
提取
group actual traffic flow
#
计算
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 actual traffic flow
group_opt_goto_dump_traffic_flow
=
self
.
group
.
group_opt_goto_dump_traffic_flow
[
group_id
]
logger
.
info
(
"驶往卸点分组车流"
)
...
...
@@ -662,12 +473,11 @@ class Dispatcher(WalkManage):
except
Exception
as
es
:
logger
.
error
(
"error11"
)
logger
.
error
(
es
)
# transport_value = (self.actual_goto_dump_traffic_flow[int(trip[1]), :] + 0.001) \
# / (self.opt_goto_dump_traffic_flow[int(trip[1]), :] + 0.001)
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
:
...
...
@@ -700,8 +510,8 @@ class Dispatcher(WalkManage):
try
:
logger
.
info
(
"车流比:"
)
logger
.
info
((
self
.
actual_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
)
\
/
(
self
.
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
))
logger
.
info
((
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
)
...
...
@@ -710,8 +520,18 @@ class Dispatcher(WalkManage):
except
Exception
as
es
:
logger
.
error
(
"error06"
)
logger
.
error
(
es
)
else
:
excavator_index
=
int
(
trip
[
1
])
actual_flow_to_dump
=
truck
.
dump_hold_truck_num
*
truck
.
payload
/
\
self
.
group
.
group_walk_to_dump_cost
[
group_id
][:,
excavator_index
]
.
reshape
(
1
,
-
1
)
allow_flow_to_dump
=
dump
.
dump_strength
target
=
np
.
argmin
(
actual_flow_to_dump
/
allow_flow_to_dump
)
target
=
self
.
dump_uuid_to_index_dict
[
self
.
group
.
group_dump_index_to_uuid_dict
[
group_id
][
target
]]
elif
task
in
[
3
,
4
,
5
]:
...
...
@@ -733,15 +553,15 @@ class Dispatcher(WalkManage):
except
Exception
as
es
:
logger
.
warning
(
es
)
self
.
actual_goto_excavator_traffic_flow
=
np
.
array
(
self
.
actual_goto_excavator_traffic_flow
)
.
reshape
((
dynamic_dump_num
,
dynamic_excavator_num
))
self
.
opt_goto_excavator_traffic_flow
=
np
.
array
(
self
.
opt_goto_excavator_traffic_flow
)
.
reshape
((
dynamic_dump_num
,
dynamic_excavator_num
))
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
self
.
actual_goto_excavator_traffic_flow
=
np
.
array
(
self
.
actual_goto_excavator_traffic_flow
)
self
.
opt_goto_excavator_traffic_flow
=
np
.
array
(
self
.
opt_goto_excavator_traffic_flow
)
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:"
)
...
...
@@ -749,23 +569,11 @@ class Dispatcher(WalkManage):
logger
.
info
(
"卸点id:"
)
logger
.
info
(
dump
.
dump_uuid_to_index_dict
)
logger
.
info
(
f
"挖机实际车流:"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
logger
.
info
(
actual_goto_excavator_traffic_flow
)
logger
.
info
(
f
"挖机理想车流:"
)
logger
.
info
(
self
.
opt_goto_excavator_traffic_flow
)
logger
.
info
(
opt_goto_excavator_traffic_flow
)
logger
.
info
(
"重载trip"
)
logger
.
info
(
trip
)
try
:
logger
.
info
(
"挖机实际车流_行"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:])
logger
.
info
(
"挖机理想车流_行"
)
logger
.
info
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:])
except
Exception
as
es
:
logger
.
info
(
"trip出错"
)
logger
.
info
(
trip
)
logger
.
info
(
es
)
logger
.
info
(
"物料类型"
)
if
truck_id
in
truck
.
truck_material_bind
:
logger
.
info
(
truck
.
truck_material_bind
[
truck_id
])
...
...
@@ -784,7 +592,7 @@ class Dispatcher(WalkManage):
if
truck_id
in
truck
.
truck_excavator_bind
:
target
=
excavator
.
excavator_uuid_to_index_dict
[
truck
.
truck_excavator_bind
[
truck_id
]]
logger
.
info
(
"矿卡已绑定挖机"
)
el
se
:
el
if
not
rule_ex
:
logger
.
info
(
"cost_to_excavator"
)
logger
.
info
(
self
.
cost_to_excavator
)
...
...
@@ -833,6 +641,19 @@ class Dispatcher(WalkManage):
# + excavator_material_bind_modify)
target
=
self
.
excavator_uuid_to_index_dict
[
self
.
group
.
group_excavator_index_to_uuid_dict
[
target
]]
else
:
dump_index
=
int
(
trip
[
1
])
actual_flow_to_excavator
=
truck
.
excavator_hold_truck_num
*
truck
.
payload
/
\
self
.
group
.
group_walk_to_excavator_cost
[
group_id
][
dump_index
,
:]
.
reshape
(
1
,
-
1
)
allow_flow_to_excavator
=
excavator
.
excavator_strength
target
=
np
.
argmin
(
actual_flow_to_excavator
/
allow_flow_to_excavator
)
target
=
self
.
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
)
...
...
@@ -841,8 +662,8 @@ class Dispatcher(WalkManage):
try
:
logger
.
info
(
"车流比:"
)
logger
.
info
(
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
/
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
))
(
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
)
...
...
@@ -990,14 +811,6 @@ class Dispatcher(WalkManage):
elif
task
in
heavy_task_set
:
target_area_index
=
(
excavator
.
excavator_index_to_load_area_index_dict
[
target_eq_index
])
end_area_index
=
dump
.
dump_index_to_unload_area_index_dict
[
end_eq_index
]
# 更新变量,预计产量更新
self
.
sim_excavator_real_mass
[
target_eq_index
]
=
(
self
.
sim_excavator_real_mass
[
target_eq_index
]
+
payload
[
truck_index
])
# 预计装载点可用时间更新
self
.
sim_excavator_ava_time
[
target_eq_index
]
=
(
max
(
self
.
sim_excavator_ava_time
[
target_eq_index
],
self
.
sim_truck_ava_time
[
truck_index
]
+
walk_time_to_unload_area
[
end_area_index
][
target_area_index
],)
\
+
loading_task_time
[
target_eq_index
])
else
:
pass
except
Exception
as
es
:
...
...
@@ -1106,382 +919,55 @@ class Dispatcher(WalkManage):
return
Seq
class
Group
(
WalkManage
):
def
__init__
(
self
):
self
.
dispatch_truck_group
=
{}
self
.
group_num
=
1
self
.
group_set
=
set
()
self
.
device_group
=
{}
self
.
group_walk_to_excavator_cost
=
{}
self
.
group_walk_to_dump_cost
=
{}
self
.
group_park_to_excavator
=
{}
self
.
group_opt_goto_dump_traffic_flow
=
{}
self
.
group_opt_goto_excavator_traffic_flow
=
{}
self
.
group_actual_goto_dump_traffic_flow
=
{}
self
.
group_actual_goto_excavator_traffic_flow
=
{}
self
.
group_excavator_uuid_to_index_dict
=
{}
self
.
group_dump_uuid_to_index_dict
=
{}
self
.
group_excavator_index_to_uuid_dict
=
{}
self
.
group_dump_index_to_uuid_dict
=
{}
self
.
group_excavator_exclude_modify
=
{}
self
.
group_excavator_material_bind_modify
=
{}
self
.
group_dump_material_bind_modify
=
{}
self
.
path
=
PathPlanner
()
def
update_dispatch_truck_group
(
self
):
# 更新矿卡-调度分组隶属关系
self
.
dispatch_truck_group
=
{}
dynamic_truck_set
=
get_value
(
"dynamic_truck_set"
)
print
(
"dispatch_truck_group-dynamic_truck_set"
)
print
(
dynamic_truck_set
)
# 动态派车数量没变,但是此时某条派车计划被删除,dispatch_truck_group 就会缺失矿卡
for
truck_id
in
dynamic_truck_set
:
item
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
truck_id
=
truck_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
()
if
item
is
None
:
print
(
truck_id
)
continue
self
.
dispatch_truck_group
[
truck_id
]
=
item
.
group_id
print
(
self
.
dispatch_truck_group
)
def
update_group_set
(
self
):
# 更新调度组
self
.
group_set
=
set
()
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isauto
=
1
,
isdeleted
=
0
)
.
all
():
if
item
.
group_id
is
not
None
:
self
.
group_set
.
add
(
item
.
group_id
)
self
.
group_num
=
len
(
self
.
group_set
)
def
update_device_group
(
self
):
# 更新设备分组group_id -> {set(dump_id), set(excavator_id)}
self
.
device_group
=
{}
for
group_id
in
self
.
get_group_set
():
if
group_id
not
in
self
.
device_group
:
self
.
device_group
[
group_id
]
=
[
set
(),
set
()]
else
:
continue
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
group_id
=
group_id
,
isauto
=
1
,
isdeleted
=
0
)
.
all
():
self
.
device_group
[
group_id
][
0
]
.
add
(
item
.
dump_id
)
self
.
device_group
[
group_id
][
1
]
.
add
(
item
.
exactor_id
)
def
update_group_truck_flow
(
self
):
# 更新调度分组内车实时/最佳车流
global
dispatcher
actual_goto_excavator_traffic_flow
,
actual_goto_dump_traffic_flow
=
\
dispatcher
.
actual_goto_excavator_traffic_flow
,
dispatcher
.
actual_goto_dump_traffic_flow
opt_goto_dump_traffic_flow
,
opt_goto_excavator_traffic_flow
=
traffic_flow_plan
(
truck
)
try
:
print
(
"uuid_to_index_dict"
)
print
(
dump
.
dump_uuid_to_index_dict
)
print
(
excavator
.
excavator_uuid_to_index_dict
)
for
group_id
in
self
.
group_set
:
dump_group
=
self
.
device_group
[
group_id
][
0
]
# group 类最后更新,读取派车计划及分组情况,和前面的uuid 可能不一致
excavator_group
=
self
.
device_group
[
group_id
][
1
]
print
(
"group"
)
print
(
self
.
device_group
)
local_opt_goto_dump_traffic_flow
=
np
.
zeros
((
len
(
excavator_group
),
len
(
dump_group
)))
local_opt_goto_excavator_traffic_flow
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
local_actual_goto_dump_traffic_flow
=
np
.
zeros
((
len
(
excavator_group
),
len
(
dump_group
)))
local_actual_goto_excavator_traffic_flow
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
for
excavator_id
in
excavator_group
:
for
dump_id
in
dump_group
:
dump_group_index
=
self
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
excavator_group_index
=
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
local_opt_goto_dump_traffic_flow
[
excavator_group_index
][
dump_group_index
]
=
\
opt_goto_dump_traffic_flow
[
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]][
dump
.
dump_uuid_to_index_dict
[
dump_id
]]
local_opt_goto_excavator_traffic_flow
[
dump_group_index
][
excavator_group_index
]
=
\
opt_goto_excavator_traffic_flow
[
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
local_actual_goto_dump_traffic_flow
[
excavator_group_index
][
dump_group_index
]
=
\
actual_goto_dump_traffic_flow
[
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]][
dump
.
dump_uuid_to_index_dict
[
dump_id
]]
local_actual_goto_excavator_traffic_flow
[
dump_group_index
][
excavator_group_index
]
=
\
actual_goto_excavator_traffic_flow
[
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
self
.
group_opt_goto_dump_traffic_flow
[
group_id
]
=
local_opt_goto_dump_traffic_flow
self
.
group_opt_goto_excavator_traffic_flow
[
group_id
]
=
local_opt_goto_excavator_traffic_flow
self
.
group_actual_goto_dump_traffic_flow
[
group_id
]
=
local_actual_goto_dump_traffic_flow
self
.
group_actual_goto_excavator_traffic_flow
[
group_id
]
=
local_actual_goto_excavator_traffic_flow
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
"分组车流更新异常"
)
logger
.
info
(
"group_opt_traffic_flow"
)
logger
.
info
(
self
.
group_opt_goto_dump_traffic_flow
)
logger
.
info
(
self
.
group_opt_goto_excavator_traffic_flow
)
def
update_group_walk_cost
(
self
):
# 更新调度分组路网行驶成本
walk_to_excavator_cost
,
walk_to_dump_cost
,
park_to_excavator_cost
=
self
.
path
.
walk_cost
()
try
:
for
group_id
in
self
.
group_set
:
dump_group
=
self
.
device_group
[
group_id
][
0
]
excavator_group
=
self
.
device_group
[
group_id
][
1
]
local_walk_to_excavator_cost
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
local_walk_to_dump_cost
=
np
.
zeros
((
len
(
dump_group
),
len
(
excavator_group
)))
local_park_to_excavator_cost
=
np
.
zeros
((
park_num
,
len
(
excavator_group
)))
for
excavator_id
in
excavator_group
:
for
dump_id
in
dump_group
:
dump_group_index
=
self
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
excavator_group_index
=
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
print
(
"dump_group"
)
print
(
dump_group
)
local_walk_to_excavator_cost
[
dump_group_index
][
excavator_group_index
]
=
\
walk_to_excavator_cost
[
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
local_walk_to_dump_cost
[
dump_group_index
][
excavator_group_index
]
=
\
walk_to_dump_cost
[
dump
.
dump_uuid_to_index_dict
[
dump_id
]][
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
for
park_index
in
range
(
park_num
):
for
excavator_id
in
excavator_group
:
excavator_group_index
=
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
local_park_to_excavator_cost
[
park_index
][
excavator_group_index
]
=
\
park_to_excavator_cost
[
park_index
][
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]]
self
.
group_walk_to_excavator_cost
[
group_id
]
=
local_walk_to_excavator_cost
self
.
group_walk_to_dump_cost
[
group_id
]
=
local_walk_to_dump_cost
self
.
group_park_to_excavator
[
group_id
]
=
local_park_to_excavator_cost
except
Exception
as
es
:
logger
.
info
(
es
)
logger
.
info
(
"error-11"
)
def
update_group_device_map
(
self
):
# 更新调度分组内设备映射
self
.
group_excavator_uuid_to_index_dict
=
{}
self
.
group_dump_uuid_to_index_dict
=
{}
self
.
group_excavator_index_to_uuid_dict
=
{}
self
.
group_dump_index_to_uuid_dict
=
{}
for
group_id
in
self
.
group_set
:
excavator_num
=
0
dump_num
=
0
dump_group
=
self
.
device_group
[
group_id
][
0
]
excavator_group
=
self
.
device_group
[
group_id
][
1
]
self
.
group_excavator_uuid_to_index_dict
[
group_id
]
=
{}
self
.
group_excavator_index_to_uuid_dict
[
group_id
]
=
{}
self
.
group_dump_uuid_to_index_dict
[
group_id
]
=
{}
self
.
group_dump_index_to_uuid_dict
[
group_id
]
=
{}
for
excavator_id
in
excavator_group
:
if
excavator_id
not
in
self
.
group_excavator_uuid_to_index_dict
:
self
.
group_excavator_index_to_uuid_dict
[
group_id
][
excavator_num
]
=
excavator_id
self
.
group_excavator_uuid_to_index_dict
[
group_id
][
excavator_id
]
=
excavator_num
excavator_num
=
excavator_num
+
1
for
dump_id
in
dump_group
:
if
dump_id
not
in
self
.
group_dump_uuid_to_index_dict
:
self
.
group_dump_index_to_uuid_dict
[
group_id
][
dump_num
]
=
dump_id
self
.
group_dump_uuid_to_index_dict
[
group_id
][
dump_id
]
=
dump_num
dump_num
=
dump_num
+
1
logger
.
info
(
"group_map"
)
logger
.
info
(
self
.
group_dump_uuid_to_index_dict
)
logger
.
info
(
self
.
group_excavator_uuid_to_index_dict
)
def
update_modify
(
self
):
try
:
dynamic_truck_set
=
get_value
(
"dynamic_truck_set"
)
print
(
"update_modify"
)
print
(
dynamic_truck_set
)
print
(
"self.dispatch_truck_group"
)
print
(
self
.
dispatch_truck_group
)
self
.
group_excavator_exclude_modify
=
{}
self
.
group_excavator_material_bind_modify
=
{}
self
.
group_dump_material_bind_modify
=
{}
for
truck_id
in
dynamic_truck_set
:
group_id
=
self
.
dispatch_truck_group
[
truck_id
]
group_dump_num
=
len
(
self
.
device_group
[
group_id
][
0
])
group_excavator_num
=
len
(
self
.
device_group
[
group_id
][
1
])
excavator_exclude_modify
=
np
.
zeros
(
group_excavator_num
)
excavator_material_bind_modify
=
np
.
zeros
(
group_excavator_num
)
dump_material_bind_modify
=
np
.
zeros
(
group_dump_num
)
truck_index
=
truck
.
truck_uuid_to_index_dict
[
truck_id
]
for
group_excavator_index
in
range
(
group_excavator_num
):
excavator_index
=
excavator
.
excavator_uuid_to_index_dict
[
self
.
group_excavator_index_to_uuid_dict
[
group_id
][
group_excavator_index
]]
excavator_exclude_modify
[
group_excavator_index
]
=
truck
.
excavator_exclude_modify
[
truck_index
][
excavator_index
]
for
group_excavator_index
in
range
(
group_excavator_num
):
excavator_index
=
excavator
.
excavator_uuid_to_index_dict
[
self
.
group_excavator_index_to_uuid_dict
[
group_id
][
group_excavator_index
]]
excavator_material_bind_modify
[
group_excavator_index
]
=
truck
.
excavator_material_bind_modify
[
truck_index
][
excavator_index
]
for
group_dump_index
in
range
(
group_dump_num
):
dump_index
=
dump
.
dump_uuid_to_index_dict
[
self
.
group_dump_index_to_uuid_dict
[
group_id
][
group_dump_index
]]
print
(
truck
.
dump_material_bind_modify
,
truck_index
,
dump_index
)
print
(
truck
.
dump_material_bind_modify
[
truck_index
][
dump_index
],
truck_index
,
dump_index
)
dump_material_bind_modify
[
group_dump_index
]
=
truck
.
dump_material_bind_modify
[
truck_index
][
dump_index
]
self
.
group_excavator_exclude_modify
[
truck_id
]
=
excavator_exclude_modify
self
.
group_excavator_material_bind_modify
[
truck_id
]
=
excavator_material_bind_modify
self
.
group_dump_material_bind_modify
[
truck_id
]
=
dump_material_bind_modify
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
"modify update 异常"
)
def
period_update
(
self
):
self
.
reset
()
self
.
update_dispatch_truck_group
()
self
.
update_group_set
()
self
.
update_device_group
()
self
.
update_group_device_map
()
self
.
update_group_walk_cost
()
self
.
update_group_truck_flow
()
self
.
update_modify
()
def
get_diaptch_truck_group
(
self
):
return
self
.
dispatch_truck_group
def
get_group_num
(
self
):
return
self
.
group_num
def
get_group_set
(
self
):
return
self
.
group_set
def
reset
(
self
):
self
.
dispatch_truck_group
=
{}
self
.
group_num
=
1
self
.
group_set
=
set
()
self
.
device_group
=
{}
self
.
group_walk_to_excavator_cost
=
{}
self
.
group_walk_to_dump_cost
=
{}
self
.
group_park_to_excavator
=
{}
self
.
group_opt_goto_dump_traffic_flow
=
{}
self
.
group_opt_goto_excavator_traffic_flow
=
{}
self
.
group_actual_goto_dump_traffic_flow
=
{}
self
.
group_actual_goto_excavator_traffic_flow
=
{}
self
.
group_excavator_uuid_to_index_dict
=
{}
self
.
group_dump_uuid_to_index_dict
=
{}
self
.
group_excavator_index_to_uuid_dict
=
{}
self
.
group_dump_index_to_uuid_dict
=
{}
self
.
group_excavator_exclude_modify
=
{}
self
.
group_excavator_material_bind_modify
=
{}
self
.
group_dump_material_bind_modify
=
{}
# def para_process(dispatcher):
#
# logger.info("papa_process!")
#
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 清空数据库缓存
# session_postgre.commit()
# session_postgre.flush()
#
# # 周期更新
# dispatcher.para_period_update()
#
#
# def state_process(dispatcher):
#
# print("state_process!")
#
# logger.info("state_process!")
#
# # 清空数据库缓存
# session_mysql.commit()
# session_mysql.flush()
#
# # 清空数据库缓存
# session_postgre.commit()
# session_postgre.flush()
#
# # 周期更新
# dispatcher.state_period_update()
#
# # 参数重置
# dispatcher.sim_para_reset()
#
# # try:
#
# # 调度计算
# dispatcher.schedule_construct()
#
# # except Exception as es:
# # logger.error("更新不及时")
# # logger.error(es)
# 下面三个函数保证程序定期执行,不用管他
def
process
(
dispatcher
):
# try:
# 更新周期参数
logger
.
info
(
"#####################################周期更新开始#####################################"
)
period_para_update
()
if
get_value
(
"dynamic_dump_num"
)
*
get_value
(
"dynamic_excavator_num"
)
==
0
:
raise
Exception
(
"无动态派车计划可用"
)
return
if
get_value
(
"dynamic_truck_num"
)
==
0
:
raise
Exception
(
"无动态派车可用矿卡"
)
return
# para_process(dispatcher)
#
# state_process(dispatcher)
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
flush
()
# 清空数据库缓存
session_postgre
.
commit
()
session_postgre
.
flush
()
#
# # 周期更新
# dispatcher.para_period_update()
# 周期更新
dispatcher
.
dispatcher_period_update
()
try
:
# 更新周期参数
logger
.
info
(
"#####################################周期更新开始#####################################"
)
period_para_update
()
if
get_value
(
"dynamic_dump_num"
)
*
get_value
(
"dynamic_excavator_num"
)
==
0
:
raise
Exception
(
"无动态派车计划可用"
)
return
if
get_value
(
"dynamic_truck_num"
)
==
0
:
raise
Exception
(
"无动态派车可用矿卡"
)
return
# para_process(dispatcher)
#
# state_process(dispatcher)
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
flush
()
# 清空数据库缓存
session_postgre
.
commit
()
session_postgre
.
flush
()
#
# # 周期更新
# dispatcher.para_period_update()
# 周期更新
dispatcher
.
dispatcher_period_update
()
# 参数重置
dispatcher
.
sim_para_reset
()
# 参数重置
dispatcher
.
sim_para_reset
()
# try:
# try:
# 调度计算
dispatcher
.
schedule_construct
()
# 调度计算
dispatcher
.
schedule_construct
()
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
logger
.
info
(
"#####################################周期更新结束#####################################"
)
logger
.
info
(
"#####################################周期更新结束#####################################"
)
# except Exception as es:
# logger.error(es)
except
Exception
as
es
:
logger
.
error
(
"最外层异常捕获"
)
logger
.
error
(
es
)
period_para_update
()
scheduler
=
sched
.
scheduler
(
time
.
time
,
time
.
sleep
)
...
...
settings.py
View file @
670e5b13
...
...
@@ -55,8 +55,8 @@ log_path = para_config["log_path"]
# 创建日志目录
if
not
os
.
path
.
exists
(
log_path
):
os
.
mkdir
(
log_path
)
#
if not os.path.exists(log_path):
#
os.mkdir(log_path)
# logging初始化工作
logging
.
basicConfig
()
...
...
@@ -65,8 +65,8 @@ 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)
#
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"
...
...
traffic_flow/traffic_flow_info.py
View file @
670e5b13
...
...
@@ -14,6 +14,154 @@ from equipment.dump import DumpInfo
from
equipment.truck
import
TruckInfo
class
Traffic_flow
(
WalkManage
):
def
__init__
(
self
,
dump
,
excavator
,
truck
):
self
.
dump
=
dump
self
.
excavator
=
excavator
self
.
truck
=
truck
# 驶往挖机的实际车流
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往挖机的实际车次
self
.
goto_dump_truck_num
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往卸载设备的实际车次
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往挖机的理想车流
self
.
opt_goto_dump_traffic_flow
=
np
.
zeros
(
(
excavator
.
get_excavator_num
(),
dump
.
get_dump_num
())
)
# 驶往卸载设备的实际车流
self
.
opt_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 更新实际交通流
def
update_actual_traffic_flow
(
self
):
# 装载周期参数
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
loading_task_time
=
self
.
excavator
.
get_loading_task_time
()
unloading_task_time
=
self
.
dump
.
get_unloading_task_time
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
payload
=
self
.
truck
.
get_payload
()
dynamic_dump_num
=
get_value
(
"dynamic_dump_num"
)
dynamic_excavator_num
=
get_value
(
"dynamic_excavator_num"
)
dynamic_truck_num
=
get_value
(
"dynamic_truck_num"
)
self
.
goto_dump_truck_num
=
np
.
zeros
((
dynamic_excavator_num
,
dynamic_dump_num
))
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
dynamic_excavator_num
,
dynamic_dump_num
)
)
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dynamic_dump_num
,
dynamic_excavator_num
)
)
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dynamic_dump_num
,
dynamic_excavator_num
)
)
# try:
logger
.
info
(
"dynamic_truck_num"
)
logger
.
info
(
dynamic_truck_num
)
print
(
"truck.truck_index_to_uuid_dict"
)
print
(
self
.
truck
.
truck_index_to_uuid_dict
)
print
(
"truck_current_task"
)
print
(
truck_current_task
)
for
i
in
range
(
dynamic_truck_num
):
task
=
truck_current_task
[
self
.
truck
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
truck_current_trip
[
i
][
1
]
start_area_index
=
truck_current_trip
[
i
][
0
]
if
task
in
heavy_task_set
:
self
.
goto_dump_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_dump_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
# logger.info("debug2")
if
task
in
empty_task_set
:
self
.
goto_excavator_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_excavator_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
self
.
actual_goto_dump_traffic_flow
=
self
.
actual_goto_dump_traffic_flow
/
(
self
.
distance_to_dump
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
empty_speed
)
+
np
.
expand_dims
(
unloading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_excavator_num
,
axis
=
0
)
)
self
.
actual_goto_excavator_traffic_flow
=
(
self
.
actual_goto_excavator_traffic_flow
/
(
self
.
distance_to_excavator
.
reshape
(
dynamic_dump_num
,
dynamic_excavator_num
)
/
(
1000
*
heavy_speed
)
+
np
.
expand_dims
(
loading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_dump_num
,
axis
=
0
)
)
)
logger
.
info
(
"self.goto_dump_truck_num"
)
logger
.
info
(
self
.
goto_dump_truck_num
)
logger
.
info
(
"self.actual_goto_dump_traffic_flow"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"self.goto_excavator_truck_num"
)
logger
.
info
(
self
.
goto_excavator_truck_num
)
logger
.
info
(
"self.actual_goto_excavator_traffic_flow"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
# except Exception as es:
# logger.error("未知错误001")
# logger.error(es)
# print("驶往卸点实际载重")
# print(self.actual_goto_dump_traffic_flow)
# print("卸点路段行驶时间(h)")
# print((self.distance_to_dump.reshape(dynamic_excavator_num, dynamic_dump_num) / (1000 * empty_speed)))
# print("驶往卸点实际车流")
# print(self.actual_goto_dump_traffic_flow)
logger
.
info
(
"驶往卸点实际载重"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"卸点路段行驶时间(h)"
)
logger
.
info
(
(
self
.
distance_to_dump
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
empty_speed
)
)
)
logger
.
info
(
"驶往卸点实际车流"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"________________loading_task_time__________"
)
logger
.
info
(
loading_task_time
)
# 车流规划类
class
Traffic_para
(
WalkManage
):
def
__init__
(
self
,
num_of_load_area
,
num_of_unload_area
,
num_of_excavator
,
num_of_dump
,
truck
):
...
...
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