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
8794c315
Commit
8794c315
authored
Jun 02, 2023
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
解决空/重载过程中长时间无法获取派车计划问题
parent
edc1105f
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
111 additions
and
89 deletions
+111
-89
dispatcher.py
core/dispatcher.py
+3
-1
group.py
core/group.py
+79
-66
dispatchInfo.py
data/dispatchInfo.py
+26
-19
realtime_dispatch.py
realtime_dispatch.py
+1
-1
start.sh
start.sh
+2
-2
No files found.
core/dispatcher.py
View file @
8794c315
...
@@ -14,6 +14,7 @@ from equipment import TruckInfo, ExcavatorInfo, DumpInfo
...
@@ -14,6 +14,7 @@ from equipment import TruckInfo, ExcavatorInfo, DumpInfo
from
core.schedule
import
PreSchedule
from
core.schedule
import
PreSchedule
from
graph.graph_load
import
graph_construct
from
graph.graph_load
import
graph_construct
from
core.group
import
GroupDispatcher
from
core.group
import
GroupDispatcher
from
graph.topo_graph
import
*
class
Dispatcher
:
class
Dispatcher
:
...
@@ -31,7 +32,8 @@ class Dispatcher:
...
@@ -31,7 +32,8 @@ class Dispatcher:
self
.
logger
=
get_logger
(
"zxt.dispatcher"
)
self
.
logger
=
get_logger
(
"zxt.dispatcher"
)
self
.
redispatch_active
=
active
self
.
redispatch_active
=
active
if
self
.
redispatch_active
:
if
self
.
redispatch_active
:
self
.
topo
=
graph_construct
()
self
.
topo
=
Topo
()
self
.
topo
.
generate_topo_graph
()
else
:
else
:
self
.
topo
=
None
self
.
topo
=
None
self
.
submission
=
DispatchSubmission
(
dump
,
excavator
,
truck
,
self
.
topo
)
self
.
submission
=
DispatchSubmission
(
dump
,
excavator
,
truck
,
self
.
topo
)
...
...
core/group.py
View file @
8794c315
...
@@ -561,7 +561,6 @@ class GroupDispatcher:
...
@@ -561,7 +561,6 @@ class GroupDispatcher:
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
if
truck_task
in
[
-
2
,
3
,
4
,
5
]:
if
truck_task
in
[
-
2
,
3
,
4
,
5
]:
#
if
truck_task
==
3
:
if
truck_task
==
3
:
if
self
.
group
.
topo
is
not
None
and
truck_locate
is
not
None
:
if
self
.
group
.
topo
is
not
None
and
truck_locate
is
not
None
:
self
.
logger
.
info
(
"潜在二次调度车辆状态"
)
self
.
logger
.
info
(
"潜在二次调度车辆状态"
)
...
@@ -582,46 +581,15 @@ class GroupDispatcher:
...
@@ -582,46 +581,15 @@ class GroupDispatcher:
self
.
logger
.
error
(
"二次调度至卸载点失败"
)
self
.
logger
.
error
(
"二次调度至卸载点失败"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
else
:
else
:
self
.
logger
.
info
(
"未触发二次调度"
)
self
.
logger
.
info
(
"未触发二次调度, 执行重载周期调度"
)
self
.
heavy_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_task
,
truck_trip
)
else
:
else
:
self
.
logger
.
info
(
"正常重载行驶无需调度"
)
self
.
logger
.
info
(
"正常重载行驶, 执行重载周期调度"
)
self
.
heavy_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_task
,
truck_trip
)
else
:
else
:
try
:
self
.
logger
.
info
(
"卸载区内, 执行重载周期调度"
)
if
truck_id
in
self
.
group
.
truck
.
truck_excavator_bind
:
self
.
heavy_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_task
,
truck_trip
)
self
.
logger
.
info
(
"车辆存在绑定关系"
)
try
:
if
truck_id
not
in
self
.
group
.
truck
.
truck_excavator_bind
:
raise
CoreException
(
102
,
f
'truck.group_excavators bind 中不存在 {truck_id}'
)
except
CoreException
as
es
:
es
.
with_traceback_info
()
self
.
logger
.
error
(
es
)
return
next_excavator_id
=
self
.
group
.
truck
.
truck_excavator_bind
[
truck_id
]
else
:
self
.
logger
.
info
(
"触发调度算法逻辑"
)
next_excavator_value
=
s
.
solve
(
truck_info
)
self
.
logger
.
info
(
f
'车辆排斥修正 {truck_id}, {self.group.truck_excavator_exclude_modify[truck_id]}'
)
min_index
=
np
.
argmin
(
next_excavator_value
+
self
.
group
.
truck_excavator_exclude_modify
[
truck_id
])
# min_index = np.argmin(next_excavator_value)
next_excavator_id
=
self
.
group
.
excavator_uuid_index_dict
.
inverse
[
min_index
]
self
.
logger
.
info
(
f
'目标挖机 {min_index} {next_excavator_id}'
)
if
truck_task
==
-
2
:
next_unload_area_id
=
"Park"
else
:
dump_id
=
get_value
(
"dump_index_to_uuid_dict"
)[
truck_trip
[
-
1
]]
next_unload_area_id
=
get_value
(
"dump_uuid_to_unload_area_uuid_dict"
)[
dump_id
]
truck_dispatch
[
truck_id
]
=
[
next_excavator_id
,
next_unload_area_id
]
self
.
logger
.
info
(
f
'调度结果 next_excavator_id: '
f
'{next_excavator_id} next_unload_area_id: {next_unload_area_id}'
)
except
Exception
as
es
:
self
.
logger
.
error
(
"重载车辆全智能模式-计算异常"
)
self
.
logger
.
error
(
es
)
# 车辆位于装载区内, 调度车辆前往卸载区
# 车辆位于装载区内, 调度车辆前往卸载区
elif
truck_task
in
[
0
,
1
,
2
]:
elif
truck_task
in
[
0
,
1
,
2
]:
...
@@ -646,47 +614,92 @@ class GroupDispatcher:
...
@@ -646,47 +614,92 @@ class GroupDispatcher:
self
.
logger
.
error
(
"二次调度至装载点失败"
)
self
.
logger
.
error
(
"二次调度至装载点失败"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
else
:
else
:
self
.
logger
.
info
(
"未触发二次调度"
)
self
.
logger
.
info
(
"未触发二次调度,执行空载周期调度"
)
self
.
empty_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_trip
)
# 穿越装载区判断
# 穿越装载区判断
if
self
.
gothrough_active
:
if
self
.
gothrough_active
:
self
.
gothroghdispatcher
.
update_lanes_info
()
self
.
gothroghdispatcher
.
update_lanes_info
()
self
.
gothroghdispatcher
.
redispatch_request
(
request_truck_id
=
truck_id
,
truck
=
self
.
group
.
truck
)
self
.
gothroghdispatcher
.
redispatch_request
(
request_truck_id
=
truck_id
,
truck
=
self
.
group
.
truck
)
else
:
else
:
self
.
logger
.
info
(
"正常空载行驶无需调度"
)
self
.
logger
.
info
(
"正常空载行驶,执行空载周期调度"
)
self
.
empty_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_trip
)
else
:
else
:
try
:
self
.
logger
.
info
(
"装载区内,执行空载周期调度"
)
next_excavator_id
=
get_value
(
"excavator_index_to_uuid_dict"
)[
truck_trip
[
-
1
]]
self
.
empty_period_dispatch
(
s
,
truck_dispatch
,
truck_id
,
truck_info
,
truck_trip
)
next_unload_area_value
=
s
.
solve
(
truck_info
)
# TODO:车辆在空载状态是否应该如何计算,是计算下一次卸载区还是继续计算当前最优挖机
if
truck_id
in
self
.
group
.
truck
.
truck_dump_bind
:
self
.
logger
.
info
(
"车辆存在绑定关系"
)
def
heavy_period_dispatch
(
self
,
s
:
AlgorithmBase
,
truck_dispatch
:
Mapping
[
str
,
List
[
str
]],
truck_id
:
str
,
dump_uuid_to_unload_area_uuid_dict
=
get_value
(
"dump_uuid_to_unload_area_uuid_dict"
)
truck_info
:
CurrentTruck
,
truck_task
:
int
,
truck_trip
:
List
[
int
]):
next_unload_area_id
=
dump_uuid_to_unload_area_uuid_dict
[
try
:
self
.
group
.
truck
.
truck_dump_bind
[
truck_id
]]
if
truck_id
in
self
.
group
.
truck
.
truck_excavator_bind
:
else
:
self
.
logger
.
info
(
"车辆存在绑定关系"
)
self
.
logger
.
info
(
"触发调度算法逻辑"
)
# try:
next_unload_area_value
*=
self
.
group
.
group_walk_available
[
# if truck_id not in self.group.truck.truck_excavator_bind:
self
.
group
.
excavator_uuid_index_dict
[
next_excavator_id
],
:]
.
flatten
()
# raise CoreException(102, f'truck.group_excavators bind 中不存在 {truck_id}')
# except CoreException as es:
# es.with_traceback_info()
# self.logger.error(es)
# return
next_excavator_id
=
self
.
group
.
truck
.
truck_excavator_bind
[
truck_id
]
else
:
self
.
logger
.
info
(
"触发调度算法逻辑"
)
next_excavator_value
=
s
.
solve
(
truck_info
)
self
.
logger
.
info
(
f
'车辆排斥修正 {truck_id}, {self.group.truck_excavator_exclude_modify[truck_id]}'
)
min_index
=
np
.
argmin
(
next_excavator_value
+
self
.
group
.
truck_excavator_exclude_modify
[
truck_id
])
# min_index = np.argmin(next_excavator_value)
next_excavator_id
=
self
.
group
.
excavator_uuid_index_dict
.
inverse
[
min_index
]
self
.
logger
.
info
(
f
'目标挖机 {min_index} {next_excavator_id}'
)
if
truck_task
==
-
2
:
next_unload_area_id
=
"Park"
else
:
dump_id
=
get_value
(
"dump_index_to_uuid_dict"
)[
truck_trip
[
-
1
]]
next_unload_area_id
=
get_value
(
"dump_uuid_to_unload_area_uuid_dict"
)[
dump_id
]
truck_dispatch
[
truck_id
]
=
[
next_excavator_id
,
next_unload_area_id
]
min_index
=
np
.
argmin
(
next_unload_area_value
)
self
.
logger
.
info
(
f
'调度结果 next_excavator_id: '
next_unload_area_id
=
self
.
group
.
unload_area_uuid_index_dict
.
inverse
[
min_index
]
f
'{next_excavator_id} next_unload_area_id: {next_unload_area_id}'
)
self
.
logger
.
info
(
f
'目标卸点 {min_index} {next_unload_area_id}'
)
except
Exception
as
es
:
# next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
self
.
logger
.
error
(
"重载车辆全智能模式-计算异常"
)
self
.
logger
.
error
(
es
)
truck_dispatch
[
truck_id
]
=
[
next_excavator_id
,
next_unload_area_id
]
def
empty_period_dispatch
(
self
,
s
:
AlgorithmBase
,
truck_dispatch
:
Mapping
[
str
,
List
[
str
]],
truck_id
:
str
,
truck_info
:
CurrentTruck
,
truck_trip
:
List
[
int
]):
try
:
next_excavator_id
=
get_value
(
"excavator_index_to_uuid_dict"
)[
truck_trip
[
-
1
]]
next_unload_area_value
=
s
.
solve
(
truck_info
)
if
truck_id
in
self
.
group
.
truck
.
truck_dump_bind
:
self
.
logger
.
info
(
"车辆存在绑定关系"
)
dump_uuid_to_unload_area_uuid_dict
=
get_value
(
"dump_uuid_to_unload_area_uuid_dict"
)
next_unload_area_id
=
dump_uuid_to_unload_area_uuid_dict
[
self
.
group
.
truck
.
truck_dump_bind
[
truck_id
]]
else
:
self
.
logger
.
info
(
"触发调度算法逻辑"
)
next_unload_area_value
*=
self
.
group
.
group_walk_available
[
self
.
group
.
excavator_uuid_index_dict
[
next_excavator_id
],
:]
.
flatten
()
self
.
logger
.
info
(
f
'调度结果 next_excavator_id: '
min_index
=
np
.
argmin
(
next_unload_area_value
)
f
'{next_excavator_id} next_unload_area_id: {next_unload_area_id}'
)
next_unload_area_id
=
self
.
group
.
unload_area_uuid_index_dict
.
inverse
[
min_index
]
except
Exception
as
es
:
self
.
logger
.
info
(
f
'目标卸点 {min_index} {next_unload_area_id}'
)
self
.
logger
.
error
(
"空载车辆全智能模式-计算异常"
)
# next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
self
.
logger
.
error
(
es
.
__traceback__
.
tb_lineno
)
self
.
logger
.
error
(
es
)
truck_dispatch
[
truck_id
]
=
[
None
,
None
]
# TODO:车辆在空载状态是否应该如何计算,是计算下一次卸载区还是继续计算当前最优挖机
truck_dispatch
[
truck_id
]
=
[
next_excavator_id
,
next_unload_area_id
]
self
.
logger
.
info
(
f
'调度结果 next_excavator_id: '
f
'{next_excavator_id} next_unload_area_id: {next_unload_area_id}'
)
except
Exception
as
es
:
self
.
logger
.
error
(
"空载车辆全智能模式-计算异常"
)
self
.
logger
.
error
(
es
.
__traceback__
.
tb_lineno
)
self
.
logger
.
error
(
es
)
truck_dispatch
[
truck_id
]
=
[
None
,
None
]
def
truck_construct
(
self
,
truck_id
):
def
truck_construct
(
self
,
truck_id
):
"""
"""
...
...
data/dispatchInfo.py
View file @
8794c315
...
@@ -193,12 +193,14 @@ class DispatchInfo:
...
@@ -193,12 +193,14 @@ class DispatchInfo:
try
:
try
:
for
item
in
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
isdeleted
=
0
)
.
all
():
for
item
in
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
isdeleted
=
0
)
.
all
():
# add group_excavators
# add group_excavators
if
item
.
group_id
not
in
cls
.
group_excavator_dict
.
keys
():
excavator_state
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
item
.
exactor_id
)
.
first
()
cls
.
group_excavator_dict
[
item
.
group_id
]
=
[
item
.
exactor_id
]
if
excavator_state
is
not
None
and
excavator_state
.
disabled
==
1
:
else
:
if
item
.
group_id
not
in
cls
.
group_excavator_dict
.
keys
():
if
item
.
exactor_id
not
in
cls
.
group_excavator_dict
[
item
.
group_id
]:
cls
.
group_excavator_dict
[
item
.
group_id
]
=
[
item
.
exactor_id
]
cls
.
group_excavator_dict
[
item
.
group_id
]
.
append
(
item
.
exactor_id
)
else
:
cls
.
excavator_group_dict
[
item
.
exactor_id
]
=
item
.
group_id
if
item
.
exactor_id
not
in
cls
.
group_excavator_dict
[
item
.
group_id
]:
cls
.
group_excavator_dict
[
item
.
group_id
]
.
append
(
item
.
exactor_id
)
cls
.
excavator_group_dict
[
item
.
exactor_id
]
=
item
.
group_id
# add group_unload_areas
# add group_unload_areas
if
item
.
group_id
not
in
cls
.
group_unload_area_dict
.
keys
():
if
item
.
group_id
not
in
cls
.
group_unload_area_dict
.
keys
():
...
@@ -208,21 +210,26 @@ class DispatchInfo:
...
@@ -208,21 +210,26 @@ class DispatchInfo:
cls
.
group_unload_area_dict
[
item
.
group_id
]
.
append
(
item
.
unload_area_id
)
cls
.
group_unload_area_dict
[
item
.
group_id
]
.
append
(
item
.
unload_area_id
)
cls
.
unload_area_group_dict
[
item
.
unload_area_id
]
=
item
.
group_id
cls
.
unload_area_group_dict
[
item
.
unload_area_id
]
=
item
.
group_id
# add group_dumps
# add dump
if
item
.
group_id
not
in
cls
.
group_dump_dict
.
keys
():
dump_state
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
item
.
dump_id
)
.
first
()
cls
.
group_dump_dict
[
item
.
group_id
]
=
[
item
.
dump_id
]
if
dump_state
is
not
None
and
dump_state
.
disabled
==
1
:
else
:
# add group_dumps
if
item
.
dump_id
not
in
cls
.
group_dump_dict
[
item
.
group_id
]:
if
item
.
group_id
not
in
cls
.
group_dump_dict
.
keys
():
cls
.
group_dump_dict
[
item
.
group_id
]
.
append
(
item
.
dump_id
)
cls
.
group_dump_dict
[
item
.
group_id
]
=
[
item
.
dump_id
]
cls
.
dump_group_dict
[
item
.
dump_id
]
=
item
.
group_id
else
:
if
item
.
dump_id
not
in
cls
.
group_dump_dict
[
item
.
group_id
]:
cls
.
group_dump_dict
[
item
.
group_id
]
.
append
(
item
.
dump_id
)
cls
.
dump_group_dict
[
item
.
dump_id
]
=
item
.
group_id
# add truck
# add truck
if
item
.
group_id
not
in
cls
.
group_truck_dict
.
keys
():
truck_state
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
item
.
truck_id
)
.
first
()
cls
.
group_truck_dict
[
item
.
group_id
]
=
[
item
.
truck_id
]
if
truck_state
is
not
None
and
truck_state
.
disabled
==
1
:
else
:
if
item
.
group_id
not
in
cls
.
group_truck_dict
.
keys
():
if
item
.
truck_id
not
in
cls
.
group_truck_dict
[
item
.
group_id
]:
cls
.
group_truck_dict
[
item
.
group_id
]
=
[
item
.
truck_id
]
cls
.
group_truck_dict
[
item
.
group_id
]
.
append
(
item
.
truck_id
)
else
:
cls
.
truck_group_dict
[
item
.
truck_id
]
=
item
.
group_id
if
item
.
truck_id
not
in
cls
.
group_truck_dict
[
item
.
group_id
]:
cls
.
group_truck_dict
[
item
.
group_id
]
.
append
(
item
.
truck_id
)
cls
.
truck_group_dict
[
item
.
truck_id
]
=
item
.
group_id
print
(
"存在的分组"
)
print
(
"存在的分组"
)
print
(
cls
.
group_excavator_dict
.
keys
())
print
(
cls
.
group_excavator_dict
.
keys
())
...
...
realtime_dispatch.py
View file @
8794c315
...
@@ -166,4 +166,4 @@ if __name__ == "__main__":
...
@@ -166,4 +166,4 @@ if __name__ == "__main__":
logger
.
info
(
" "
)
logger
.
info
(
" "
)
logger
.
info
(
"调度系统启动"
)
logger
.
info
(
"调度系统启动"
)
main
(
3
0
,
dispatcher
)
main
(
2
0
,
dispatcher
)
start.sh
View file @
8794c315
#!/bin/bash
#!/bin/bash
ps
-ef
|grep realtime_dispatch.py|grep
-v
grep
|awk
{
'print $2'
}
ps
-ef
|grep realtime_dispatch.py|grep
-v
grep
|awk
{
'print $2'
}
|xargs
kill
-9
kill
-9
ps
python3 topo_update_server.py
python3 topo_update_server.py
nohup
python3 realtime_dispatch.py
--active
>
/dev/null 2>&1 &
nohup
python3 realtime_dispatch.py
--active
>
/dev/null 2>&1 &
nohup
flask run
--host
=
0.0.0.0
>
/dev/null 2>&1 &
nohup
flask run
--host
=
0.0.0.0
>
/dev/null 2>&1 &
\ No newline at end of file
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