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
39eaec24
Commit
39eaec24
authored
Oct 14, 2022
by
张晓彤
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
代码优化v1
parent
efc064b5
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
472 additions
and
246 deletions
+472
-246
algorithm.py
alg/algorithm.py
+107
-103
config.json
config.json
+6
-5
dispatcher.py
core/dispatcher.py
+112
-107
group.py
core/group.py
+27
-10
dispatchInfo.py
data/dispatchInfo.py
+5
-2
para_config.py
data/para_config.py
+1
-0
realtime_dispatch_test.py
realtime_dispatch_test.py
+3
-4
settings.py
settings.py
+2
-2
test4.py
test/test4.py
+18
-0
text.ipynb
test/text.ipynb
+111
-0
topo_sql.py
test/topo_sql.py
+0
-0
topo_test.ipynb
test/topo_test.ipynb
+55
-8
core_exception.py
util/core_exception.py
+25
-5
No files found.
alg/algorithm.py
View file @
39eaec24
...
@@ -10,6 +10,7 @@ from data.para_config import *
...
@@ -10,6 +10,7 @@ from data.para_config import *
from
equipment
import
DumpInfo
from
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
class
AlgorithmBase
:
class
AlgorithmBase
:
...
@@ -147,133 +148,133 @@ class ExpectedTime(AlgorithmBase):
...
@@ -147,133 +148,133 @@ class ExpectedTime(AlgorithmBase):
:return: travel_time_value
:return: travel_time_value
"""
"""
try
:
# try:
# truck_index = self.truck.truck_uuid_to_index_dict[truck_id]
# trip = self.truck.get_truck_current_trip()[truck_index]
#
# task = self.truck.get_truck_current_task()[truck_id]
truck_id
=
truck_info
.
get_truck_id
()
truck_id
=
truck_info
.
get_truck_id
()
truck_index
=
self
.
truck
.
truck_uuid_to_index_dict
[
truck_id
]
trip
=
truck_info
.
get_trip
()
# task = truck_task
# trip = truck_trip
trip
=
truck_info
.
get_trip
()
task
=
truck_info
.
get_task
()
task
=
truck_info
.
get_task
(
)
truck_avl_time
=
self
.
pre_sch
.
get_truck_avl_time
(
truck_id
=
truck_id
)
truck_avl_time
=
self
.
pre_sch
.
get_truck_avl_time
(
truck_id
=
truck_id
)
group_dynamic_excavator_num
=
len
(
self
.
group
.
excavator
)
group_dynamic_excavator_num
=
len
(
self
.
group
.
excavator
)
group_dynamic_unload_area_num
=
len
(
self
.
group
.
unload_area
)
group_dynamic_unload_area_num
=
len
(
self
.
group
.
unload_area
)
# except Exception as es:
# self.logger.error("车辆调度信息读取异常")
except
Exception
as
es
:
# self.logger.error(es)
self
.
logger
.
error
(
"车辆调度信息读取异常"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
info
(
"-----------------------------------Alg. Module-----------------------------------"
)
self
.
logger
.
info
(
"-----------------------------------Alg. Module-----------------------------------"
)
if
task
==
-
2
:
if
task
==
-
2
:
################################################ 矿卡启动 ###############################################
################################################ 矿卡启动 ###############################################
try
:
self
.
logger
.
info
(
f
'矿卡 {truck_id}'
)
self
.
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
self
.
logger
.
info
(
f
"涉及挖机:{self.group.excavator}"
)
# self.logger.info(f"涉及挖机:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except
Exception
as
es
:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
self
.
logger
.
error
(
es
)
# try:
# try:
# 挖机可用时间
self
.
logger
.
info
(
f
'矿卡 {truck_id}'
)
excavator_val_time_global
=
self
.
pre_sch
.
get_excavator_avl_time
()
self
.
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
self
.
logger
.
info
(
f
"涉及挖机:{self.group.excavator}"
)
# self.logger.info(f"涉及挖机:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
# except Exception as es:
# self.logger.error(f"矿卡{truck_id}状态不匹配")
# self.logger.error(es)
excavator_val_time
=
np
.
full
(
len
(
self
.
group
.
excavator
),
0.0
)
try
:
# 全局挖机可用时间 dict
excavator_val_time_dict
=
self
.
pre_sch
.
get_excavator_avl_time
()
self
.
logger
.
info
(
"self.group.excavator_uuid_index_dict"
)
# 局部挖机可用时间 list
self
.
logger
.
info
(
self
.
group
.
excavator_uuid_index_dict
)
group_excavator_avl_time_ls
=
np
.
full
(
len
(
self
.
group
.
excavator
),
0.0
)
for
excavator_id
,
excavator_index
in
self
.
group
.
excavator_uuid_index_dict
.
items
():
self
.
logger
.
info
(
"self.group.excavator_uuid_index_dict"
)
excavator_val_time
[
excavator_index
]
=
excavator_val_time_global
[
excavator_id
]
self
.
logger
.
info
(
self
.
group
.
excavator_uuid_index_dict
)
# 车辆驶往各目的地时间
for
excavator_id
,
excavator_index
in
self
.
group
.
excavator_uuid_index_dict
.
items
():
truck_reach_time
=
60
*
self
.
group
.
park_to_excavator_distance
[
0
,
:]
/
1000
/
\
group_excavator_avl_time_ls
[
excavator_index
]
=
excavator_val_time_dict
[
excavator_id
]
self
.
truck
.
empty_speed
[
truck_id
]
+
truck_avl_time
# 计算车辆得到服务时间
# 车辆驶往各目的地时间
truck_service_time
=
np
.
maximum
(
truck_reach_time
,
excavator_val_time
)
truck_reach_time_ls
=
60
*
self
.
group
.
park_to_excavator_distance
[
0
,
:]
/
1000
/
\
self
.
truck
.
empty_speed
[
truck_id
]
+
truck_avl_time
# 计算行程
时间
# 计算车辆得到服务
时间
transport_value
=
truck_service_time
-
truck_avl_time
truck_service_time
=
np
.
maximum
(
truck_reach_time_ls
,
group_excavator_avl_time_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_reach_time"
)
# 计算行程时间
self
.
logger
.
info
(
truck_reach_time
)
transport_value
=
truck_service_time
-
truck_avl_time
self
.
logger
.
info
(
"expected_travelling_schedule-excavator_val
_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_reach
_time"
)
self
.
logger
.
info
(
excavator_val_time
)
self
.
logger
.
info
(
truck_reach_time_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_service
_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-excavator_val
_time"
)
self
.
logger
.
info
(
truck_service_time
)
self
.
logger
.
info
(
group_excavator_avl_time_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_avl
_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_service
_time"
)
self
.
logger
.
info
(
truck_avl
_time
)
self
.
logger
.
info
(
truck_service
_time
)
self
.
logger
.
info
(
"expected_travelling_schedule-transport_valu
e"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_avl_tim
e"
)
self
.
logger
.
info
(
transport_valu
e
)
self
.
logger
.
info
(
truck_avl_tim
e
)
# except Exception as es:
self
.
logger
.
info
(
"expected_travelling_schedule-transport_value"
)
# self.logger.error("矿卡启动调度异常")
self
.
logger
.
info
(
transport_value
)
# self.logger.error(es)
# transport_value = np.zeros(group_dynamic_excavator_num)
except
Exception
as
es
:
self
.
logger
.
error
(
"矿卡启动调度异常"
)
self
.
logger
.
error
(
es
)
transport_value
=
np
.
zeros
(
group_dynamic_excavator_num
)
if
task
in
[
1
,
2
]:
if
task
in
[
1
,
2
]:
################################################ 矿卡空载 ###############################################
################################################ 矿卡空载 ###############################################
try
:
#
try:
self
.
logger
.
info
(
f
'矿卡 {truck_id}'
)
self
.
logger
.
info
(
f
'矿卡 {truck_id}'
)
self
.
logger
.
info
(
"矿卡状态:矿卡空载"
)
self
.
logger
.
info
(
"矿卡状态:矿卡空载"
)
self
.
logger
.
info
(
f
"涉及卸载设备:{self.group.dump}"
)
self
.
logger
.
info
(
f
"涉及卸载设备:{self.group.dump}"
)
# self.logger.info(f"涉及卸载设备:{list(DeviceMap.dump_uuid_to_index_dict.keys())}")
# self.logger.info(f"涉及卸载设备:{list(DeviceMap.dump_uuid_to_index_dict.keys())}")
except
Exception
as
es
:
#
except Exception as es:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
#
self.logger.error(f"矿卡{truck_id}状态不匹配")
self
.
logger
.
error
(
es
)
#
self.logger.error(es)
try
:
try
:
# 全局卸点可用时间 dict
# get dump available time (List) for all
dump_val_time_global
=
self
.
pre_sch
.
get_dump_avl_time
()
dump_val_time_dict
=
self
.
pre_sch
.
get_dump_avl_time
()
# get dump available time (List) within the group
group_dump_val_time_ls
=
np
.
full
(
len
(
self
.
group
.
unload_area
),
0.0
)
self
.
logger
.
info
(
"self.group.dump_uuid_index_dict"
)
self
.
logger
.
info
(
self
.
group
.
dump_uuid_index_dict
)
# 局部卸点可用时间 list
dump_val_time
=
np
.
full
(
len
(
self
.
group
.
unload_area
),
0.0
)
bb
=
self
.
group
.
dump_uuid_index_dict
for
dump_id
,
dump_index
in
self
.
group
.
dump_uuid_index_dict
.
items
():
for
dump_id
,
dump_index
in
self
.
group
.
dump_uuid_index_dict
.
items
():
dump_val_time
[
dump_index
]
=
dump_val_time_global
[
dump_id
]
group_dump_val_time_ls
[
dump_index
]
=
dump_val_time_dict
[
dump_id
]
# 车辆所在挖机 uuid
# get truck located excavator id (uuid) from truck trip
if
int
(
trip
[
1
])
<
0
or
int
(
trip
[
1
])
>=
len
(
DeviceMap
.
excavator_index_to_uuid_dict
):
raise
CoreException
(
105
,
f
'车辆 {truck_id} 行程驶往 {int(trip[1])} 号挖机越界'
)
excavator_id
=
DeviceMap
.
excavator_index_to_uuid_dict
[
int
(
trip
[
1
])]
excavator_id
=
DeviceMap
.
excavator_index_to_uuid_dict
[
int
(
trip
[
1
])]
# 挖机所在分组序号 index
# get excavator index (int) within group from group's excavator_group_index
if
excavator_id
not
in
self
.
group
.
excavator_uuid_index_dict
:
raise
CoreException
(
106
,
f
'挖机 {excavator_id} 不存在于分组 {self.group.name} excavator_uuid_index_dict'
)
excavator_group_index
=
self
.
group
.
excavator_uuid_index_dict
[
excavator_id
]
excavator_group_index
=
self
.
group
.
excavator_uuid_index_dict
[
excavator_id
]
#
车辆驶往各目的地时间
#
get travelling time (List) to each dump
truck_reach_time
=
60
*
self
.
group
.
to_unload_area_distance
[
excavator_group_index
,
:]
\
truck_reach_time
_ls
=
60
*
self
.
group
.
to_unload_area_distance
[
excavator_group_index
,
:]
\
/
1000
/
self
.
truck
.
heavy_speed
[
truck_id
]
+
truck_avl_time
/
1000
/
self
.
truck
.
heavy_speed
[
truck_id
]
+
truck_avl_time
# 车辆得到服务时间
# get truck servicing time (List)
truck_service_time
=
np
.
maximum
(
truck_reach_time
,
dump_val_time
)
if
len
(
truck_reach_time_ls
)
!=
len
(
group_dump_val_time_ls
):
raise
CoreException
(
104
,
f
'车辆抵达各卸点时间 {truck_reach_time_ls} 与 各卸点可用时间 {group_dump_val_time_ls} 不一致'
)
truck_service_time
=
np
.
maximum
(
truck_reach_time_ls
,
group_dump_val_time_ls
)
#
计算行程时间
#
get trip time
transport_value
=
truck_service_time
-
truck_avl_time
transport_value
=
truck_service_time
-
truck_avl_time
self
.
logger
.
info
(
"expected_travelling_schedule-truck_reach_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_reach_time"
)
self
.
logger
.
info
(
truck_reach_time
)
self
.
logger
.
info
(
truck_reach_time
_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-dump_val_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-dump_val_time"
)
self
.
logger
.
info
(
dump_val_time
)
self
.
logger
.
info
(
group_dump_val_time_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_service_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_service_time"
)
self
.
logger
.
info
(
truck_service_time
)
self
.
logger
.
info
(
truck_service_time
)
...
@@ -292,48 +293,52 @@ class ExpectedTime(AlgorithmBase):
...
@@ -292,48 +293,52 @@ class ExpectedTime(AlgorithmBase):
elif
task
in
[
4
,
5
]:
elif
task
in
[
4
,
5
]:
################################################ 矿卡重载 ###############################################
################################################ 矿卡重载 ###############################################
try
:
#
try:
self
.
logger
.
info
(
f
'矿卡 {truck_id}'
)
self
.
logger
.
info
(
f
'矿卡 {truck_id}'
)
self
.
logger
.
info
(
"矿卡状态:矿卡重载"
)
self
.
logger
.
info
(
"矿卡状态:矿卡重载"
)
self
.
logger
.
info
(
f
'涉及挖机设备:{self.group.excavator}'
)
self
.
logger
.
info
(
f
'涉及挖机设备:{self.group.excavator}'
)
# self.logger.info(f"涉及挖机设备:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
# self.logger.info(f"涉及挖机设备:{list(DeviceMap.excavator_uuid_to_index_dict.keys())}")
except
Exception
as
es
:
#
except Exception as es:
self
.
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
#
self.logger.error(f"矿卡{truck_id}状态不匹配")
self
.
logger
.
error
(
es
)
#
self.logger.error(es)
try
:
try
:
#
挖机可用时间
#
get excavator available time (List) for all
excavator_val_time
_global
=
self
.
pre_sch
.
get_excavator_avl_time
()
excavator_val_time
=
self
.
pre_sch
.
get_excavator_avl_time
()
excavator_val_time
=
np
.
full
(
len
(
self
.
group
.
excavator
),
0.0
)
# get excavator available time (List) within the group
group_excavator_avl_time_ls
=
np
.
full
(
len
(
self
.
group
.
excavator
),
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
():
for
excavator_id
,
excavator_index
in
self
.
group
.
excavator_uuid_index_dict
.
items
():
excavator_val_time
[
excavator_index
]
=
excavator_val_time_global
[
excavator_id
]
group_excavator_avl_time_ls
[
excavator_index
]
=
excavator_val_time
[
excavator_id
]
#
车辆所在卸点
#
get truck located dump id (uuid) from truck trip
dump_id
=
DeviceMap
.
dump_index_to_uuid_dict
[
int
(
trip
[
1
])]
dump_id
=
DeviceMap
.
dump_index_to_uuid_dict
[
int
(
trip
[
1
])]
#
卸载区域id
#
get unload area id (uuid) from DispatchInfo dump_id to unload_area mapping
unload_area_id
=
DispatchInfo
.
dump_unload_area_dict
[
dump_id
]
unload_area_id
=
DispatchInfo
.
dump_unload_area_dict
[
dump_id
]
#
卸点对应分组编号
#
get unload area id (uuid) from DispatchInfo dump_id to unload
unload_area_group_index
=
self
.
group
.
unload_area_uuid_index_dict
[
unload_area_id
]
unload_area_group_index
=
self
.
group
.
unload_area_uuid_index_dict
[
unload_area_id
]
# 车辆驶往各目的地时间
# 车辆驶往各目的地时间
truck_reach_time
=
60
*
self
.
group
.
to_excavator_distance
[
unload_area_group_index
,
:]
\
truck_reach_time
_ls
=
60
*
self
.
group
.
to_excavator_distance
[
unload_area_group_index
,
:]
\
/
1000
/
self
.
truck
.
empty_speed
[
truck_id
]
+
truck_avl_time
/
1000
/
self
.
truck
.
empty_speed
[
truck_id
]
+
truck_avl_time
# 计算车辆得到服务时间
# 计算车辆得到服务时间
truck_service_time
=
np
.
maximum
(
truck_reach_time
,
excavator_val_time
)
truck_service_time
=
np
.
maximum
(
truck_reach_time
_ls
,
group_excavator_avl_time_ls
)
# 计算行程时间
# 计算行程时间
transport_value
=
truck_service_time
-
truck_avl_time
transport_value
=
truck_service_time
-
truck_avl_time
self
.
logger
.
info
(
"expected_travelling_schedule-truck_reach_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_reach_time"
)
self
.
logger
.
info
(
truck_reach_time
)
self
.
logger
.
info
(
truck_reach_time
_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-excavator_val_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-excavator_val_time"
)
self
.
logger
.
info
(
excavator_val_time
)
self
.
logger
.
info
(
group_excavator_avl_time_ls
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_service_time"
)
self
.
logger
.
info
(
"expected_travelling_schedule-truck_service_time"
)
self
.
logger
.
info
(
truck_service_time
)
self
.
logger
.
info
(
truck_service_time
)
...
@@ -352,6 +357,7 @@ class ExpectedTime(AlgorithmBase):
...
@@ -352,6 +357,7 @@ class ExpectedTime(AlgorithmBase):
return
transport_value
return
transport_value
class
DistributionRatio
(
object
):
class
DistributionRatio
(
object
):
"""
"""
@date:2022/7/19 8:49
@date:2022/7/19 8:49
...
@@ -469,7 +475,6 @@ class DistributionRatio(object):
...
@@ -469,7 +475,6 @@ class DistributionRatio(object):
self
.
logger
.
error
(
"卡车与下一个卸载区的配对关系异常"
)
self
.
logger
.
error
(
"卡车与下一个卸载区的配对关系异常"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
# try:
# try:
# temp = list(self.unload_ratio.values())
# temp = list(self.unload_ratio.values())
# next_unload_id = list(self.unload_ratio.keys())[temp.index(max(temp))]
# next_unload_id = list(self.unload_ratio.keys())[temp.index(max(temp))]
...
@@ -499,4 +504,3 @@ class DistributionRatio(object):
...
@@ -499,4 +504,3 @@ class DistributionRatio(object):
self
.
logger
.
error
(
"分流配比主函数异常"
)
self
.
logger
.
error
(
"分流配比主函数异常"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
return
next_unload_area_id
return
next_unload_area_id
config.json
View file @
39eaec24
...
@@ -8,23 +8,23 @@
...
@@ -8,23 +8,23 @@
},
},
"mysql"
:
{
"mysql"
:
{
"host"
:
"1
72.16.0.103
"
,
"host"
:
"1
92.168.9.152
"
,
"port"
:
"3306"
,
"port"
:
"3306"
,
"user"
:
"root"
,
"user"
:
"root"
,
"password"
:
"Huituo@123"
,
"password"
:
"Huituo@123"
,
"database"
:
"
ht_zhunneng
"
"database"
:
"
waytous
"
},
},
"postgresql"
:
{
"postgresql"
:
{
"host"
:
"1
72.16.0.103
"
,
"host"
:
"1
92.168.9.152
"
,
"port"
:
"5432"
,
"port"
:
"5432"
,
"user"
:
"postgres"
,
"user"
:
"postgres"
,
"password"
:
"Huituo@123"
,
"password"
:
"Huituo@123"
,
"database"
:
"
gis_zhunneng
"
"database"
:
"
shenbao_2021520
"
},
},
"redis"
:
{
"redis"
:
{
"host"
:
"1
72.16.0.103
"
,
"host"
:
"1
92.168.9.152
"
,
"password"
:
"Huituo@123"
"password"
:
"Huituo@123"
}
}
}
}
\ No newline at end of file
core/dispatcher.py
View file @
39eaec24
...
@@ -20,6 +20,8 @@ from tables import session_mysql, session_postgre
...
@@ -20,6 +20,8 @@ from tables import session_mysql, session_postgre
from
graph.graph_load
import
graph_construct
from
graph.graph_load
import
graph_construct
from
core.util
import
POST
from
core.util
import
POST
from
graph.topo_graph
import
Topo
from
graph.topo_graph
import
Topo
from
core.group
import
CurrentTruck
from
typing
import
List
class
Dispatcher
:
class
Dispatcher
:
...
@@ -55,10 +57,11 @@ class Dispatcher:
...
@@ -55,10 +57,11 @@ class Dispatcher:
:return: None
:return: None
"""
"""
self
.
group_list
=
{}
self
.
group_list
=
{}
groups
=
DispatchInfo
.
get_all_group
()
groups
_id
=
DispatchInfo
.
get_all_groups_id
()
for
group_id
in
groups
:
for
group_id
in
groups
_id
:
if
group_id
not
in
self
.
group_list
:
if
group_id
not
in
self
.
group_list
:
group
=
Group
(
group_id
,
self
.
truck
,
self
.
pre_sch
,
self
.
excavator
,
self
.
dump
,
self
.
topo
)
group
=
Group
(
group_id
,
self
.
truck
,
self
.
pre_sch
,
self
.
excavator
,
self
.
dump
,
self
.
topo
)
group
.
info_update
()
self
.
group_list
[
group_id
]
=
group
self
.
group_list
[
group_id
]
=
group
def
group_info_update
(
self
):
def
group_info_update
(
self
):
...
@@ -76,23 +79,29 @@ class Dispatcher:
...
@@ -76,23 +79,29 @@ 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
)
except
Exception
as
es
:
if
truck_dispatch_plan_dict
is
None
:
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
f
'分组 {group.group_id} 调度异常'
)
self
.
logger
.
error
(
f
'分组{group.group_id} 调度异常'
)
continue
self
.
logger
.
info
(
f
'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}'
)
# except Exception as es:
self
.
logger
.
info
(
f
'组内车辆 {group.truck_set}'
)
# self.logger.error(es)
self
.
logger
.
info
(
"组内挖机"
)
# self.logger.error(f'分组{group.group_id} 调度异常')
self
.
logger
.
info
(
group
.
excavator
)
self
.
logger
.
info
(
"组内卸点"
)
# 派车计划输出
self
.
logger
.
info
(
group
.
dump
)
self
.
submission
.
group_dispatch_to_redis
(
group
,
truck_dispatch_plan_dict
)
self
.
submission
.
group_dispatch_to_redis
(
group
,
truck_dispatch_plan_dict
)
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
,
"isdeleted"
:
False
,
"isTemp"
:
False
,
"haulFlag"
:
-
1
,
"groupName"
:
DispatchInfo
.
group_name
[
group_id
]}
return
record
class
DispatchSubmission
:
class
DispatchSubmission
:
""" class for the submission calculated dispatch.
""" class for the submission calculated dispatch.
...
@@ -108,44 +117,51 @@ class DispatchSubmission:
...
@@ -108,44 +117,51 @@ class DispatchSubmission:
self
.
truck
=
truck
self
.
truck
=
truck
self
.
topo
=
topo
self
.
topo
=
topo
def
truck_dispatch_to_redis
(
self
,
truck_id
,
dispatch_seq
):
def
truck_dispatch_to_redis
(
self
,
truck_id
:
str
,
truck_info
:
CurrentTruck
,
dispatch_seq
:
List
[
int
],
group_mode
:
int
):
"""
"""
将truck_id对应矿卡派车计划写入redis
将truck_id对应矿卡派车计划写入redis
:param group_mode: (int)
:param truck_id: (uuid) 矿卡uuid
:param truck_id: (uuid) 矿卡uuid
:param truck_info: (object)
:param dispatch_seq: (List[int]) 矿卡派车计划
:param dispatch_seq: (List[int]) 矿卡派车计划
:return: None
:return: None
"""
"""
try
:
try
:
group_id
=
DispatchInfo
.
truck_group_dict
[
truck_id
]
record
=
{
"truckId"
:
truck_id
}
self
.
logger
.
info
(
f
'调度车辆编号 {get_value("truck_uuid_to_name_dict")[truck_id]} {truck_id}'
)
task
=
self
.
truck
.
get_truck_current_task
()[
truck_id
]
self
.
logger
.
info
(
f
'车辆任务 {truck_info.get_task()}'
)
state
=
self
.
truck
.
get_truck_current_state
()[
truck_id
]
self
.
logger
.
info
(
f
'配对挖机 {dispatch_seq[0]}'
)
self
.
logger
.
info
(
f
'配对卸点 {dispatch_seq[1]}'
)
except
Exception
as
es
:
# try:
self
.
logger
.
error
(
"调度结果写入异常-读取矿卡信息异常(uuid, group id, task)"
)
self
.
logger
.
error
(
es
)
try
:
if
truck_id
not
in
DispatchInfo
.
truck_group_dict
:
group_mode
=
DispatchInfo
.
get_group_mode
(
group_id
)
group_id
=
None
self
.
logger
.
error
(
f
'调度结果写入异常-读取矿卡 {truck_id} 所在分组信息异常'
)
else
:
group_id
=
DispatchInfo
.
truck_group_dict
[
truck_id
]
except
Exception
as
es
:
record
=
{
"truckId"
:
truck_id
}
self
.
logger
.
error
(
"调度模式读取异常"
)
self
.
logger
.
error
(
es
)
group_mode
=
3
if
group_mode
==
3
:
# if group_id is None or DispatchInfo.get_group_mode(group_id) is None:
self
.
logger
.
info
(
"固定调度"
)
# group_mode = 3
self
.
fixed_dispatch_mode
(
group_id
,
record
,
truck_id
)
# self.logger.error("调度模式读取异常-设置为固定派车模式")
else
:
# else:
self
.
logger
.
info
(
"动态调度"
)
# group_mode = DispatchInfo.get_group_mode(group_id)
self
.
dynamic_dispatch_mode
(
dispatch_seq
,
group_id
,
record
,
state
,
task
,
truck_id
)
except
Exception
as
es
:
self
.
logger
.
info
(
f
'调度模式 {group_mode}'
)
self
.
logger
.
error
(
"调度结果写入异常"
)
self
.
logger
.
error
(
f
"调度结果:{dispatch_seq}"
)
if
group_mode
==
3
:
self
.
logger
.
error
(
es
)
self
.
logger
.
info
(
"固定派车模式"
)
self
.
fixed_dispatch_mode
(
group_id
,
truck_id
)
else
:
self
.
logger
.
info
(
"动态调度模式"
)
self
.
dynamic_dispatch_mode
(
dispatch_seq
,
group_id
,
record
,
truck_info
.
get_sate
(),
truck_info
.
get_task
(),
truck_id
)
# except Exception as es:
# self.logger.error("调度结果写入异常")
# self.logger.error(f"调度结果:{dispatch_seq}")
# 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
):
"""
"""
...
@@ -158,37 +174,42 @@ class DispatchSubmission:
...
@@ -158,37 +174,42 @@ class DispatchSubmission:
:param truck_id:
:param truck_id:
:return:
:return:
"""
"""
if
(
task
in
[
1
,
2
])
or
(
task
==
3
and
state
==
2
):
# 卡车空载或在装载区出场前, 可变更卸载目的地
if
(
task
in
[
1
,
2
])
or
(
task
==
3
and
state
==
2
):
# 车辆位于卸载区,或车辆重载等待
self
.
logger
.
info
(
f
'调度1 {truck_id}'
)
# 查询车辆相关派车计划
try
:
dump_id
=
DispatchInfo
.
unload_area_dump_dict
[
dispatch_seq
[
1
]]
item
=
(
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
dump_id
=
dump_id
,
group_id
=
group_id
,
isdeleted
=
0
,
)
.
first
())
if
item
is
None
:
self
.
logger
.
info
(
f
'卸载区内或重载等待,请求装载区 {truck_id}'
)
raise
Exception
(
"调度计划配置异常"
)
if
dispatch_seq
[
0
]
is
None
:
raise
Exception
(
"调度计划表与实时监控不匹配"
)
except
Exception
as
es
:
# 查询车辆相关派车计划 dispatch_seq[next_excavator_id, next_unload_area_id]
if
dispatch_seq
[
1
]
is
None
or
[
dispatch_seq
[
1
]]
not
in
DispatchInfo
.
unload_area_dump_dict
:
# 无法查询到目标卸载点
item
=
(
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
group_id
=
group_id
,
isdeleted
=
0
,
)
.
first
())
item
=
(
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
group_id
=
group_id
,
isdeleted
=
0
,
)
.
first
())
self
.
logger
.
error
(
es
)
else
:
dump_id
=
DispatchInfo
.
unload_area_dump_dict
[
dispatch_seq
[
1
]]
try
:
item
=
(
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
dump_id
=
dump_id
,
group_id
=
group_id
,
isdeleted
=
0
,
)
.
first
())
if
item
is
None
:
raise
Exception
(
f
'{truck_id} 无法找到派车计划 {dump_id} {group_id}'
)
if
dispatch_seq
[
0
]
is
None
:
raise
Exception
(
"调度计划挖机与实时监控不匹配"
)
except
Exception
as
es
:
item
=
(
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
group_id
=
group_id
,
isdeleted
=
0
,
)
.
first
())
self
.
logger
.
error
(
es
)
# 其余调度信息写入
# 其余调度信息写入
try
:
try
:
# record["dispatchId"] = item.id
record
[
"dispatchId"
]
=
str
(
uuid
.
uuid1
())
redis_format
(
truck_id
,
group_id
,
str
(
uuid
.
uuid1
()),
item
)
record
[
"exactorId"
]
=
item
.
exactor_id
# # record["dispatchId"] = item.id
record
[
"loadAreaId"
]
=
item
.
load_area_id
# record["dispatchId"] = str(uuid.uuid1())
record
[
"dumpId"
]
=
item
.
dump_id
# record["exactorId"] = item.exactor_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
# record["loadAreaId"] = item.load_area_id
record
[
"groupId"
]
=
group_id
# record["dumpId"] = item.dump_id
record
[
"isdeleted"
]
=
False
# record["unloadAreaId"] = item.unload_area_id
# record["isTemp"] = False
# record["groupId"] = group_id
record
[
"haulFlag"
]
=
-
1
# record["isdeleted"] = False
record
[
"groupName"
]
=
DispatchInfo
.
group_name
[
group_id
]
# # record["isTemp"] = False
# record["haulFlag"] = -1
# record["groupName"] = DispatchInfo.group_name[group_id]
if
task
==
3
and
state
==
2
and
self
.
truck
.
get_truck_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
if
task
==
3
and
state
==
2
and
self
.
truck
.
get_truck_locate_dict
()[
truck_id
]
in
self
.
topo
.
cross_bf_lanes
:
# try:
# try:
...
@@ -301,27 +322,18 @@ class DispatchSubmission:
...
@@ -301,27 +322,18 @@ class DispatchSubmission:
# 调度信息写入
# 调度信息写入
try
:
# try:
# record["dispatchId"] = item.id
record
[
"dispatchId"
]
=
str
(
uuid
.
uuid1
())
record
[
"exactorId"
]
=
item
.
exactor_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"groupId"
]
=
group_id
record
[
"isdeleted"
]
=
False
record
[
"isTemp"
]
=
False
record
[
"haulFlag"
]
=
-
1
record
[
"groupName"
]
=
DispatchInfo
.
group_name
[
group_id
]
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
))
)
record
=
redis_format
(
truck_id
,
group_id
,
str
(
uuid
.
uuid1
()),
item
)
except
Exception
as
es
:
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
self
.
logger
.
error
(
"调度结果写入异常-矿卡故障或备停区-redis写入异常"
)
self
.
logger
.
error
(
es
)
# except Exception as es:
finally
:
# self.logger.error("调度结果写入异常-矿卡故障或备停区-redis写入异常")
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
# self.logger.error(es)
# finally:
# redis5.set(truck_id, str(json.dumps(record)))
except
Exception
as
es
:
except
Exception
as
es
:
self
.
logger
.
error
(
"调度结果写入异常-矿卡故障或备停区"
)
self
.
logger
.
error
(
"调度结果写入异常-矿卡故障或备停区"
)
...
@@ -329,7 +341,7 @@ class DispatchSubmission:
...
@@ -329,7 +341,7 @@ class DispatchSubmission:
else
:
else
:
pass
pass
def
fixed_dispatch_mode
(
self
,
group_id
,
record
,
truck_id
):
def
fixed_dispatch_mode
(
self
,
group_id
,
truck_id
):
"""
"""
write dispatch plan in fixed dispatch method.
write dispatch plan in fixed dispatch method.
:param group_id:
:param group_id:
...
@@ -338,27 +350,20 @@ class DispatchSubmission:
...
@@ -338,27 +350,20 @@ class DispatchSubmission:
:return:
:return:
"""
"""
try
:
try
:
self
.
logger
.
info
(
f
'调度0 {truck_id}'
)
item
=
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
truck_id
=
truck_id
,
isdeleted
=
0
,
)
.
first
()
item
=
session_mysql
.
query
(
DispatchSetting
)
.
filter_by
(
truck_id
=
truck_id
,
isdeleted
=
0
,
)
.
first
()
record
[
"dispatchId"
]
=
item
.
id
record
[
"exactorId"
]
=
item
.
exactor_id
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"groupId"
]
=
item
.
group_id
record
[
"isdeleted"
]
=
False
record
[
"isTemp"
]
=
False
record
[
"haulFlag"
]
=
-
1
record
[
"groupName"
]
=
DispatchInfo
.
group_name
[
group_id
]
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
except
Exception
as
es
:
except
Exception
as
es
:
item
=
None
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
session_postgre
.
rollback
()
session_postgre
.
rollback
()
session_mysql
.
rollback
()
session_mysql
.
rollback
()
finally
:
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
if
item
is
None
:
self
.
logger
.
error
(
f
'车辆 {truck_id} 无派车计划-无法执行固定派车'
)
return
record
=
redis_format
(
truck_id
,
group_id
,
item
.
id
,
item
)
redis5
.
set
(
truck_id
,
str
(
json
.
dumps
(
record
)))
self
.
logger
.
info
(
f
'redis 注入 {record}'
)
def
group_dispatch_to_redis
(
self
,
group
:
Group
,
dispatch_plan_dict
):
def
group_dispatch_to_redis
(
self
,
group
:
Group
,
dispatch_plan_dict
):
"""
"""
...
@@ -368,18 +373,18 @@ class DispatchSubmission:
...
@@ -368,18 +373,18 @@ class DispatchSubmission:
:return: None
:return: None
"""
"""
self
.
logger
.
info
(
f
'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}'
)
self
.
logger
.
info
(
f
'组内车辆 {group.truck_set}'
)
self
.
logger
.
info
(
f
'组内挖机 {group.excavator}'
)
self
.
logger
.
info
(
f
'组内卸点 {group.dump}'
)
self
.
logger
.
info
(
f
'调度模式 {group.group_mode}'
)
self
.
logger
.
info
(
"dispatch_plan_dict"
)
self
.
logger
.
info
(
"dispatch_plan_dict"
)
self
.
logger
.
info
(
dispatch_plan_dict
)
self
.
logger
.
info
(
dispatch_plan_dict
)
for
truck_id
,
dispatch_plan
in
dispatch_plan_dict
.
items
():
for
truck_id
,
dispatch_plan
in
dispatch_plan_dict
.
items
():
try
:
try
:
self
.
logger
.
info
(
f
'======================================= 调度车辆 ======================================='
)
self
.
logger
.
info
(
f
'======================================= 调度车辆 ======================================='
)
self
.
logger
.
info
(
f
'矿车编号 {get_value("truck_uuid_to_name_dict")[truck_id]} {truck_id}'
)
self
.
truck_dispatch_to_redis
(
truck_id
,
group
.
truck_info_list
[
truck_id
],
dispatch_plan
,
group
.
group_mode
)
self
.
logger
.
info
(
f
'调度模式 {group.group_mode}'
)
self
.
logger
.
info
(
f
'车辆任务 {group.truck_info_list[truck_id].get_task()}'
)
self
.
logger
.
info
(
f
'配对挖机 {dispatch_plan[0]}'
)
self
.
logger
.
info
(
f
'配对卸点 {dispatch_plan[1]}'
)
self
.
truck_dispatch_to_redis
(
truck_id
,
dispatch_plan
)
self
.
logger
.
info
(
"======================================== 完成写入 ======================================="
)
self
.
logger
.
info
(
"======================================== 完成写入 ======================================="
)
except
Exception
as
es
:
except
Exception
as
es
:
self
.
logger
.
error
(
"group_dispatch_to_redis_error"
)
self
.
logger
.
error
(
"group_dispatch_to_redis_error"
)
...
...
core/group.py
View file @
39eaec24
...
@@ -31,11 +31,12 @@ class CurrentTruck:
...
@@ -31,11 +31,12 @@ class CurrentTruck:
"""
"""
def
__init__
(
self
,
truck_id
,
group_id
,
trip
,
task
):
def
__init__
(
self
,
truck_id
,
group_id
,
trip
,
task
,
state
):
self
.
_truck_id
=
truck_id
self
.
_truck_id
=
truck_id
self
.
_group_id
=
group_id
self
.
_group_id
=
group_id
self
.
_trip
=
trip
self
.
_trip
=
trip
self
.
_task
=
task
self
.
_task
=
task
self
.
_state
=
state
def
get_truck_id
(
self
):
def
get_truck_id
(
self
):
return
self
.
_truck_id
return
self
.
_truck_id
...
@@ -49,6 +50,9 @@ class CurrentTruck:
...
@@ -49,6 +50,9 @@ class CurrentTruck:
def
get_group_id
(
self
):
def
get_group_id
(
self
):
return
self
.
_group_id
return
self
.
_group_id
def
get_sate
(
self
):
return
self
.
_state
class
Group
:
class
Group
:
"""
"""
...
@@ -237,7 +241,7 @@ class Group:
...
@@ -237,7 +241,7 @@ class Group:
self
.
update_group_road_network
()
self
.
update_group_road_network
()
self
.
update_device_material
()
self
.
update_device_material
()
def
group_dispatch
(
self
,
Solver
)
->
Mapping
[
str
,
List
[
str
,
str
]]:
def
group_dispatch
(
self
,
Solver
)
->
Mapping
[
str
,
List
[
str
]]:
"""
"""
Receive a Alg obj. and output dispatch plan for trucks in this group.
Receive a Alg obj. and output dispatch plan for trucks in this group.
:param Solver:
:param Solver:
...
@@ -257,15 +261,18 @@ class Group:
...
@@ -257,15 +261,18 @@ class Group:
self
.
logger
.
info
(
f
'调度车辆 {truck_id}'
)
self
.
logger
.
info
(
f
'调度车辆 {truck_id}'
)
# try:
# try:
# get truck index from mapping
try
:
try
:
if
truck_id
not
in
self
.
truck
.
truck_uuid_to_index_dict
:
if
truck_id
not
in
self
.
truck
.
truck_uuid_to_index_dict
:
raise
CoreException
(
102
,
f
'truck.truck dict 中不存在 {truck_id}'
)
raise
CoreException
(
102
,
f
'truck.truck dict 中不存在 {truck_id}'
)
truck_idx
=
self
.
truck
.
truck_uuid_to_index_dict
[
truck_id
]
truck_idx
=
self
.
truck
.
truck_uuid_to_index_dict
[
truck_id
]
except
CoreException
as
es
:
except
CoreException
as
es
:
es
.
with_traceback_info
()
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
continue
continue
# get truck trip from truck obj.
try
:
try
:
truck_trip_info_list
=
self
.
truck
.
get_truck_current_trip
()
truck_trip_info_list
=
self
.
truck
.
get_truck_current_trip
()
...
@@ -274,10 +281,11 @@ class Group:
...
@@ -274,10 +281,11 @@ class Group:
truck_trip
=
self
.
truck
.
get_truck_current_trip
()[
truck_idx
]
truck_trip
=
self
.
truck
.
get_truck_current_trip
()[
truck_idx
]
except
CoreException
as
es
:
except
CoreException
as
es
:
es
.
with_traceback_info
()
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
continue
continue
# TODO: 怎么知道异常行数
# get truck task from truck obj.
try
:
try
:
truck_task_list
=
self
.
truck
.
get_truck_current_task
()
truck_task_list
=
self
.
truck
.
get_truck_current_task
()
...
@@ -286,12 +294,15 @@ class Group:
...
@@ -286,12 +294,15 @@ class Group:
truck_task
=
truck_task_list
[
truck_id
]
truck_task
=
truck_task_list
[
truck_id
]
except
CoreException
as
ce
:
except
CoreException
as
es
:
self
.
logger
.
error
(
ce
)
es
.
with_traceback_info
()
self
.
logger
.
error
(
es
)
continue
continue
# Construct a truck obj.
# Construct a truck obj.
truck_info
=
CurrentTruck
(
truck_id
,
self
.
group_id
,
truck_trip
,
truck_task
)
truck_info
=
CurrentTruck
(
truck_id
,
self
.
group_id
,
truck_trip
,
truck_task
,
self
.
truck
.
get_truck_current_state
()[
truck_id
])
self
.
truck_info_list
[
truck_id
]
=
truck_info
self
.
truck_info_list
[
truck_id
]
=
truck_info
# Construct a test case for redispatch
# Construct a test case for redispatch
...
@@ -407,12 +418,19 @@ class Group:
...
@@ -407,12 +418,19 @@ class Group:
self
.
logger
.
error
(
"空载车辆空车智能模式-计算异常"
)
self
.
logger
.
error
(
"空载车辆空车智能模式-计算异常"
)
self
.
logger
.
error
(
es
)
self
.
logger
.
error
(
es
)
def
full_dynamic_mode
(
self
,
i
:
str
,
s
:
AlgorithmBase
,
truck_dispatch
:
Mapping
[
str
,
List
[
str
,
str
]],
def
full_dynamic_mode
(
self
,
i
:
str
,
s
:
AlgorithmBase
,
truck_dispatch
:
Mapping
[
str
,
List
[
str
]],
truck_info
:
CurrentTruck
,
truck_task
:
int
,
truck_trip
:
List
[
int
,
int
]):
truck_info
:
CurrentTruck
,
truck_task
:
int
,
truck_trip
:
List
[
int
]):
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
if
truck_task
in
[
-
2
,
4
,
5
]:
if
truck_task
in
[
-
2
,
4
,
5
]:
try
:
try
:
if
i
in
self
.
truck
.
truck_excavator_bind
:
if
i
in
self
.
truck
.
truck_excavator_bind
:
try
:
if
i
not
in
self
.
truck
.
truck_excavator_bind
:
raise
CoreException
(
102
,
f
'truck.excavator bind 中不存在 {i}'
)
except
CoreException
as
es
:
es
.
with_traceback_info
()
self
.
logger
.
error
(
es
)
return
next_excavator_id
=
self
.
truck
.
truck_excavator_bind
[
i
]
next_excavator_id
=
self
.
truck
.
truck_excavator_bind
[
i
]
else
:
else
:
next_excavator_value
=
s
.
solve
(
truck_info
)
next_excavator_value
=
s
.
solve
(
truck_info
)
...
@@ -527,8 +545,7 @@ class Group:
...
@@ -527,8 +545,7 @@ class Group:
next_lane_list
=
get_cross_next_lanes
(
truck_locate
)
next_lane_list
=
get_cross_next_lanes
(
truck_locate
)
# 交叉口下一路段可达的装载区
# 交叉口下一路段可达的装载区
next_lane_load_area_dict
=
get_lane_reach_load_areas
(
load_area_lane_dict
,
next_lane_load_area_dict
=
get_lane_reach_load_areas
(
load_area_lane_dict
,
next_lane_list
)
next_lane_list
)
# 排除下一个路段阻塞的装载区
# 排除下一个路段阻塞的装载区
delete_congestion_load_area
(
congestion_lane_dict
,
load_area_dict
,
delete_congestion_load_area
(
congestion_lane_dict
,
load_area_dict
,
...
...
data/dispatchInfo.py
View file @
39eaec24
...
@@ -479,12 +479,15 @@ class DispatchInfo:
...
@@ -479,12 +479,15 @@ class DispatchInfo:
return
cls
.
unload_area_uuid_to_index_dict
[
group_id
]
return
cls
.
unload_area_uuid_to_index_dict
[
group_id
]
@classmethod
@classmethod
def
get_all_group
(
cls
):
def
get_all_group
s_id
(
cls
):
return
set
(
cls
.
group_excavator_dict
.
keys
())
return
set
(
cls
.
group_excavator_dict
.
keys
())
@classmethod
@classmethod
def
get_group_mode
(
cls
,
group_id
):
def
get_group_mode
(
cls
,
group_id
):
return
cls
.
group_mode
[
group_id
]
if
group_id
in
cls
.
group_mode
:
return
cls
.
group_mode
[
group_id
]
else
:
return
None
@classmethod
@classmethod
def
get_excavator
(
cls
,
group_id
):
def
get_excavator
(
cls
,
group_id
):
...
...
data/para_config.py
View file @
39eaec24
...
@@ -445,6 +445,7 @@ def global_period_para_update():
...
@@ -445,6 +445,7 @@ def global_period_para_update():
unload_area_index_to_uuid_dict
,
unload_area_index_to_uuid_dict
,
)
=
build_work_area_uuid_index_map
()
)
=
build_work_area_uuid_index_map
()
load_area_num
,
unload_area_num
=
len
(
load_area_uuid_to_index_dict
),
len
(
load_area_num
,
unload_area_num
=
len
(
load_area_uuid_to_index_dict
),
len
(
unload_area_uuid_to_index_dict
unload_area_uuid_to_index_dict
)
)
...
...
realtime_dispatch_test.py
View file @
39eaec24
...
@@ -63,8 +63,6 @@ def process(dispatcher):
...
@@ -63,8 +63,6 @@ def process(dispatcher):
# 更新周期参数
# 更新周期参数
logger
.
info
(
"#####################################周期更新开始#####################################"
)
logger
.
info
(
"#####################################周期更新开始#####################################"
)
global_period_para_update
()
# 清空数据库缓存
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
commit
()
session_mysql
.
flush
()
session_mysql
.
flush
()
...
@@ -73,6 +71,7 @@ def process(dispatcher):
...
@@ -73,6 +71,7 @@ def process(dispatcher):
session_postgre
.
commit
()
session_postgre
.
commit
()
session_postgre
.
flush
()
session_postgre
.
flush
()
# 更新全局参数信息
global_period_para_update
()
global_period_para_update
()
# 更新调度信息
# 更新调度信息
...
@@ -86,6 +85,7 @@ def process(dispatcher):
...
@@ -86,6 +85,7 @@ def process(dispatcher):
DispatchInfo
.
update_group_name
()
DispatchInfo
.
update_group_name
()
# 打印日志信息
logger
.
info
(
"Dispatchinfo,更新后信息"
)
logger
.
info
(
"Dispatchinfo,更新后信息"
)
logger
.
info
(
"group_set"
)
logger
.
info
(
"group_set"
)
logger
.
info
(
DispatchInfo
.
group_set
)
logger
.
info
(
DispatchInfo
.
group_set
)
...
@@ -110,13 +110,12 @@ def process(dispatcher):
...
@@ -110,13 +110,12 @@ def process(dispatcher):
# logger.info(DispatchInfo.dump_group_dict)
# logger.info(DispatchInfo.dump_group_dict)
# logger.info(DispatchInfo.truck_group_dict)
# logger.info(DispatchInfo.truck_group_dict)
# 调度生成
# 调度生成
dispatcher
.
period_update
()
dispatcher
.
period_update
()
dispatcher
.
group_generate
()
dispatcher
.
group_generate
()
dispatcher
.
group_info_update
()
#
dispatcher.group_info_update()
dispatcher
.
group_dispatch
()
dispatcher
.
group_dispatch
()
...
...
settings.py
View file @
39eaec24
...
@@ -67,8 +67,8 @@ def set_log():
...
@@ -67,8 +67,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"
...
...
test/test4.py
0 → 100644
View file @
39eaec24
# import sys
# print(sys.path)
# %%
def
prime
(
p
):
for
i
in
range
(
3
,
p
+
1
):
is_prime
=
True
for
j
in
range
(
2
,
i
):
if
i
%
j
==
0
:
is_prime
=
False
break
if
is_prime
:
print
(
i
)
prime
(
10
)
\ No newline at end of file
test/text.ipynb
0 → 100644
View file @
39eaec24
{
"cells": [
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true,
"pycharm": {
"is_executing": false
}
},
"outputs": [
{
"name": "stdout",
"text": [
"[-1.33, 122.22, 12.345]\n",
"230\n"
],
"output_type": "stream"
}
],
"source": [
"L = [-1.33, 122.22, 12.345]\n",
"\n",
"for i in L:\n",
" i = round(i, 2)\n",
"\n",
"print(L)\n",
"\n",
"def myfun(a, b, c):\n",
" return a * b + c\n",
"\n",
"x, y, z = 10, 20, 30\n",
"res = myfun(x, y, z)\n",
"print(res)\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 12,
"outputs": [
{
"name": "stdout",
"text": [
"3\n",
"5\n",
"7\n"
],
"output_type": "stream"
}
],
"source": [
"def prime(p):\n",
" for i in range(3, p + 1):\n",
" # is_prime = True\n",
" for j in range(2, i):\n",
" if i % j == 0:\n",
" is_prime = False\n",
" break\n",
" # if is_prime:\n",
" print(i)\n",
" \n",
"prime(10)"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n",
"is_executing": false
}
}
}
],
"metadata": {
"kernelspec": {
"name": "pycharm-acbff253",
"language": "python",
"display_name": "PyCharm (integrated-scheduling-v3)"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.6"
},
"pycharm": {
"stem_cell": {
"cell_type": "raw",
"source": [],
"metadata": {
"collapsed": false
}
}
}
},
"nbformat": 4,
"nbformat_minor": 0
}
\ No newline at end of file
topo_sql.py
→
t
est/t
opo_sql.py
View file @
39eaec24
File moved
topo_test.ipynb
→
t
est/t
opo_test.ipynb
View file @
39eaec24
...
@@ -13,14 +13,28 @@
...
@@ -13,14 +13,28 @@
},
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count":
55
,
"execution_count":
4
,
"metadata": {
"metadata": {
"pycharm": {
"pycharm": {
"is_executing": false,
"is_executing": false,
"name": "#%%\n"
"name": "#%%\n"
}
}
},
},
"outputs": [],
"outputs": [
{
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_28476\\3885974955.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mgraph\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtopo_graph\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnetworkx\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnx\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mmatplotlib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpyplot\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0muuid\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0msqlite3\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mE:\\Pycharm Projects\\Waytous\\integrated-scheduling-v4.0\\integrated-scheduling-v3.1\\graph\\topo_graph.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# from para_config import *\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0msettings\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0msched\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtime\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mE:\\Pycharm Projects\\Waytous\\integrated-scheduling-v4.0\\integrated-scheduling-v3.1\\settings.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[0mjson_file\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;34m\"config.json\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 23\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 24\u001b[1;33m \u001b[1;32mwith\u001b[0m \u001b[0mopen\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mjson_file\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mf\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 25\u001b[0m \u001b[0mpara_config\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mjson\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mload\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mf\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m\"para\"\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'config.json'"
],
"ename": "FileNotFoundError",
"evalue": "[Errno 2] No such file or directory: 'config.json'",
"output_type": "error"
}
],
"source": [
"source": [
"from graph.topo_graph import *\n",
"from graph.topo_graph import *\n",
"import networkx as nx\n",
"import networkx as nx\n",
...
@@ -38,7 +52,7 @@
...
@@ -38,7 +52,7 @@
},
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count":
61
,
"execution_count":
2
,
"metadata": {
"metadata": {
"pycharm": {
"pycharm": {
"is_executing": false,
"is_executing": false,
...
@@ -47,11 +61,15 @@
...
@@ -47,11 +61,15 @@
},
},
"outputs": [
"outputs": [
{
{
"name": "stdout",
"traceback": [
"text": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"数据库打开成功\n"
"\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m~\\AppData\\Local\\Temp\\ipykernel_28476\\1331772586.py\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mconn\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0msqlite3\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'test.db'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mc\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mconn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcursor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m\"数据库打开成功\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mNameError\u001b[0m: name 'sqlite3' is not defined"
],
],
"output_type": "stream"
"ename": "NameError",
"evalue": "name 'sqlite3' is not defined",
"output_type": "error"
}
}
],
],
"source": [
"source": [
...
@@ -73,7 +91,7 @@
...
@@ -73,7 +91,7 @@
},
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count":
70
,
"execution_count":
null
,
"metadata": {
"metadata": {
"pycharm": {
"pycharm": {
"is_executing": false,
"is_executing": false,
...
@@ -862,6 +880,35 @@
...
@@ -862,6 +880,35 @@
"is_executing": false
"is_executing": false
}
}
}
}
},
{
"cell_type": "code",
"execution_count": 7,
"outputs": [
{
"name": "stdout",
"text": [
"positive\n"
],
"output_type": "stream"
}
],
"source": [
"num = 10\n",
"if num > 0:\n",
" print(\"positive\")\n",
"elif num == 0:\n",
" print(\"zero\")\n",
"else:\n",
" print(\"negative\")"
],
"metadata": {
"collapsed": false,
"pycharm": {
"name": "#%%\n",
"is_executing": false
}
}
}
}
],
],
"metadata": {
"metadata": {
...
...
util/core_exception.py
View file @
39eaec24
...
@@ -6,19 +6,39 @@
...
@@ -6,19 +6,39 @@
# @File : core_exception.py
# @File : core_exception.py
# @Software: PyCharm
# @Software: PyCharm
import
traceback
code_msg
=
{
101
:
"调度失败"
,
code_msg
=
{
101
:
"调度失败"
,
102
:
"车辆不存在或信息缺失"
,
102
:
"车辆不存在或信息缺失"
,
103
:
"数组越界异常"
}
103
:
"数组越界异常"
,
104
:
"数组维度不一致"
,
105
:
"数组越界"
,
106
:
"挖机不存在或信息缺失"
}
class
CoreException
(
Exception
):
class
CoreException
(
Exception
):
""" class for my exception."""
""" class for my exception."""
def
__init__
(
self
,
Code
=
None
,
ErrorInfo
=
None
):
def
__init__
(
self
,
Code
:
int
=
None
,
ErrorInfo
:
str
=
None
):
super
()
.
__init__
(
self
,
ErrorInfo
)
super
()
.
__init__
(
self
,
ErrorInfo
)
self
.
error_info
=
ErrorInfo
self
.
__
error_info
=
ErrorInfo
self
.
code
=
Code
self
.
code
=
Code
self
.
__traceback
=
""
def
__str__
(
self
):
def
__str__
(
self
)
->
str
:
return
'{0:}-{1:}'
.
format
(
code_msg
[
self
.
code
],
self
.
error_info
)
return
'{0:}-{1:}
\n
{2:}'
.
format
(
code_msg
[
self
.
code
],
self
.
__error_info
,
self
.
__traceback
)
# def with_traceback(self, tb) -> BaseException:
# self.__traceback = tb
# return self
def
with_traceback_info
(
self
):
self
.
__traceback
=
traceback
.
format_exc
()
# try:
# raise CoreException(101, "CoreException")
# except CoreException as ce:
# ce.with_traceback_info()
# # print(traceback.format_exc())
# print(ce)
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