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
a274a624
Commit
a274a624
authored
May 12, 2023
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
二次调度逻辑优化
parent
77024ac7
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
117 additions
and
258 deletions
+117
-258
group.py
core/group.py
+0
-0
submit.py
core/submit.py
+25
-14
dispatchInfo.py
data/dispatchInfo.py
+0
-0
para_config.py
data/para_config.py
+14
-186
static_data_process.py
data/static_data_process.py
+20
-6
truck.py
equipment/truck.py
+22
-17
topo_graph.py
graph/topo_graph.py
+36
-35
No files found.
core/group.py
View file @
a274a624
This diff is collapsed.
Click to expand it.
core/submit.py
View file @
a274a624
...
...
@@ -28,6 +28,7 @@ class DispatchSubmission:
Attribute:
"""
def
__init__
(
self
,
dump
:
DumpInfo
,
excavator
:
ExcavatorInfo
,
truck
:
TruckInfo
,
topo
:
Topo
):
self
.
logger
=
get_logger
(
"zxt.submission"
)
self
.
dump
=
dump
...
...
@@ -35,7 +36,8 @@ class DispatchSubmission:
self
.
truck
=
truck
self
.
topo
=
topo
def
truck_dispatch_to_redis
(
self
,
truck_id
:
str
,
truck_info
:
CurrentTruck
,
dispatch_seq
:
List
[
int
],
group_mode
:
int
):
def
truck_dispatch_to_redis
(
self
,
truck_id
:
str
,
truck_info
:
CurrentTruck
,
dispatch_seq
:
List
[
int
],
group_mode
:
int
):
"""
将truck_id对应矿卡派车计划写入redis
:param group_mode: (int)
...
...
@@ -123,15 +125,18 @@ class DispatchSubmission:
# TODO: 判断了两次是否拥堵,需要改善
if
self
.
topo
is
not
None
:
# 车辆重载等待,且前方道路阻塞
if
task
==
3
and
state
==
2
and
truck_id
in
self
.
truck
.
get_truck_locate_dict
()
and
\
self
.
truck
.
get_truck_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
if
self
.
topo
is
not
None
\
and
task
==
3
\
and
state
==
2
\
and
truck_id
in
self
.
truck
.
get_truck_lane_locate_dict
()
\
and
self
.
truck
.
get_truck_lane_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
# try:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
self
.
logger
.
info
(
"二次调度前往卸载区"
)
record
[
"isTemp"
]
=
True
# 避免反复修改
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
POST
(
truck_id
)
# else:
# self.logger.info("车辆已完成二次调度-无需更改派车计划")
...
...
@@ -144,7 +149,6 @@ class DispatchSubmission:
else
:
self
.
logger
.
info
(
"正常调度前往卸载区"
)
record
[
"isTemp"
]
=
False
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
...
...
@@ -184,14 +188,19 @@ class DispatchSubmission:
if
self
.
topo
is
not
None
:
# 车辆重载等待,且前方道路阻塞
if
task
==
0
and
state
==
2
and
truck_id
in
self
.
truck
.
get_truck_locate_dict
()
and
\
self
.
truck
.
get_truck_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
if
self
.
topo
is
not
None
\
and
task
==
0
\
and
state
==
2
\
and
truck_id
in
self
.
truck
.
get_truck_lane_locate_dict
()
\
and
self
.
truck
.
get_truck_lane_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
# 车辆停车等待
# try:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
self
.
logger
.
info
(
"二次调度前往装载区"
)
record
[
"isTemp"
]
=
True
# 避免反复修改
POST
(
truck_id
)
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
# else:
# self.logger.info("车辆已完成二次调度-无需更改派车计划")
# except Exception as es:
...
...
@@ -203,7 +212,6 @@ class DispatchSubmission:
else
:
self
.
logger
.
info
(
"正常调度前往装载区"
)
record
[
"isTemp"
]
=
False
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
...
...
@@ -245,19 +253,22 @@ class DispatchSubmission:
self
.
logger
.
info
(
"dispatch_plan_dict"
)
self
.
logger
.
info
(
dispatch_plan_dict
)
for
truck_id
,
dispatch_plan
in
dispatch_plan_dict
.
items
():
try
:
self
.
logger
.
info
(
f
'======================================= 调度车辆 ======================================='
)
if
truck_id
in
group
.
truck_info_list
:
self
.
logger
.
info
(
f
'======================================= 派车计划写入 ======================================='
)
self
.
truck_dispatch_to_redis
(
truck_id
,
group
.
truck_info_list
[
truck_id
],
dispatch_plan
,
group
.
group_mode
)
self
.
logger
.
info
(
"======================================== 完成写入 ======================================="
)
self
.
logger
.
info
(
"======================================== 计划完成写入 ======================================="
)
else
:
raise
Exception
(
"车辆对象信息不存在 group.truck_info_list"
)
except
Exception
as
es
:
self
.
logger
.
error
(
"group_dispatch_to_redis_error"
)
#
self.logger.error("group_dispatch_to_redis_error")
self
.
logger
.
error
(
es
)
truck_direct2redis
(
truck_id
)
def
redis_format
(
truck_id
,
group_id
,
dispatch_id
,
item
):
record
=
{
"truckId"
:
truck_id
,
"dispatchId"
:
dispatch_id
,
"exactorId"
:
item
.
exactor_id
,
"dumpId"
:
item
.
dump_id
,
"loadAreaId"
:
item
.
load_area_id
,
"unloadAreaId"
:
item
.
unload_area_id
,
"groupId"
:
item
.
group_id
,
...
...
data/dispatchInfo.py
View file @
a274a624
This diff is collapsed.
Click to expand it.
data/para_config.py
View file @
a274a624
...
...
@@ -11,7 +11,9 @@ from settings import *
from
tables
import
*
import
numpy
as
np
# 全局参数设定
'''
全局参数设定
'''
# 空载任务集合
empty_task_set
=
[
0
,
1
,
5
]
...
...
@@ -27,69 +29,17 @@ M = 100000000
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["dynamic_truck_set"] = dynamic_truck_set
# global_dict["dynamic_truck_num"] = dynamic_truck_num
# global_dict["dynamic_excavator_set"] = dynamic_excavator_set
# global_dict["dynamic_excavator_num"] = dynamic_excavator_num
# global_dict["dynamic_dump_set"] = dynamic_dump_set
# global_dict["dynamic_dump_num"] = dynamic_dump_num
# global_dict["park_num"] = park_num
def
get_value
(
name
):
return
global_dict
[
name
]
# 设备映射类, 存储除工作区以外的映射关系
# 其余设备类继承该类
class
DeviceMap
:
"""
设备映射类, 存储除工作区以外的映射关系, 其余设备类继承该类
"""
excavator_uuid_to_index_dict
=
{}
dump_uuid_to_index_dict
=
{}
excavator_index_to_uuid_dict
=
{}
...
...
@@ -103,50 +53,6 @@ class DeviceMap:
truck_uuid_to_index_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
def
reset
(
cls
):
cls
.
excavator_uuid_to_index_dict
=
{}
...
...
@@ -193,58 +99,19 @@ class DeviceMap:
"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_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
):
# 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
...
...
@@ -262,49 +129,9 @@ class WalkManage(DeviceMap):
distance_to_load_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
def
reset
(
cls
):
# dynamic_excavator_num
# dynamic_dump_num
# park_num
# 路网真实距离
cls
.
walk_time_to_excavator
=
np
.
full
(
(
dynamic_dump_num
,
dynamic_excavator_num
),
M
...
...
@@ -450,7 +277,8 @@ def global_period_para_update():
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
,
"truck_uuid_to_name_dict"
:
truck_uuid_to_name_dict
,
...
...
data/static_data_process.py
View file @
a274a624
...
...
@@ -14,6 +14,11 @@ from tables import *
logger
=
get_logger
(
"zxt.static_data_process"
)
'''
area uuid index map building
'''
def
build_work_area_uuid_index_map
():
# load_area_id <-> load_area_index
# unload_area_id <-> unload_area_index
...
...
@@ -71,7 +76,7 @@ def build_park_uuid_index_map():
if
park_num
<
1
:
raise
Exception
(
"无备停区路网信息"
)
except
Exception
as
es
:
logger
.
info
(
"备停区路网读取"
)
logger
.
error
(
"备停区路网读取"
)
logger
.
error
(
es
)
session_postgre
.
rollback
()
session_mysql
.
rollback
()
...
...
@@ -79,6 +84,11 @@ def build_park_uuid_index_map():
return
park_uuid_to_index_dict
,
park_index_to_uuid_dict
'''
equipment uuid name map building
'''
def
build_truck_uuid_name_map
():
# truck_id <-> truck_name
truck_uuid_to_name_dict
=
{}
...
...
@@ -100,11 +110,9 @@ def build_truck_uuid_name_map():
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
# dump_id <-> dump_name
excavator_uuid_to_name_dict
=
{}
dump_uuid_to_name_dict
=
{}
try
:
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
2
)
.
all
():
...
...
@@ -118,8 +126,13 @@ def build_equipment_uuid_name_map():
logger
.
warning
(
es
)
session_postgre
.
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
:
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
3
)
.
all
():
truck_id
=
item
.
id
...
...
@@ -132,7 +145,7 @@ def build_equipment_uuid_name_map():
logger
.
warning
(
es
)
session_postgre
.
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
):
...
...
@@ -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_index_to_uuid_dict
=
{}
...
...
@@ -229,6 +242,7 @@ def update_truck_uuid_index_map(dynamic_truck_set):
"truck_index_to_uuid_dict"
:
truck_index_to_uuid_dict
,
}
def
update_total_truck
():
# 矿卡集合
truck_list
=
[]
...
...
equipment/truck.py
View file @
a274a624
...
...
@@ -85,8 +85,8 @@ class TruckInfo(WalkManage):
# 对象域
self
.
_dump
=
dump
self
.
_excavator
=
excavator
# 车辆位置信息
self
.
truck_locate_dict
=
{}
# 车辆
车道
位置信息
self
.
truck_l
ane_l
ocate_dict
=
{}
# 车辆临时调度
self
.
truck_is_temp
=
{}
...
...
@@ -132,8 +132,8 @@ class TruckInfo(WalkManage):
def
get_excavator_hold_truck_num
(
self
):
return
self
.
excavator_hold_truck_num
def
get_truck_locate_dict
(
self
):
return
self
.
truck_locate_dict
def
get_truck_l
ane_l
ocate_dict
(
self
):
return
self
.
truck_l
ane_l
ocate_dict
################################################ short term update ################################################
...
...
@@ -219,18 +219,20 @@ class TruckInfo(WalkManage):
key_value_dict
=
redis5
.
get
(
truck_name_to_uuid_dict
[
item
])
# reids str可以自动转为bytes
if
key_value_dict
is
None
:
raise
CoreException
(
108
,
f
'车辆{item}不存在于redis5'
)
# raise CoreException(108, f'车辆{item}不存在于redis5')
self
.
logger
.
warning
(
f
'车辆{item}不存在于redis5'
)
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
:
try
:
if
"isTemp"
in
key_value_dict
:
isTemp
=
key_value_dict
[
"isTemp"
]
else
:
isTemp
=
True
if
truck_name_to_uuid_dict
[
item
]
in
self
.
dynamic_truck_set
:
self
.
truck_is_temp
[
truck_name_to_uuid_dict
[
item
]]
=
bool
(
isTemp
)
except
Exception
as
es
:
self
.
logger
.
error
(
item
)
self
.
logger
.
error
(
es
)
self
.
truck_is_temp
[
truck_name_to_uuid_dict
[
item
]]
=
True
else
:
continue
# print(f'here3 {item} {bool(isTemp)}')
except
Exception
as
es
:
...
...
@@ -525,15 +527,15 @@ class TruckInfo(WalkManage):
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.
:return: truck_locate_dict
:return: truck_l
ane_l
ocate_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
:
try
:
# item = item.decode(encoding='utf-8')
...
...
@@ -548,7 +550,7 @@ class TruckInfo(WalkManage):
and
(
str_to_byte
(
'laneId'
)
in
key_set
):
truck_locate
=
key_value_dict
[
str_to_byte
(
'laneId'
)]
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
:
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
f
'车辆 {truck_id} 位置信息丢失'
)
...
...
@@ -638,6 +640,9 @@ class TruckInfo(WalkManage):
item
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
excavator_id
)
.
first
()
if
item
.
bind_list
is
not
None
:
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
[
truck_name_to_uuid_dict
[
truck_name
]
]
=
excavator_id
...
...
@@ -953,4 +958,4 @@ class TruckInfo(WalkManage):
self
.
update_truck_speed
()
# 矿卡位置更新
self
.
update_trucks_locate
()
self
.
update_trucks_l
ane_l
ocate
()
graph/topo_graph.py
View file @
a274a624
...
...
@@ -154,21 +154,21 @@ class Topo():
if
Entrancenode_for_dump
not
in
self
.
unload_G_all_nodes
:
self
.
unload_G_all_nodes
.
append
(
Entrancenode_for_dump
)
self
.
unload_G_dump_nodes
.
append
(
Entrancenode_for_dump
)
try
:
unload_saved_lane
=
[]
for
i
in
item
[
1
]:
# for each lane in a to_unload route
i_startpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
i
)
.
first
()
.
StartNodeId
)
i_endpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
i
)
.
first
()
.
EndNodeId
)
for
lane_id
in
item
[
1
]:
# for each lane in a to_unload route
lane_startpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
StartNodeId
)
lane_endpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
EndNodeId
)
# add [start_point, end_point, length, lane_id] to unload_saved_lane
unload_saved_lane
.
append
([
str
(
i_startpoint
),
str
(
i_endpoint
),
float
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
i
)
.
first
()
.
Length
),
i
])
# son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = i_endpoint).all())
son_lane_num
=
len
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
StartNodeId
=
i_endpoint
)
.
all
())
unload_saved_lane
.
append
([
str
(
lane_startpoint
),
str
(
lane_endpoint
),
float
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
Length
),
lane_id
])
# son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = lane_endpoint).all())
son_lane_num
=
len
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
StartNodeId
=
lane_endpoint
)
.
all
())
# 可以添加的节点:分叉口或终点
if
son_lane_num
>
1
or
i
_endpoint
in
self
.
unload_G_dump_nodes
:
if
son_lane_num
>
1
or
lane
_endpoint
in
self
.
unload_G_dump_nodes
:
# print("item",item[0])
# print(unload_saved_lane)
# print("\n")
...
...
@@ -188,17 +188,17 @@ class Topo():
# if [unload_saved_lane[0][0], unload_saved_lane[-1][1]] not in self.unload_G_edges:
# self.unload_G_edges.append([unload_saved_lane[0][0], unload_saved_lane[-1][1]])
unload_saved_lane
=
[]
if
i
_startpoint
not
in
self
.
unload_G_all_nodes
:
self
.
unload_G_all_nodes
.
append
(
i
_startpoint
)
if
i
_endpoint
not
in
self
.
unload_G_all_nodes
:
self
.
unload_G_all_nodes
.
append
(
i
_endpoint
)
if
lane
_startpoint
not
in
self
.
unload_G_all_nodes
:
self
.
unload_G_all_nodes
.
append
(
lane
_startpoint
)
if
lane
_endpoint
not
in
self
.
unload_G_all_nodes
:
self
.
unload_G_all_nodes
.
append
(
lane
_endpoint
)
except
Exception
as
es
:
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
"去卸载区拓扑图出错"
)
session_mysql
.
rollback
()
session_postgre
.
rollback
()
# path_node_for_trip.append(Exitnode_for_digging) # add node for trip
# if
i
_endpoint in self.unload_G_dump_nodes:
# if
lane
_endpoint in self.unload_G_dump_nodes:
# load_G
Entrancenode_for_digging
=
str
(
...
...
@@ -216,24 +216,26 @@ class Topo():
self
.
load_G_all_nodes
.
append
(
Entrancenode_for_digging
)
self
.
load_G_digging_nodes
.
append
(
Entrancenode_for_digging
)
self
.
load_G
.
add_node
(
Exitnode_for_dump
,
name
=
'group_dumps'
,
type
=
d
igging
_name
)
self
.
load_G
.
add_node
(
Entrancenode_for_digging
,
name
=
'digging'
,
type
=
d
ump
_name
)
self
.
load_G
.
add_node
(
Exitnode_for_dump
,
name
=
'group_dumps'
,
type
=
d
ump
_name
)
self
.
load_G
.
add_node
(
Entrancenode_for_digging
,
name
=
'digging'
,
type
=
d
igging
_name
)
try
:
load_saved_lane
=
[]
for
i
in
item
[
2
]:
# [[str(item.load_area_id), str(item.unload_area_id)], item.to_unload_lanes, item.to_load_lanes]
load_i_startpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
i
)
.
first
()
.
StartNodeId
)
load_i_endpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
i
)
.
first
()
.
EndNodeId
)
for
lane_id
in
item
[
2
]:
# [[str(item.load_area_id), str(item.unload_area_id)], item.to_unload_lanes, item.to_load_lanes]
lane_startpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
StartNodeId
)
lane_endpoint
=
str
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
EndNodeId
)
load_saved_lane
.
append
([
str
(
load_i_startpoint
),
str
(
load_i_endpoint
),
float
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
i
)
.
first
()
.
Length
),
i
])
# son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = load_i_endpoint).all())
son_lane_num
=
len
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
StartNodeId
=
load_i_endpoint
)
.
all
())
load_saved_lane
.
append
([
str
(
lane_startpoint
),
str
(
lane_endpoint
),
float
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
Id
=
lane_id
)
.
first
()
.
Length
),
lane_id
])
# son_lane_num = sum(1 for truck_id in session_postgre.query(Lane).filter_by(StartNodeId = lane_endpoint).all())
son_lane_num
=
len
(
session_postgre
.
query
(
Lane
)
.
filter_by
(
StartNodeId
=
lane_endpoint
)
.
all
())
nodes
=
list
(
self
.
load_G
.
nodes
)
# 可以添加的节点:分叉口或终点
if
son_lane_num
>
1
or
l
oad_i_endpoint
in
self
.
load_G_digging_nodes
or
load_i
_endpoint
in
nodes
:
if
son_lane_num
>
1
or
l
ane_endpoint
in
self
.
load_G_digging_nodes
or
lane
_endpoint
in
nodes
:
# print("item",item[0])
# print(load_saved_lane)
# print("\n")
...
...
@@ -252,19 +254,19 @@ class Topo():
# if [load_saved_lane[0][0], load_saved_lane[-1][1]] not in self.load_G_edges:
# self.load_G_edges.append([load_saved_lane[0][0], load_saved_lane[-1][1]])
load_saved_lane
=
[]
if
l
oad_i
_startpoint
not
in
self
.
load_G_all_nodes
:
self
.
load_G_all_nodes
.
append
(
l
oad_i
_startpoint
)
if
l
oad_i
_endpoint
not
in
self
.
load_G_all_nodes
:
self
.
load_G_all_nodes
.
append
(
l
oad_i
_endpoint
)
if
l
ane
_startpoint
not
in
self
.
load_G_all_nodes
:
self
.
load_G_all_nodes
.
append
(
l
ane
_startpoint
)
if
l
ane
_endpoint
not
in
self
.
load_G_all_nodes
:
self
.
load_G_all_nodes
.
append
(
l
ane
_endpoint
)
except
Exception
as
es
:
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
"去装载区拓扑图生成失败"
)
session_mysql
.
rollback
()
session_postgre
.
rollback
()
print
(
self
.
load_G
.
nodes
.
data
())
# park_to_load_G
for
k
in
park_trip
:
...
...
@@ -354,10 +356,11 @@ class Topo():
distance
,
path
=
nx
.
single_source_dijkstra
(
self
.
unload_G
,
source
=
source_node
,
target
=
i
,
weight
=
"real_distance"
)
unload_area_id
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
(
EntranceNodeId
=
i
)
.
first
()
.
Id
unload_area_id
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
(
EntranceNodeId
=
i
)
.
first
()
.
Id
unload_area_lane_dict
[
str
(
unload_area_id
)]
=
[]
for
j
in
range
(
len
(
path
)
-
1
):
unload_area_lane_dict
[
str
(
unload_area_id
)]
+=
self
.
load_G
[
path
[
j
]][
path
[
j
+
1
]][
'lane'
]
unload_area_lane_dict
[
str
(
unload_area_id
)]
+=
self
.
load_G
[
path
[
j
]][
path
[
j
+
1
]][
'lane'
]
path_length_map
[
distance
]
=
path
# print(path)
...
...
@@ -402,7 +405,6 @@ class Topo():
data
[
u
]
=
[
v
[
0
],
v
[
0
]]
self
.
load_G
[
path
[
i
]][
path
[
i
+
1
]][
'locked_distance'
]
=
sum
(
i
[
-
1
]
for
i
in
list
(
data
.
values
()))
"""
return relative distance between node and lane (graph_type: 0=load, 1=unload)
"""
...
...
@@ -455,7 +457,6 @@ class Topo():
if
not
len
(
target_list
):
self
.
logger
.
error
(
"当前无可去装载区!"
)
load_area_lane_dict
=
{}
# print(target_list)
...
...
@@ -469,7 +470,7 @@ class Topo():
load_area_id
=
session_postgre
.
query
(
DiggingWorkArea
)
.
filter_by
(
EntranceNodeId
=
i
)
.
first
()
.
Id
load_area_lane_dict
[
str
(
load_area_id
)]
=
[]
for
j
in
range
(
len
(
path
)
-
1
):
load_area_lane_dict
[
str
(
load_area_id
)]
+=
self
.
load_G
[
path
[
j
]][
path
[
j
+
1
]][
'lane'
]
load_area_lane_dict
[
str
(
load_area_id
)]
+=
self
.
load_G
[
path
[
j
]][
path
[
j
+
1
]][
'lane'
]
path_length_map
[
distance
]
=
path
# print(path)
...
...
@@ -511,6 +512,6 @@ class Topo():
lanes
=
session_postgre
.
query
(
Lane
)
.
filter_by
(
EndNodeId
=
node_id
)
.
first
()
if
lanes
is
not
None
:
self
.
cross_bf_lanes
.
append
(
str
(
lanes
.
Id
))
def
get_cross_nodes
(
self
):
return
self
.
cross_nodes
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