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
23d1dc84
Commit
23d1dc84
authored
May 12, 2023
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
代码优化&穿越装载区
parent
77024ac7
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
157 additions
and
524 deletions
+157
-524
algorithm.py
alg/algorithm.py
+16
-12
app.py
app.py
+3
-6
config.json
config.json
+6
-5
dispatcher.py
core/dispatcher.py
+11
-11
group.py
core/group.py
+0
-0
submit.py
core/submit.py
+10
-7
__init__.py
data/__init__.py
+3
-2
dispatchInfo.py
data/dispatchInfo.py
+0
-0
__init__.py
data/equipment/__init__.py
+0
-0
dump.py
data/equipment/dump.py
+0
-0
excavator.py
data/equipment/excavator.py
+0
-0
truck.py
data/equipment/truck.py
+29
-19
para_config.py
data/para_config.py
+14
-186
static_data_process.py
data/static_data_process.py
+20
-6
gothrough_digging.py
gothrough/gothrough_digging.py
+0
-0
topo_graph.py
graph/topo_graph.py
+0
-0
realtime_dispatch.py
realtime_dispatch.py
+3
-3
realtime_dispatch_test.py
realtime_dispatch_test.py
+4
-4
redispatch.py
redispatch/redispatch.py
+0
-239
settings.py
settings.py
+2
-2
tables.py
tables.py
+15
-0
test.db
test.db
+0
-0
area_analysis.py
util/area_analysis.py
+21
-22
No files found.
alg/algorithm.py
View file @
23d1dc84
...
@@ -7,7 +7,7 @@
...
@@ -7,7 +7,7 @@
# @Software: PyCharm
# @Software: PyCharm
from
data.para_config
import
*
from
data.para_config
import
*
from
equipment
import
DumpInfo
from
data.
equipment
import
DumpInfo
from
data.dispatchInfo
import
DispatchInfo
from
data.dispatchInfo
import
DispatchInfo
# from core.group import Group
# from core.group import Group
from
util
import
CoreException
from
util
import
CoreException
...
@@ -181,20 +181,13 @@ class ExpectedTime(AlgorithmBase):
...
@@ -181,20 +181,13 @@ class ExpectedTime(AlgorithmBase):
# self.logger.error(es)
# self.logger.error(es)
try
:
try
:
# 全局挖机可用时间 dict
group_excavator_avl_time_ls
=
self
.
get_excavators_avl_time
()
excavator_val_time_dict
=
self
.
pre_sch
.
get_excavator_avl_time
()
# 局部挖机可用时间 list
# TODO: 获取车辆位置信息
group_excavator_avl_time_ls
=
np
.
full
(
len
(
self
.
group
.
group_excavators
),
0.0
)
truck_locate
=
self
.
group
.
truck_info_list
[
truck_id
]
.
get_area_locate
()
self
.
logger
.
info
(
"self.group.excavator_uuid_index_dict"
)
self
.
logger
.
info
(
self
.
group
.
excavator_uuid_index_dict
)
for
excavator_id
,
excavator_index
in
self
.
group
.
excavator_uuid_index_dict
.
items
():
group_excavator_avl_time_ls
[
excavator_index
]
=
excavator_val_time_dict
[
excavator_id
]
# 车辆驶往各目的地时间
# 车辆驶往各目的地时间
truck_reach_time_ls
=
60
*
self
.
group
.
park_to_excavator_distance
[
0
,
:]
/
1000
/
\
truck_reach_time_ls
=
60
*
self
.
group
.
park_to_excavator_distance
[
truck_locate
,
:]
/
1000
/
\
self
.
truck
.
empty_speed
[
truck_id
]
+
truck_avl_time
self
.
truck
.
empty_speed
[
truck_id
]
+
truck_avl_time
# 计算车辆得到服务时间
# 计算车辆得到服务时间
...
@@ -357,6 +350,17 @@ class ExpectedTime(AlgorithmBase):
...
@@ -357,6 +350,17 @@ class ExpectedTime(AlgorithmBase):
return
transport_value
return
transport_value
def
get_excavators_avl_time
(
self
):
# 全局挖机可用时间 dict
excavator_val_time_dict
=
self
.
pre_sch
.
get_excavator_avl_time
()
# 局部挖机可用时间 list
group_excavator_avl_time_ls
=
np
.
full
(
len
(
self
.
group
.
group_excavators
),
0.0
)
self
.
logger
.
info
(
"self.group.excavator_uuid_index_dict"
)
self
.
logger
.
info
(
self
.
group
.
excavator_uuid_index_dict
)
for
excavator_id
,
excavator_index
in
self
.
group
.
excavator_uuid_index_dict
.
items
():
group_excavator_avl_time_ls
[
excavator_index
]
=
excavator_val_time_dict
[
excavator_id
]
return
group_excavator_avl_time_ls
class
DistributionRatio
(
object
):
class
DistributionRatio
(
object
):
"""
"""
...
...
app.py
View file @
23d1dc84
from
flask
import
Flask
,
request
from
flask
import
Flask
,
request
from
flask.json
import
jsonify
from
flask.json
import
jsonify
from
data.para_config
import
*
from
data.equipment.truck
import
TruckInfo
from
equipment.truck
import
TruckInfo
from
data.equipment.excavator
import
ExcavatorInfo
from
equipment.excavator
import
ExcavatorInfo
from
data.equipment.dump
import
DumpInfo
from
equipment.dump
import
DumpInfo
from
core.dispatcher
import
PreSchedule
from
core.dispatcher
import
PreSchedule
from
core.group
import
Group
from
core.group
import
Group
from
flask_caching
import
Cache
from
flask_caching
import
Cache
from
alg.algorithm
import
ExpectedTime
from
alg.algorithm
import
ExpectedTime
from
data.dispatchInfo
import
DispatchInfo
from
core.submit
import
DispatchSubmission
from
core.submit
import
DispatchSubmission
from
core.group
import
GroupDispatcher
from
core.group
import
GroupDispatcher
from
core.group
import
group_direct2redis
from
core.group
import
group_direct2redis
import
uuid
from
core.util
import
POST
from
core.util
import
POST
from
util.area_analysis
import
*
from
util.area_analysis
import
*
...
...
config.json
View file @
23d1dc84
...
@@ -7,25 +7,25 @@
...
@@ -7,25 +7,25 @@
"excavator_target_mass"
:
5000
"excavator_target_mass"
:
5000
},
},
"mysql"
:
{
"mysql"
:
{
"host"
:
"172.16.0.
51
"
,
"host"
:
"172.16.0.
103
"
,
"port"
:
"3306"
,
"port"
:
"3306"
,
"user"
:
"root"
,
"user"
:
"root"
,
"password"
:
"Huituo@123"
,
"password"
:
"Huituo@123"
,
"database"
:
"ht_zhunneng"
"database"
:
"ht_zhunneng"
},
},
"postgresql"
:
{
"postgresql"
:
{
"host"
:
"172.16.0.
51
"
,
"host"
:
"172.16.0.
103
"
,
"port"
:
"5432"
,
"port"
:
"5432"
,
"user"
:
"postgres"
,
"user"
:
"postgres"
,
"password"
:
"Huituo@123"
,
"password"
:
"Huituo@123"
,
"database"
:
"gis_zhunneng"
"database"
:
"gis_zhunneng"
},
},
"redis"
:
{
"redis"
:
{
"host"
:
"172.16.0.
51
"
,
"host"
:
"172.16.0.
103
"
,
"password"
:
"Huituo@123"
"password"
:
"Huituo@123"
},
},
"gothrough"
:
{
"gothrough"
:
{
"closer_area_name"
:
"哈
1010平盘
"
,
"closer_area_name"
:
"哈
装测试
"
,
"further_area_name"
:
"哈
1026平盘
"
"further_area_name"
:
"哈
装2
"
}
}
}
}
\ No newline at end of file
core/dispatcher.py
View file @
23d1dc84
...
@@ -10,7 +10,7 @@ from data.dispatchInfo import DispatchInfo
...
@@ -10,7 +10,7 @@ from data.dispatchInfo import DispatchInfo
from
core.group
import
Group
from
core.group
import
Group
from
alg.algorithm
import
ExpectedTime
from
alg.algorithm
import
ExpectedTime
from
settings
import
get_logger
from
settings
import
get_logger
from
equipment
import
TruckInfo
,
ExcavatorInfo
,
DumpInfo
from
data.
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
...
@@ -80,21 +80,21 @@ class Dispatcher:
...
@@ -80,21 +80,21 @@ class Dispatcher:
"""
"""
for
group
in
self
.
group_list
.
values
():
for
group
in
self
.
group_list
.
values
():
#
try:
try
:
# truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
# truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
group_dispatcher
=
GroupDispatcher
(
group
)
group_dispatcher
=
GroupDispatcher
(
group
)
truck_dispatch_plan_dict
=
group_dispatcher
.
group_dispatch
(
ExpectedTime
)
truck_dispatch_plan_dict
=
group_dispatcher
.
group_dispatch
(
ExpectedTime
)
if
truck_dispatch_plan_dict
is
None
:
if
truck_dispatch_plan_dict
is
None
:
self
.
logger
.
error
(
f
'分组 {group.group_id} 调度异常'
)
self
.
logger
.
error
(
f
'分组 {group.group_id} 调度异常'
)
continue
continue
#
except Exception as es:
except
Exception
as
es
:
#
self.logger.error(es)
self
.
logger
.
error
(
es
)
#
self.logger.error(f'分组{group.group_id} 调度异常')
self
.
logger
.
error
(
f
'分组{group.group_id} 调度异常'
)
# 派车计划输出
# 派车计划输出
self
.
submission
.
group_dispatch_to_redis
(
group
,
truck_dispatch_plan_dict
)
self
.
submission
.
group_dispatch_to_redis
(
group
,
truck_dispatch_plan_dict
)
...
...
core/group.py
View file @
23d1dc84
This diff is collapsed.
Click to expand it.
core/submit.py
View file @
23d1dc84
...
@@ -13,7 +13,7 @@ from core.group import CurrentTruck, Group
...
@@ -13,7 +13,7 @@ from core.group import CurrentTruck, Group
from
core.util
import
POST
from
core.util
import
POST
from
data.dispatchInfo
import
DispatchInfo
from
data.dispatchInfo
import
DispatchInfo
from
data.para_config
import
get_value
from
data.para_config
import
get_value
from
equipment
import
DumpInfo
,
ExcavatorInfo
,
TruckInfo
from
data.
equipment
import
DumpInfo
,
ExcavatorInfo
,
TruckInfo
from
graph.topo_graph
import
Topo
from
graph.topo_graph
import
Topo
from
settings
import
get_logger
,
redis5
from
settings
import
get_logger
,
redis5
from
tables
import
session_mysql
,
DispatchSetting
from
tables
import
session_mysql
,
DispatchSetting
...
@@ -74,14 +74,14 @@ class DispatchSubmission:
...
@@ -74,14 +74,14 @@ class DispatchSubmission:
else
:
else
:
self
.
logger
.
info
(
"动态调度模式"
)
self
.
logger
.
info
(
"动态调度模式"
)
self
.
dynamic_dispatch_mode
(
dispatch_seq
,
group_id
,
record
,
truck_info
.
get_sate
(),
self
.
dynamic_dispatch_mode
(
dispatch_seq
,
group_id
,
record
,
truck_info
.
get_sate
(),
truck_info
.
get_task
(),
truck_id
)
truck_info
.
get_task
(),
truck_id
,
truck_info
.
get_has_changed
()
)
# except Exception as es:
# except Exception as es:
# self.logger.error("调度结果写入异常")
# self.logger.error("调度结果写入异常")
# self.logger.error(f"调度结果:{dispatch_seq}")
# self.logger.error(f"调度结果:{dispatch_seq}")
# self.logger.error(es)
# self.logger.error(es)
def
dynamic_dispatch_mode
(
self
,
dispatch_seq
,
group_id
,
record
,
state
,
task
,
truck_id
):
def
dynamic_dispatch_mode
(
self
,
dispatch_seq
,
group_id
,
record
,
state
,
task
,
truck_id
,
has_changed
):
"""
"""
write dispatch plan in dynamic dispatch mode.
write dispatch plan in dynamic dispatch mode.
:param dispatch_seq:
:param dispatch_seq:
...
@@ -126,8 +126,10 @@ class DispatchSubmission:
...
@@ -126,8 +126,10 @@ class DispatchSubmission:
if
self
.
topo
is
not
None
:
if
self
.
topo
is
not
None
:
# 车辆重载等待,且前方道路阻塞
# 车辆重载等待,且前方道路阻塞
if
task
==
3
and
state
==
2
and
truck_id
in
self
.
truck
.
get_truck_locate_dict
()
and
\
# if task == 3 and state == 2 and truck_id in self.truck.get_truck_lane_locate_dict() and \
self
.
truck
.
get_truck_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
# self.truck.get_truck_lane_locate_dict()[truck_id] in self.topo.cross_bf_lanes:
if
has_changed
and
(
truck_id
in
self
.
truck
.
truck_is_temp
and
not
self
.
truck
.
truck_is_temp
[
truck_id
]):
# try:
# try:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
self
.
logger
.
info
(
"二次调度前往卸载区"
)
self
.
logger
.
info
(
"二次调度前往卸载区"
)
...
@@ -184,8 +186,9 @@ class DispatchSubmission:
...
@@ -184,8 +186,9 @@ class DispatchSubmission:
if
self
.
topo
is
not
None
:
if
self
.
topo
is
not
None
:
# 车辆重载等待,且前方道路阻塞
# 车辆重载等待,且前方道路阻塞
if
task
==
0
and
state
==
2
and
truck_id
in
self
.
truck
.
get_truck_locate_dict
()
and
\
# if task == 0 and state == 2 and truck_id in self.truck.get_truck_lane_locate_dict() and \
self
.
truck
.
get_truck_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
# self.truck.get_truck_lane_locate_dict()[truck_id] in self.topo.cross_bf_lanes:
if
has_changed
and
(
truck_id
in
self
.
truck
.
truck_is_temp
and
not
self
.
truck
.
truck_is_temp
[
truck_id
]):
# 车辆停车等待
# 车辆停车等待
# try:
# try:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
...
...
gothrough
/__init__.py
→
data
/__init__.py
View file @
23d1dc84
#!E:\Pycharm Projects\Waytous
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# @Time : 202
2/8/29 15:51
# @Time : 202
3/4/19 19:19
# @Author : Opfer
# @Author : Opfer
# @Site :
# @Site :
# @File : __init__.py
# @File : __init__.py
.py
# @Software: PyCharm
# @Software: PyCharm
\ No newline at end of file
data/dispatchInfo.py
View file @
23d1dc84
This diff is collapsed.
Click to expand it.
equipment/__init__.py
→
data/
equipment/__init__.py
View file @
23d1dc84
File moved
equipment/dump.py
→
data/
equipment/dump.py
View file @
23d1dc84
File moved
equipment/excavator.py
→
data/
equipment/excavator.py
View file @
23d1dc84
File moved
equipment/truck.py
→
data/
equipment/truck.py
View file @
23d1dc84
...
@@ -85,10 +85,12 @@ class TruckInfo(WalkManage):
...
@@ -85,10 +85,12 @@ class TruckInfo(WalkManage):
# 对象域
# 对象域
self
.
_dump
=
dump
self
.
_dump
=
dump
self
.
_excavator
=
excavator
self
.
_excavator
=
excavator
# 车辆位置信息
# 车辆
车道
位置信息
self
.
truck_locate_dict
=
{}
self
.
truck_l
ane_l
ocate_dict
=
{}
# 车辆临时调度
# 车辆临时调度
self
.
truck_is_temp
=
{}
self
.
truck_is_temp
=
{}
# 车辆区域位置信息
self
.
truck_area_locate_dict
=
{}
def
get_truck_current_trip
(
self
):
def
get_truck_current_trip
(
self
):
return
self
.
truck_current_trip
return
self
.
truck_current_trip
...
@@ -132,8 +134,11 @@ class TruckInfo(WalkManage):
...
@@ -132,8 +134,11 @@ class TruckInfo(WalkManage):
def
get_excavator_hold_truck_num
(
self
):
def
get_excavator_hold_truck_num
(
self
):
return
self
.
excavator_hold_truck_num
return
self
.
excavator_hold_truck_num
def
get_truck_locate_dict
(
self
):
def
get_truck_lane_locate_dict
(
self
):
return
self
.
truck_locate_dict
return
self
.
truck_lane_locate_dict
def
get_truck_area_locate_dict
(
self
):
return
self
.
truck_area_locate_dict
################################################ short term update ################################################
################################################ short term update ################################################
...
@@ -219,18 +224,20 @@ class TruckInfo(WalkManage):
...
@@ -219,18 +224,20 @@ class TruckInfo(WalkManage):
key_value_dict
=
redis5
.
get
(
truck_name_to_uuid_dict
[
item
])
# reids str可以自动转为bytes
key_value_dict
=
redis5
.
get
(
truck_name_to_uuid_dict
[
item
])
# reids str可以自动转为bytes
if
key_value_dict
is
None
:
if
key_value_dict
is
None
:
raise
CoreException
(
108
,
f
'车辆{item}不存在于redis5'
)
# raise CoreException(108, f'车辆{item}不存在于redis5')
self
.
logger
.
warning
(
f
'车辆{item}不存在于redis5'
)
key_value_dict
=
json
.
loads
(
byte_to_str
(
key_value_dict
))
isTemp
=
True
else
:
key_value_dict
=
json
.
loads
(
byte_to_str
(
key_value_dict
))
if
truck_name_to_uuid_dict
[
item
]
in
self
.
dynamic_truck_set
:
if
"isTemp"
in
key_value_dict
:
try
:
isTemp
=
key_value_dict
[
"isTemp"
]
isTemp
=
key_value_dict
[
"isTemp"
]
self
.
truck_is_temp
[
truck_name_to_uuid_dict
[
item
]]
=
bool
(
isTemp
)
else
:
except
Exception
as
es
:
isTemp
=
True
self
.
logger
.
error
(
item
)
if
truck_name_to_uuid_dict
[
item
]
in
self
.
dynamic_truck_set
:
self
.
logger
.
error
(
es
)
self
.
truck_is_temp
[
truck_name_to_uuid_dict
[
item
]]
=
bool
(
isTemp
)
self
.
truck_is_temp
[
truck_name_to_uuid_dict
[
item
]]
=
True
else
:
continue
# print(f'here3 {item} {bool(isTemp)}')
# print(f'here3 {item} {bool(isTemp)}')
except
Exception
as
es
:
except
Exception
as
es
:
...
@@ -525,15 +532,15 @@ class TruckInfo(WalkManage):
...
@@ -525,15 +532,15 @@ class TruckInfo(WalkManage):
print
(
"self.excavator_hold_truck_num"
)
print
(
"self.excavator_hold_truck_num"
)
print
(
self
.
excavator_hold_truck_num
)
print
(
self
.
excavator_hold_truck_num
)
def
update_trucks_locate
(
self
):
def
update_trucks_l
ane_l
ocate
(
self
):
"""
"""
get trucks locates.
get trucks locates.
:return: truck_locate_dict
:return: truck_l
ane_l
ocate_dict
"""
"""
truck_uuid_to_name_dict
=
get_value
(
"truck_uuid_to_name_dict"
)
truck_uuid_to_name_dict
=
get_value
(
"truck_uuid_to_name_dict"
)
self
.
truck_locate_dict
=
{}
self
.
truck_l
ane_l
ocate_dict
=
{}
for
truck_id
in
self
.
dynamic_truck_set
:
for
truck_id
in
self
.
dynamic_truck_set
:
try
:
try
:
# item = item.decode(encoding='utf-8')
# item = item.decode(encoding='utf-8')
...
@@ -548,7 +555,7 @@ class TruckInfo(WalkManage):
...
@@ -548,7 +555,7 @@ class TruckInfo(WalkManage):
and
(
str_to_byte
(
'laneId'
)
in
key_set
):
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'
)]
if
eval
(
truck_locate
)
is
not
''
:
if
eval
(
truck_locate
)
is
not
''
:
self
.
truck_locate_dict
[
truck_id
]
=
eval
(
truck_locate
)
self
.
truck_l
ane_l
ocate_dict
[
truck_id
]
=
eval
(
truck_locate
)
except
Exception
as
es
:
except
Exception
as
es
:
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
f
'车辆 {truck_id} 位置信息丢失'
)
self
.
logger
.
error
(
f
'车辆 {truck_id} 位置信息丢失'
)
...
@@ -638,6 +645,9 @@ class TruckInfo(WalkManage):
...
@@ -638,6 +645,9 @@ class TruckInfo(WalkManage):
item
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
)
.
first
()
item
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
)
.
first
()
if
item
.
bind_list
is
not
None
:
if
item
.
bind_list
is
not
None
:
for
truck_name
in
json
.
loads
(
item
.
bind_list
):
for
truck_name
in
json
.
loads
(
item
.
bind_list
):
if
truck_name
not
in
truck_name_to_uuid_dict
:
self
.
logger
.
error
(
f
'truck_name_to_uuid_dict 不存在 {truck_name}'
)
continue
self
.
truck_excavator_bind
[
self
.
truck_excavator_bind
[
truck_name_to_uuid_dict
[
truck_name
]
truck_name_to_uuid_dict
[
truck_name
]
]
=
excavator_id
]
=
excavator_id
...
@@ -953,4 +963,4 @@ class TruckInfo(WalkManage):
...
@@ -953,4 +963,4 @@ class TruckInfo(WalkManage):
self
.
update_truck_speed
()
self
.
update_truck_speed
()
# 矿卡位置更新
# 矿卡位置更新
self
.
update_trucks_locate
()
self
.
update_trucks_l
ane_l
ocate
()
data/para_config.py
View file @
23d1dc84
...
@@ -11,7 +11,9 @@ from settings import *
...
@@ -11,7 +11,9 @@ from settings import *
from
tables
import
*
from
tables
import
*
import
numpy
as
np
import
numpy
as
np
# 全局参数设定
'''
全局参数设定
'''
# 空载任务集合
# 空载任务集合
empty_task_set
=
[
0
,
1
,
5
]
empty_task_set
=
[
0
,
1
,
5
]
...
@@ -27,69 +29,17 @@ M = 100000000
...
@@ -27,69 +29,17 @@ M = 100000000
logger
=
get_logger
(
"zxt.para"
)
logger
=
get_logger
(
"zxt.para"
)
# # 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# # (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()
#
# excavator_uuid_to_name_dict, dump_uuid_to_name_dict = build_equipment_uuid_name_map()
#
# # 矿卡集合
# group_trucks = set(update_total_truck())
#
# # 固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 动态派车矿卡集合
# # dynamic_truck_set = group_trucks.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
=
{}
# 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
):
def
get_value
(
name
):
return
global_dict
[
name
]
return
global_dict
[
name
]
# 设备映射类, 存储除工作区以外的映射关系
# 其余设备类继承该类
class
DeviceMap
:
class
DeviceMap
:
"""
设备映射类, 存储除工作区以外的映射关系, 其余设备类继承该类
"""
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
=
{}
...
@@ -103,50 +53,6 @@ class DeviceMap:
...
@@ -103,50 +53,6 @@ class DeviceMap:
truck_uuid_to_index_dict
=
{}
truck_uuid_to_index_dict
=
{}
truck_index_to_uuid_dict
=
{}
truck_index_to_uuid_dict
=
{}
# def __init__(cls):
# cls.excavator_uuid_to_index_dict = {}
# cls.dump_uuid_to_index_dict = {}
# cls.excavator_index_to_uuid_dict = {}
# cls.dump_index_to_uuid_dict = {}
#
# cls.dump_uuid_to_unload_area_uuid_dict = {}
# cls.excavator_uuid_to_load_area_uuid_dict = {}
# cls.excavator_index_to_load_area_index_dict = {}
# cls.dump_index_to_unload_area_index_dict = {}
#
# cls.truck_uuid_to_index_dict = {}
# cls.truck_index_to_uuid_dict = {}
# def get_excavator_uuid_to_index_dict(cls):
# return cls.excavator_uuid_to_index_dict
#
# def get_dump_uuid_to_index_dict(cls):
# return cls.dump_uuid_to_index_dict
#
# def get_excavator_index_to_uuid_dict(cls):
# return cls.excavator_index_to_uuid_dict
#
# def get_dump_index_to_uuid_dict(cls):
# return cls.dump_index_to_uuid_dict
#
# def get_dump_uuid_to_unload_area_uuid_dict(cls):
# return cls.dump_uuid_to_unload_area_uuid_dict
#
# def get_excavator_uuid_to_load_area_uuid_dict(cls):
# return cls.excavator_uuid_to_load_area_uuid_dict
#
# def get_excavator_index_to_load_area_index_dict(cls):
# return cls.excavator_index_to_load_area_index_dict
#
# def get_dump_index_to_unload_area_index_dict(cls):
# return cls.dump_index_to_unload_area_index_dict
#
# def get_truck_uuid_to_index_dict(cls):
# return cls.truck_uuid_to_index_dict
#
# def get_truck_index_to_uuid_dict(cls):
# return cls.truck_index_to_uuid_dict
@classmethod
@classmethod
def
reset
(
cls
):
def
reset
(
cls
):
cls
.
excavator_uuid_to_index_dict
=
{}
cls
.
excavator_uuid_to_index_dict
=
{}
...
@@ -193,58 +99,19 @@ class DeviceMap:
...
@@ -193,58 +99,19 @@ class DeviceMap:
"dump_index_to_unload_area_index_dict"
"dump_index_to_unload_area_index_dict"
]
]
truck_map_dict
=
update
_truck_uuid_index_map
(
get_value
(
"dynamic_truck_set"
))
truck_map_dict
=
build
_truck_uuid_index_map
(
get_value
(
"dynamic_truck_set"
))
cls
.
truck_uuid_to_index_dict
=
truck_map_dict
[
"truck_uuid_to_index_dict"
]
cls
.
truck_uuid_to_index_dict
=
truck_map_dict
[
"truck_uuid_to_index_dict"
]
cls
.
truck_index_to_uuid_dict
=
truck_map_dict
[
"truck_index_to_uuid_dict"
]
cls
.
truck_index_to_uuid_dict
=
truck_map_dict
[
"truck_index_to_uuid_dict"
]
# def period_map_para_load(cls):
# # 装载关系映射
# cls.excavator_uuid_to_index_dict = device_map.excavator_uuid_to_index_dict
# cls.dump_uuid_to_index_dict = device_map.dump_uuid_to_index_dict
# cls.excavator_index_to_uuid_dict = device_map.excavator_index_to_uuid_dict
# cls.dump_index_to_uuid_dict = device_map.dump_index_to_uuid_dict
#
# cls.dump_uuid_to_unload_area_uuid_dict = (
# device_map.dump_uuid_to_unload_area_uuid_dict
# )
# cls.excavator_uuid_to_load_area_uuid_dict = (
# device_map.excavator_uuid_to_load_area_uuid_dict
# )
# cls.excavator_index_to_load_area_index_dict = (
# device_map.excavator_index_to_load_area_index_dict
# )
# cls.dump_index_to_unload_area_index_dict = (
# device_map.dump_index_to_unload_area_index_dict
# )
#
# cls.truck_uuid_to_index_dict = device_map.truck_uuid_to_index_dict
# cls.truck_index_to_uuid_dict = device_map.truck_index_to_uuid_dict
#
路网信息类
#
class
WalkManage
(
DeviceMap
):
class
WalkManage
(
DeviceMap
):
# def __init__(cls):
"""
# # # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
路网信息类
#
"""
# # 路网真实距离
# 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
# cls.walk_time_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
# cls.walk_time_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
# cls.walk_time_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# cls.walk_time_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
#
# # 路网行驶时间
# cls.distance_to_excavator = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_to_dump = np.full((dynamic_dump_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_park_to_excavator = np.full((park_num, dynamic_excavator_num), M, dtype=float)
# cls.distance_park_to_load_area = np.full((park_num, load_area_num), M, dtype=float)
# cls.distance_to_load_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# cls.distance_to_unload_area = np.full((unload_area_num, load_area_num), M, dtype=float)
# # 工作区和设备不具备一一对应关系, 为方便就计算, 算法维护两套路网: 面向路网和面向设备
# 路网真实距离
# 路网真实距离
walk_time_to_excavator
=
None
walk_time_to_excavator
=
None
...
@@ -262,49 +129,9 @@ class WalkManage(DeviceMap):
...
@@ -262,49 +129,9 @@ class WalkManage(DeviceMap):
distance_to_load_area
=
None
distance_to_load_area
=
None
distance_to_unload_area
=
None
distance_to_unload_area
=
None
# def get_walk_time_to_load_area(cls):
# return cls.walk_time_to_load_area
#
# def get_walk_time_to_unload_area(cls):
# return cls.walk_time_to_unload_area
#
# def get_walk_time_to_excavator(cls):
# return cls.walk_time_to_excavator
#
# def get_walk_time_to_dump(cls):
# return cls.walk_time_to_dump
#
# def get_walk_time_park_to_load_area(cls):
# return cls.walk_time_park_to_load_area
#
# def get_walk_time_park_to_excavator(cls):
# return cls.walk_time_park_to_excavator
#
# def get_distance_to_load_area(cls):
# return cls.distance_to_load_area
#
# def get_distance_to_unload_area(cls):
# return cls.distance_to_unload_area
#
# def get_distance_to_excavator(cls):
# return cls.distance_to_excavator
#
# def get_distance_to_dump(cls):
# return cls.distance_to_dump
#
# def get_distance_park_to_load_area(cls):
# return cls.distance_park_to_load_area
#
# def get_distance_park_to_excavator(cls):
# return cls.distance_park_to_excavator
@classmethod
@classmethod
def
reset
(
cls
):
def
reset
(
cls
):
# dynamic_excavator_num
# dynamic_dump_num
# park_num
# 路网真实距离
# 路网真实距离
cls
.
walk_time_to_excavator
=
np
.
full
(
cls
.
walk_time_to_excavator
=
np
.
full
(
(
dynamic_dump_num
,
dynamic_excavator_num
),
M
(
dynamic_dump_num
,
dynamic_excavator_num
),
M
...
@@ -450,7 +277,8 @@ def global_period_para_update():
...
@@ -450,7 +277,8 @@ def global_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
()
excavator_uuid_to_name_dict
=
build_excavator_uuid_name_map
()
dump_uuid_to_name_dict
=
build_dump_uuid_name_map
()
global_dict
=
{
"park_num"
:
park_num
,
"load_area_num"
:
load_area_num
,
"unload_area_num"
:
unload_area_num
,
global_dict
=
{
"park_num"
:
park_num
,
"load_area_num"
:
load_area_num
,
"unload_area_num"
:
unload_area_num
,
"truck_uuid_to_name_dict"
:
truck_uuid_to_name_dict
,
"truck_uuid_to_name_dict"
:
truck_uuid_to_name_dict
,
...
...
data/static_data_process.py
View file @
23d1dc84
...
@@ -14,6 +14,11 @@ from tables import *
...
@@ -14,6 +14,11 @@ from tables import *
logger
=
get_logger
(
"zxt.static_data_process"
)
logger
=
get_logger
(
"zxt.static_data_process"
)
'''
area uuid index map building
'''
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
# unload_area_id <-> unload_area_index
# unload_area_id <-> unload_area_index
...
@@ -71,7 +76,7 @@ def build_park_uuid_index_map():
...
@@ -71,7 +76,7 @@ def build_park_uuid_index_map():
if
park_num
<
1
:
if
park_num
<
1
:
raise
Exception
(
"无备停区路网信息"
)
raise
Exception
(
"无备停区路网信息"
)
except
Exception
as
es
:
except
Exception
as
es
:
logger
.
info
(
"备停区路网读取"
)
logger
.
error
(
"备停区路网读取"
)
logger
.
error
(
es
)
logger
.
error
(
es
)
session_postgre
.
rollback
()
session_postgre
.
rollback
()
session_mysql
.
rollback
()
session_mysql
.
rollback
()
...
@@ -79,6 +84,11 @@ def build_park_uuid_index_map():
...
@@ -79,6 +84,11 @@ def build_park_uuid_index_map():
return
park_uuid_to_index_dict
,
park_index_to_uuid_dict
return
park_uuid_to_index_dict
,
park_index_to_uuid_dict
'''
equipment uuid name map building
'''
def
build_truck_uuid_name_map
():
def
build_truck_uuid_name_map
():
# truck_id <-> truck_name
# truck_id <-> truck_name
truck_uuid_to_name_dict
=
{}
truck_uuid_to_name_dict
=
{}
...
@@ -100,11 +110,9 @@ def build_truck_uuid_name_map():
...
@@ -100,11 +110,9 @@ 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_e
quipment
_uuid_name_map
():
def
build_e
xcavator
_uuid_name_map
():
# excavator_id <-> excavator_name
# excavator_id <-> excavator_name
# dump_id <-> dump_name
excavator_uuid_to_name_dict
=
{}
excavator_uuid_to_name_dict
=
{}
dump_uuid_to_name_dict
=
{}
try
:
try
:
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
2
)
.
all
():
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
2
)
.
all
():
...
@@ -118,8 +126,13 @@ def build_equipment_uuid_name_map():
...
@@ -118,8 +126,13 @@ def build_equipment_uuid_name_map():
logger
.
warning
(
es
)
logger
.
warning
(
es
)
session_postgre
.
rollback
()
session_postgre
.
rollback
()
session_mysql
.
rollback
()
session_mysql
.
rollback
()
return
excavator_uuid_to_name_dict
def
build_dump_uuid_name_map
():
# dump_id <-> dump_name
dump_uuid_to_name_dict
=
{}
try
:
try
:
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
3
)
.
all
():
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
3
)
.
all
():
truck_id
=
item
.
id
truck_id
=
item
.
id
...
@@ -132,7 +145,7 @@ def build_equipment_uuid_name_map():
...
@@ -132,7 +145,7 @@ def build_equipment_uuid_name_map():
logger
.
warning
(
es
)
logger
.
warning
(
es
)
session_postgre
.
rollback
()
session_postgre
.
rollback
()
session_mysql
.
rollback
()
session_mysql
.
rollback
()
return
excavator_uuid_to_name_dict
,
dump_uuid_to_name_dict
return
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
):
...
@@ -210,7 +223,7 @@ def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_
...
@@ -210,7 +223,7 @@ def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_
}
}
def
update
_truck_uuid_index_map
(
dynamic_truck_set
):
def
build
_truck_uuid_index_map
(
dynamic_truck_set
):
truck_uuid_to_index_dict
=
{}
truck_uuid_to_index_dict
=
{}
truck_index_to_uuid_dict
=
{}
truck_index_to_uuid_dict
=
{}
...
@@ -229,6 +242,7 @@ def update_truck_uuid_index_map(dynamic_truck_set):
...
@@ -229,6 +242,7 @@ def update_truck_uuid_index_map(dynamic_truck_set):
"truck_index_to_uuid_dict"
:
truck_index_to_uuid_dict
,
"truck_index_to_uuid_dict"
:
truck_index_to_uuid_dict
,
}
}
def
update_total_truck
():
def
update_total_truck
():
# 矿卡集合
# 矿卡集合
truck_list
=
[]
truck_list
=
[]
...
...
gothrough/gothrough_digging.py
deleted
100644 → 0
View file @
77024ac7
This diff is collapsed.
Click to expand it.
graph/topo_graph.py
View file @
23d1dc84
This diff is collapsed.
Click to expand it.
realtime_dispatch.py
View file @
23d1dc84
...
@@ -9,9 +9,9 @@
...
@@ -9,9 +9,9 @@
# 实时调度模块
# 实时调度模块
from
data.para_config
import
*
from
data.para_config
import
*
from
equipment.truck
import
TruckInfo
from
data.equipment
import
TruckInfo
from
equipment.excavator
import
ExcavatorInfo
from
data.equipment
import
ExcavatorInfo
from
equipment.dump
import
DumpInfo
from
data.equipment
import
DumpInfo
import
sched
import
sched
import
time
import
time
from
core.dispatcher
import
Dispatcher
from
core.dispatcher
import
Dispatcher
...
...
realtime_dispatch_test.py
View file @
23d1dc84
...
@@ -9,9 +9,9 @@
...
@@ -9,9 +9,9 @@
# 实时调度模块
# 实时调度模块
from
data.para_config
import
*
from
data.para_config
import
*
from
equipment.truck
import
TruckInfo
from
data.equipment
import
TruckInfo
from
equipment.excavator
import
ExcavatorInfo
from
data.equipment
import
ExcavatorInfo
from
equipment.dump
import
DumpInfo
from
data.equipment
import
DumpInfo
import
sched
import
sched
import
time
import
time
from
core.dispatcher
import
Dispatcher
from
core.dispatcher
import
Dispatcher
...
@@ -188,4 +188,4 @@ if __name__ == "__main__":
...
@@ -188,4 +188,4 @@ if __name__ == "__main__":
logger
.
info
(
" "
)
logger
.
info
(
" "
)
logger
.
info
(
"调度系统启动"
)
logger
.
info
(
"调度系统启动"
)
main
(
2
0
,
dispatcher
)
main
(
3
0
,
dispatcher
)
redispatch/redispatch.py
deleted
100644 → 0
View file @
77024ac7
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2022/8/3 17:53
# @Author : Opfer
# @Site :
# @File : redispatch.py
# @Software: PyCharm
from
flask
import
Flask
,
request
from
flask.json
import
jsonify
from
data.para_config
import
*
from
equipment.truck
import
TruckInfo
from
equipment.excavator
import
ExcavatorInfo
from
equipment.dump
import
DumpInfo
from
core.dispatcher
import
PreSchedule
from
core.group
import
Group
from
flask_caching
import
Cache
from
alg.algorithm
import
ExpectedTime
from
data.dispatchInfo
import
DispatchInfo
from
core.submit
import
DispatchSubmission
from
graph.graph_load
import
graph_construct
config
=
{
"DEBUG"
:
True
,
# some Flask specific configs
"CACHE_TYPE"
:
"SimpleCache"
,
# Flask-Caching related configs
"CACHE_DEFAULT_TIMEOUT"
:
300
}
app
=
Flask
(
__name__
)
app
.
config
.
from_mapping
(
config
)
cache
=
Cache
(
app
)
def
update_truck_loacate
(
truck_id
):
# 读取矿卡所在路段信息
try
:
truck_locate_dict
=
{}
device_name_set
=
redis2
.
keys
()
for
item
in
device_name_set
:
item
=
item
.
decode
(
encoding
=
'utf-8'
)
# json_value = json.loads(redis2.get(item))
key_value_dict
=
redis2
.
hgetall
(
item
)
device_type
=
key_value_dict
[
str_to_byte
(
'type'
)]
is_online
=
key_value_dict
[
str_to_byte
(
'online'
)]
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
)
in
[
"true"
or
"True"
])
\
and
(
str_to_byte
(
'laneId'
)
in
key_set
):
truck_locate
=
key_value_dict
[
str_to_byte
(
'laneId'
)]
truck_locate_dict
[
get_value
(
"truck_name_to_uuid_dict"
)[
item
]]
=
eval
(
truck_locate
)
except
Exception
as
es
:
logger
.
error
(
" "
)
return
truck_locate_dict
[
truck_id
]
@app.route
(
"/redispatch"
,
methods
=
[
"POST"
])
def
dispatch_request
():
# 获取报文数据
data_json
=
request
.
get_json
()
# 车辆id
truck_id
=
data_json
.
get
(
"truck_id"
)
# 调度开始时间
rtd_start_time
=
datetime
.
now
()
# 初始化日志
set_log
()
# 获取日志器
logger
=
get_logger
(
"zxt.truck-request"
)
# 更新周期参数
logger
.
info
(
"#####################################请求调度更新开始#####################################"
)
try
:
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
flush
()
# 清空数据库缓存
session_postgre
.
commit
()
session_postgre
.
flush
()
except
Exception
as
es
:
logger
.
error
(
"数据库访问异常"
)
logger
.
error
(
es
)
return
jsonify
(
msg
=
"未知异常, 请联系管理员"
,
code
=
501
)
try
:
# 全局参数更新
global_period_para_update
()
# get_global_para_from_cache(cache)
except
Exception
as
es
:
logger
.
error
(
"全局参数更新异常"
)
logger
.
error
(
es
)
session_mysql
.
rollback
()
session_postgre
.
rollback
()
return
jsonify
(
msg
=
"未知异常, 请联系管理员"
,
code
=
502
)
try
:
# 更新调度信息
DispatchInfo
.
reset
()
DispatchInfo
.
update_device_group_structure
()
if
group_id
not
in
DispatchInfo
.
truck_group_dict
:
raise
Exception
(
"请求调度车辆不存在"
)
DispatchInfo
.
update_route_distance
()
DispatchInfo
.
update_group_mode
()
DispatchInfo
.
update_group_name
()
except
Exception
as
es
:
logger
.
error
(
"调度信息更新异常"
)
logger
.
error
(
es
)
session_mysql
.
rollback
()
session_postgre
.
rollback
()
return
jsonify
(
msg
=
"未知异常, 请联系管理员"
,
code
=
503
)
logger
.
info
(
"Dispatchinfo,更新后信息"
)
logger
.
info
(
"group_set"
)
logger
.
info
(
DispatchInfo
.
group_set
)
logger
.
info
(
"group_excavator_dict"
)
logger
.
info
(
DispatchInfo
.
group_excavator_dict
)
logger
.
info
(
"group_unload_area_dict"
)
logger
.
info
(
DispatchInfo
.
group_unload_area_dict
)
logger
.
info
(
"group_truck_dict"
)
logger
.
info
(
DispatchInfo
.
group_truck_dict
)
logger
.
info
(
"group_mode"
)
logger
.
info
(
DispatchInfo
.
group_mode
)
logger
.
info
(
"load_distance"
)
logger
.
info
(
DispatchInfo
.
load_distance
)
logger
.
info
(
"unload_distance"
)
logger
.
info
(
DispatchInfo
.
unload_distance
)
try
:
# 实例化设备对象
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
truck
=
TruckInfo
(
dump
,
excavator
)
group_id
=
DispatchInfo
.
truck_group_dict
[
truck_id
]
# 设备信息更新
dump
.
dump_para_period_update
()
excavator
.
excavator_para_period_update
()
truck
.
truck_para_period_update
(
dump
,
excavator
)
truck
.
state_period_update
()
# 实例化调度预测器
pre_sch
=
PreSchedule
(
truck
,
excavator
,
dump
)
# 实例化输出器
submission
=
DispatchSubmission
(
dump
,
excavator
,
truck
)
# 实例化调度分组
group
=
Group
(
group_id
,
truck
,
pre_sch
)
# 更新调度分组信息
group
.
info_update
()
truck_trip
=
truck
.
get_truck_current_trip
()[
truck
.
truck_uuid_to_index_dict
[
truck_id
]]
truck_task
=
truck
.
get_truck_current_task
()[
truck_id
]
truck_lane
=
update_truck_loacate
(
truck_id
)
excavators
=
DispatchInfo
.
group_excavator_dict
[
group_id
]
dumps
=
DispatchInfo
.
dump_group_dict
[
group_id
]
topo
=
graph_construct
()
next_target
=
None
if
truck_task
in
[
-
2
,
0
]:
excavator_distance_dict
=
topo
.
get_load_target_node_real
(
truck_lane
,
None
)
MAX_DIS
=
100000000
for
excavator_id
in
excavators
:
if
excavator_distance_dict
[
excavator_id
]
<
MAX_DIS
:
next_target
=
excavator_id
MAX_DIS
=
excavator_distance_dict
[
excavator_id
]
elif
truck_task
==
3
:
dump_distance_dict
=
topo
.
get_unload_target_node_real
(
truck_lane
,
None
)
MAX_DIS
=
100000000
for
dump_id
in
dumps
:
if
dump_distance_dict
[
dump_id
]
<
MAX_DIS
:
next_target
=
dump_id
MAX_DIS
=
dump_distance_dict
[
dump_id
]
except
Exception
as
es
:
logger
.
error
(
"对象实例化异常"
)
logger
.
error
(
es
)
session_mysql
.
rollback
()
session_postgre
.
rollback
()
return
jsonify
(
msg
=
"未知异常, 请联系管理员"
,
code
=
504
)
try
:
# 调度分组派车计划计算
try
:
truck_dispatch_plan_dict
=
group
.
group_dispatch
(
ExpectedTime
)
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
f
'分组{group.group_id} 调度计算异常'
)
try
:
logger
.
info
(
f
'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}'
)
submission
.
group_dispatch_to_redis
(
group
,
truck_dispatch_plan_dict
)
except
Exception
as
es
:
logger
.
error
(
es
)
logger
.
error
(
f
'分组{group.group_id} 调度写入异常'
)
except
Exception
as
es
:
logger
.
error
(
"最外层异常捕获"
)
logger
.
error
(
es
)
return
jsonify
(
msg
=
"未知异常, 请联系管理员"
,
code
=
505
)
session_mysql
.
close
()
session_postgre
.
close
()
logger
.
info
(
"#####################################请求调度更新结束#####################################"
)
# 调度结束时间
rtd_end_time
=
datetime
.
now
()
print
(
f
'调度时耗 {rtd_end_time - rtd_start_time}'
)
return
jsonify
(
msg
=
"success"
,
code
=
0
)
\ No newline at end of file
settings.py
View file @
23d1dc84
...
@@ -69,8 +69,8 @@ def set_log():
...
@@ -69,8 +69,8 @@ def set_log():
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
# timefilehandler = logging.handlers.TimedRotatingFileHandler(log_path + "/dispatch.log", when='M', interval=1, backupCount=60)
filehandler
=
logging
.
handlers
.
RotatingFileHandler
(
log_path
+
"/dispatch.log"
,
maxBytes
=
30
*
1024
*
1024
,
backupCount
=
10
,
encoding
=
"utf-8"
)
#
filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", maxBytes=30*1024*1024, backupCount=10, encoding="utf-8")
#
filehandler = logging.handlers.RotatingFileHandler("./Logs/dispatch.log", maxBytes=3 * 1024 * 1024, backupCount=10, encoding="utf-8")
filehandler
=
logging
.
handlers
.
RotatingFileHandler
(
"./Logs/dispatch.log"
,
maxBytes
=
3
*
1024
*
1024
,
backupCount
=
10
,
encoding
=
"utf-8"
)
# 设置后缀名称,跟strftime的格式一样
# 设置后缀名称,跟strftime的格式一样
filehandler
.
suffix
=
"
%
Y-
%
m-
%
d_
%
H-
%
M.log"
filehandler
.
suffix
=
"
%
Y-
%
m-
%
d_
%
H-
%
M.log"
...
...
tables.py
View file @
23d1dc84
...
@@ -406,6 +406,21 @@ class DiggingWorkArea(Base):
...
@@ -406,6 +406,21 @@ class DiggingWorkArea(Base):
self
.
ExitNodeId
=
ExitNodeId
self
.
ExitNodeId
=
ExitNodeId
class
ParkArea
(
Base
):
__tablename__
=
'Geo_ParkSpot'
Id
=
Column
(
VARCHAR
(
50
),
primary_key
=
True
)
Name
=
Column
(
VARCHAR
(
36
))
EntranceNodeId
=
Column
(
VARCHAR
(
50
))
ExitNodeId
=
Column
(
VARCHAR
(
50
))
def
__init__
(
self
,
Id
,
Name
,
EntranceNodeId
,
ExitNodeId
):
self
.
Id
=
Id
self
.
Name
=
Name
self
.
EntranceNodeId
=
EntranceNodeId
self
.
ExitNodeId
=
ExitNodeId
class
DispatchRule
(
Base
):
class
DispatchRule
(
Base
):
__tablename__
=
'sys_dispatch_rule'
__tablename__
=
'sys_dispatch_rule'
...
...
test.db
View file @
23d1dc84
No preview for this file type
util/area_analysis.py
View file @
23d1dc84
...
@@ -192,7 +192,7 @@ def truck_pass_first_area(truck_id, lane_id, closer_entrance_node_id, further_en
...
@@ -192,7 +192,7 @@ def truck_pass_first_area(truck_id, lane_id, closer_entrance_node_id, further_en
def
get_trucks_locate
():
def
get_trucks_locate
():
"""
"""
get trucks locates.
get trucks locates.
:return: truck_locate_dict
:return: truck_l
ane_l
ocate_dict
"""
"""
try
:
try
:
...
@@ -306,29 +306,28 @@ def get_excavator_state(excavator_id):
...
@@ -306,29 +306,28 @@ def get_excavator_state(excavator_id):
:param excavator_id:
:param excavator_id:
:return: state
:return: state
"""
"""
try
:
#
try:
logger
.
error
(
excavator_id
)
device_name
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
,
device_type
=
2
)
.
first
()
.
device_name
device_name
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
,
device_type
=
2
)
.
first
()
.
device_name
key_value_dict
=
redis2
.
hgetall
(
device_name
)
key_value_dict
=
redis2
.
hgetall
(
device_name
)
if
str_to_byte
(
'online'
)
in
key_value_dict
:
if
str_to_byte
(
'online'
)
in
key_value_dict
:
is_online
=
key_value_dict
[
str_to_byte
(
'online'
)]
is_online
=
key_value_dict
[
str_to_byte
(
'online'
)]
else
:
logger
.
warning
(
f
'挖机 {device_name} 不在线'
)
return
0
key_set
=
key_value_dict
.
keys
()
state
=
str_to_byte
(
'100'
)
if
(
str_to_byte
(
'online'
)
in
key_set
)
and
(
bytes
.
decode
(
is_online
)
in
[
"true"
or
"True"
]):
if
str_to_byte
(
'workState'
)
in
key_set
:
state
=
key_value_dict
[
str_to_byte
(
'workState'
)]
else
:
else
:
logger
.
warning
(
f
'挖机 {device_name}
不在线
'
)
logger
.
warning
(
f
'挖机 {device_name}
状态未知
'
)
return
0
return
0
key_set
=
key_value_dict
.
keys
()
state
=
100
if
(
str_to_byte
(
'online'
)
in
key_set
)
and
(
bytes
.
decode
(
is_online
)
in
[
"true"
or
"True"
]):
if
str_to_byte
(
'workState'
)
in
key_set
:
state
=
key_value_dict
[
str_to_byte
(
'workState'
)]
else
:
logger
.
warning
(
f
'挖机 {device_name} 状态未知'
)
return
0
return
int
(
float
(
byte_to_str
(
state
)))
return
int
(
float
(
byte_to_str
(
state
)))
except
Exception
as
es
:
# except Exception as es:
logger
.
error
(
"挖机状态读取异常"
)
# logger.error("挖机状态读取异常")
logger
.
error
(
es
)
# logger.error(es)
return
0
# return 0
\ No newline at end of file
\ 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