Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
I
integrated-scheduling
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
张晓彤
integrated-scheduling
Commits
d950f451
Commit
d950f451
authored
Oct 09, 2021
by
Allvey
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修复矿卡禁止BUG
parent
bf5cad37
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
621 additions
and
575 deletions
+621
-575
dump.py
equipment/dump.py
+15
-8
excavator.py
equipment/excavator.py
+2
-1
truck.py
equipment/truck.py
+32
-31
para_config.py
para_config.py
+63
-29
path_plannner.py
path_plan/path_plannner.py
+16
-9
realtime_dispatch.py
realtime_dispatch.py
+467
-299
settings.py
settings.py
+1
-1
traffic_flow_info.py
traffic_flow/traffic_flow_info.py
+11
-189
traffic_flow_planner.py
traffic_flow/traffic_flow_planner.py
+14
-8
No files found.
equipment/dump.py
View file @
d950f451
...
...
@@ -9,6 +9,7 @@
from
para_config
import
*
from
settings
import
*
# 卸载设备类
class
DumpInfo
(
WalkManage
):
def
__init__
(
self
):
...
...
@@ -96,7 +97,7 @@ class DumpInfo(WalkManage):
for
query
in
(
session_mysql
.
query
(
WorkRecord
)
.
filter
(
WorkRecord
.
equipment_id
==
dump_id
,
WorkRecord
.
work_day
>
now
WorkRecord
.
equipment_id
==
dump_id
,
WorkRecord
.
work_day
>
=
now
)
.
first
()
):
...
...
@@ -115,17 +116,23 @@ class DumpInfo(WalkManage):
def
update_dump_material
(
self
):
self
.
dump_material
=
{}
for
dump_id
in
dynamic_dump_set
:
unload_area_id
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
dump_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
()
.
unload_area_id
dump_material_id
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
.
Material
self
.
dump_material
[
dump_id
]
=
dump_material_id
try
:
unload_area_id
=
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
dump_id
,
isauto
=
1
,
isdeleted
=
0
)
.
first
()
.
unload_area_id
dump_material_id
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
.
Material
self
.
dump_material
[
dump_id
]
=
dump_material_id
except
Exception
as
es
:
logger
.
error
(
"无动态派车计划可用"
)
def
update_dump_priority
(
self
):
self
.
dump_priority_coefficient
=
np
.
ones
(
self
.
dynamic_dump_num
)
for
dump_id
in
dynamic_dump_set
:
unload_area_index
=
self
.
dump_index_to_unload_area_index_dict
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
unload_area_id
=
unload_area_index_to_uuid_dict
[
unload_area_index
]
item
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
self
.
dump_priority_coefficient
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
+=
item
.
Priority
try
:
unload_area_index
=
self
.
dump_index_to_unload_area_index_dict
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
unload_area_id
=
unload_area_index_to_uuid_dict
[
unload_area_index
]
item
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
self
.
dump_priority_coefficient
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
+=
item
.
Priority
except
Exception
as
es
:
logger
.
error
(
"无动态派车计划可用"
)
def
para_period_update
(
self
):
...
...
equipment/excavator.py
View file @
d950f451
...
...
@@ -9,6 +9,7 @@
from
para_config
import
*
from
settings
import
*
# 挖机设备类
class
ExcavatorInfo
(
WalkManage
):
def
__init__
(
self
):
...
...
@@ -90,7 +91,7 @@ class ExcavatorInfo(WalkManage):
session_mysql
.
query
(
WorkRecord
)
.
filter
(
WorkRecord
.
equipment_id
==
excavator_id
,
WorkRecord
.
work_day
>
now
,
WorkRecord
.
work_day
>
=
now
,
)
.
first
()
):
...
...
equipment/truck.py
View file @
d950f451
...
...
@@ -7,10 +7,13 @@
# @Software: PyCharm
from
para_config
import
*
from
settings
import
*
from
equipment.dump
import
DumpInfo
from
equipment.excavator
import
ExcavatorInfo
# 引入对象
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
# 矿卡设备类
class
TruckInfo
(
WalkManage
):
...
...
@@ -18,13 +21,13 @@ class TruckInfo(WalkManage):
# object fileds
# self.walker = WalkManage()
# 矿卡数量
self
.
dynamic_truck_num
=
len
(
dynamic_truck_set
)
self
.
dynamic_truck_num
=
get_value
(
"dynamic_truck_num"
)
# 用于动态派车的矿卡集合
self
.
dynamic_truck_set
=
get_value
(
"dynamic_truck_set"
)
# 矿卡抵达卸载设备时间
self
.
cur_truck_reach_dump
=
np
.
zeros
(
self
.
dynamic_truck_num
)
# 矿卡抵达挖机时间
self
.
cur_truck_reach_excavator
=
np
.
zeros
(
self
.
dynamic_truck_num
)
# 用于动态派车的矿卡集合
self
.
dynamic_truck_set
=
[]
# 矿卡最后装载/卸载时间
self
.
last_load_time
=
{}
self
.
last_unload_time
=
{}
...
...
@@ -56,21 +59,18 @@ class TruckInfo(WalkManage):
# 矿卡卸点排斥关系
self
.
truck_dump_exclude
=
{}
# 排斥关系modify
self
.
excavator_exclude_modify
=
np
.
full
((
dynamic_truck_num
,
dynamic_excavator_num
),
0
)
self
.
excavator_exclude_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
get_value
(
"dynamic_excavator_num"
)
),
0
)
# 矿卡优先级
self
.
truck_priority
=
np
.
ones
(
self
.
dynamic_truck_num
)
# 矿卡绑定物料
self
.
truck_material_bind
=
{}
# 矿卡绑定物料modify
self
.
dump_material_bind_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
dynamic_
excavator
_num
),
0
)
self
.
dump_material_bind_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
dynamic_
dump
_num
),
0
)
self
.
excavator_material_bind_modify
=
np
.
zeros
(
self
.
dynamic_truck_num
)
# 引入对象
self
.
dump
=
DumpInfo
()
self
.
excavator
=
ExcavatorInfo
()
# 初始化读取映射及路网
self
.
period_map_para_load
()
self
.
period_walk_para_load
()
# 初始化读取参数
self
.
para_period_update
()
def
get_truck_current_trip
(
self
):
...
...
@@ -363,7 +363,7 @@ class TruckInfo(WalkManage):
self
.
truck_excavator_exclude
=
{}
self
.
excavator_exclude_modify
=
np
.
full
(
(
dynamic_truck_num
,
dynamic_excavator_num
),
0
(
self
.
dynamic_truck_num
,
dynamic_excavator_num
),
0
)
try
:
...
...
@@ -393,15 +393,15 @@ class TruckInfo(WalkManage):
def
update_truck_material
(
self
):
self
.
excavator
.
update_excavator_material
()
self
.
dump
.
update_dump_material
()
excavator
.
update_excavator_material
()
dump
.
update_dump_material
()
self
.
truck_material_bind
=
{}
self
.
update_truck_excavator_bind
()
self
.
update_truck_dump_area_bind
()
self
.
excavator_material_bind_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
dynamic_excavator_num
),
0
)
self
.
dump_material_bind_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
dynamic_
excavator
_num
),
0
)
self
.
dump_material_bind_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
dynamic_
dump
_num
),
0
)
for
truck_id
in
dynamic_truck_set
:
...
...
@@ -415,7 +415,7 @@ class TruckInfo(WalkManage):
if
truck_id
in
self
.
truck_excavator_bind
:
excavator_id
=
self
.
truck_excavator_bind
[
truck_id
]
# print(self.excavator.excavator_material)
excavator_material_id
=
self
.
excavator
.
excavator_material
[
excavator_id
]
excavator_material_id
=
excavator
.
excavator_material
[
excavator_id
]
self
.
truck_material_bind
[
truck_id
]
=
excavator_material_id
...
...
@@ -428,14 +428,14 @@ class TruckInfo(WalkManage):
material
=
self
.
truck_material_bind
[
truck_id
]
for
excavator_id
in
dynamic_excavator_set
:
excavator_material_id
=
self
.
excavator
.
excavator_material
[
excavator_id
]
excavator_index
=
self
.
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
excavator_material_id
=
excavator
.
excavator_material
[
excavator_id
]
excavator_index
=
excavator
.
excavator_uuid_to_index_dict
[
excavator_id
]
if
excavator_material_id
!=
material
:
self
.
excavator_material_bind_modify
[
truck_index
][
excavator_index
]
=
1000000
for
dump_id
in
dynamic_dump_set
:
dump_material_id
=
self
.
dump
.
dump_material
[
dump_id
]
dump_index
=
self
.
dump
.
dump_uuid_to_index_dict
[
dump_id
]
dump_material_id
=
dump
.
dump_material
[
dump_id
]
dump_index
=
dump
.
dump_uuid_to_index_dict
[
dump_id
]
if
dump_material_id
!=
material
:
self
.
dump_material_bind_modify
[
truck_index
][
dump_index
]
=
1000000
...
...
@@ -460,6 +460,10 @@ class TruckInfo(WalkManage):
filter
(
Equipment
.
id
==
truck_id
)
.
first
()
.
max_speed
def
reset
(
self
):
# 更新矿卡数量
self
.
dynamic_truck_num
=
get_value
(
"dynamic_truck_num"
)
# 更新矿卡集合
self
.
dynamic_truck_set
=
get_value
(
"dynamic_truck_set"
)
# 矿卡挖机绑定关系
self
.
truck_excavator_bind
=
{}
# 矿卡卸点绑定关系
...
...
@@ -469,7 +473,7 @@ class TruckInfo(WalkManage):
# 矿卡卸点排斥关系
self
.
truck_dump_exclude
=
{}
# 排斥关系modify
self
.
excavator_exclude_modify
=
np
.
full
((
dynamic_truck_num
,
dynamic_excavator_num
),
0
)
self
.
excavator_exclude_modify
=
np
.
full
((
self
.
dynamic_truck_num
,
get_value
(
"dynamic_excavator_num"
)
),
0
)
# 矿卡优先级
self
.
truck_priority
=
np
.
ones
(
self
.
dynamic_truck_num
)
# 矿卡绑定物料
...
...
@@ -496,17 +500,14 @@ class TruckInfo(WalkManage):
self
.
period_walk_para_load
()
# 更新全部矿卡设备集合
truck_set
=
set
(
update_total_truck
())
# 更新固定派车矿卡集合
fixed_truck_set
=
set
(
update_fixdisp_truck
())
# 更新动态派车矿卡集合
self
.
dynamic_truck_set
=
truck_set
.
difference
(
fixed_truck_set
)
# 更新矿卡数量
self
.
dynamic_truck_num
=
len
(
self
.
dynamic_truck_set
)
# # 更新全部矿卡设备集合
# truck_set = set(update_total_truck())
#
# # 更新固定派车矿卡集合
# fixed_truck_set = set(update_fixdisp_truck())
#
# # 更新动态派车矿卡集合
# self.dynamic_truck_set = truck_set.difference(fixed_truck_set)
# 更新有效载重
self
.
update_truck_payload
()
...
...
para_config.py
View file @
d950f451
...
...
@@ -37,6 +37,11 @@ excavator_target_mass = 5000
# 任务集合
task_set
=
[
-
2
,
0
,
1
,
2
,
3
,
4
,
5
]
#
# truck = TruckInfo()
# excavator = ExcavatorInfo()
# dump = DumpInfo()
# Big integer
M
=
100000000
...
...
@@ -80,6 +85,18 @@ 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
# 设备映射类, 存储除工作区以外的映射关系
# 其余设备类继承该类
class
DeviceMap
:
...
...
@@ -292,35 +309,35 @@ class WalkManage(DeviceMap):
logger
.
error
(
"设备路网信息异常异常"
)
logger
.
error
(
es
)
#
try:
for
item
in
session_postgre
.
query
(
WalkTimePark
)
.
all
():
load_area
=
str
(
item
.
load_area_id
)
park_area
=
str
(
item
.
park_area_id
)
load_area_index
=
load_area_uuid_to_index_dict
[
load_area
]
park_index
=
park_uuid_to_index_dict
[
park_area
]
self
.
distance_park_to_load_area
[
park_index
][
load_area_index
]
=
float
(
item
.
park_load_distance
)
self
.
walk_time_park_to_load_area
[
park_index
][
load_area_index
]
=
float
(
60
/
1000
*
item
.
park_load_distance
/
empty_speed
)
#
except Exception as es:
#
logger.error("备停区路网信息异常")
#
logger.error(es)
#
try:
for
i
in
range
(
park_num
):
for
j
in
range
(
dynamic_excavator_num
):
self
.
distance_park_to_excavator
[
i
][
j
]
=
self
.
distance_park_to_load_area
[
i
][
self
.
excavator_index_to_load_area_index_dict
[
j
]]
self
.
walk_time_park_to_excavator
[
i
][
j
]
=
self
.
walk_time_park_to_load_area
[
i
][
self
.
excavator_index_to_load_area_index_dict
[
j
]
]
#
except Exception as es:
#
logger.error("备停区设备路网信息异常")
#
logger.error(es)
try
:
for
item
in
session_postgre
.
query
(
WalkTimePark
)
.
all
():
load_area
=
str
(
item
.
load_area_id
)
park_area
=
str
(
item
.
park_area_id
)
load_area_index
=
load_area_uuid_to_index_dict
[
load_area
]
park_index
=
park_uuid_to_index_dict
[
park_area
]
self
.
distance_park_to_load_area
[
park_index
][
load_area_index
]
=
float
(
item
.
park_load_distance
)
self
.
walk_time_park_to_load_area
[
park_index
][
load_area_index
]
=
float
(
60
/
1000
*
item
.
park_load_distance
/
empty_speed
)
except
Exception
as
es
:
logger
.
error
(
"备停区路网信息异常"
)
logger
.
error
(
es
)
try
:
for
i
in
range
(
park_num
):
for
j
in
range
(
dynamic_excavator_num
):
self
.
distance_park_to_excavator
[
i
][
j
]
=
self
.
distance_park_to_load_area
[
i
][
self
.
excavator_index_to_load_area_index_dict
[
j
]]
self
.
walk_time_park_to_excavator
[
i
][
j
]
=
self
.
walk_time_park_to_load_area
[
i
][
self
.
excavator_index_to_load_area_index_dict
[
j
]
]
except
Exception
as
es
:
logger
.
error
(
"备停区设备路网信息异常"
)
logger
.
error
(
es
)
def
period_walk_para_load
(
self
):
# 装载路网信息
...
...
@@ -357,6 +374,11 @@ def period_para_update():
global
park_uuid_to_index_dict
,
park_index_to_uuid_dict
global
truck_uuid_to_name_dict
,
truck_name_to_uuid_dict
global
dynamic_truck_num
,
dynamic_excavator_num
,
dynamic_dump_num
# 清空数据库缓存
session_mysql
.
commit
()
session_mysql
.
flush
()
# 装载区、卸载区、备停区在调度算法运行器件默认不发生改变,提前计算部分参量
# (uuid,index(id)映射关系, 装载区数量, 卸载区数量, 备停区数量, 以及初次统计动态调度矿卡)
(
...
...
@@ -388,6 +410,7 @@ def period_para_update():
dynamic_truck_num
=
len
(
dynamic_truck_set
)
logger
.
info
(
"可用于动态派车的矿卡:"
)
logger
.
info
(
dynamic_truck_num
)
logger
.
info
(
dynamic_truck_set
)
# 用于动态调度的挖机及卸载设备
...
...
@@ -400,3 +423,14 @@ def period_para_update():
device_map
.
period_map_para_update
()
walk_manage
.
period_walk_para_update
()
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
def
get_value
(
name
):
return
global_dict
[
name
]
path_plan/path_plannner.py
View file @
d950f451
...
...
@@ -13,6 +13,10 @@ from tables import *
M
=
1000000
truck
=
TruckInfo
()
truck
.
update_truck_size
()
class
PathPlanner
(
WalkManage
):
def
__init__
(
self
):
# 路线行驶成本
...
...
@@ -20,9 +24,8 @@ class PathPlanner(WalkManage):
# 路段集合
self
.
lane_set
=
{}
# 车辆长度(暂)
self
.
truck
=
TruckInfo
()
self
.
truck
.
update_truck_size
()
self
.
truck_length
=
float
(
sum
(
self
.
truck
.
get_length
()
.
values
()))
/
len
(
self
.
truck
.
get_length
())
# self.truck_length = float(sum(truck.get_length().values())) / len(truck.get_length())
self
.
truck_length
=
3
# 装载区数量
self
.
num_of_load_area
=
len
(
set
(
update_load_area
()))
# 卸载区数量
...
...
@@ -167,15 +170,19 @@ class PathPlanner(WalkManage):
cost_to_dump
=
np
.
zeros_like
(
self
.
distance_to_dump
)
cost_park_to_excavator
=
np
.
zeros_like
(
self
.
distance_park_to_excavator
)
# 路网权重
walk_weight
,
park_walk_weight
=
weighted_walk_cost
()
try
:
# 路网权重
walk_weight
,
park_walk_weight
=
weighted_walk_cost
()
# 路网禁用关系
walk_available
=
available_walk
()
# 路网禁用关系
walk_available
=
available_walk
()
print
(
"path_weight"
,
walk_weight
)
print
(
"path_weight"
,
walk_weight
)
print
(
"walk_avail"
,
walk_available
)
print
(
"walk_avail"
,
walk_available
)
except
Exception
as
es
:
logger
.
error
(
"无派车计划可用"
)
for
i
in
range
(
dynamic_dump_num
):
for
j
in
range
(
dynamic_excavator_num
):
...
...
realtime_dispatch.py
View file @
d950f451
...
...
@@ -15,36 +15,36 @@ from equipment.truck import TruckInfo
from
equipment.excavator
import
ExcavatorInfo
from
equipment.dump
import
DumpInfo
dump
=
DumpInfo
()
excavator
=
ExcavatorInfo
()
truck
=
TruckInfo
()
# 调度类
class
Dispatcher
(
WalkManage
):
def
__init__
(
self
):
# object fields
self
.
dump
=
DumpInfo
()
self
.
excavator
=
ExcavatorInfo
()
self
.
truck
=
TruckInfo
()
# self.walker = WalkManage()
# 模拟挖机/卸载设备产量(防止调度修改真实产量)
self
.
sim_dump_real_mass
=
np
.
zeros
(
self
.
dump
.
get_dump_num
())
self
.
sim_excavator_real_mass
=
np
.
zeros
(
self
.
excavator
.
get_excavator_num
())
self
.
sim_dump_real_mass
=
np
.
zeros
(
dump
.
get_dump_num
())
self
.
sim_excavator_real_mass
=
np
.
zeros
(
excavator
.
get_excavator_num
())
# 真实设备可用时间
self
.
cur_truck_reach_dump
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
cur_truck_reach_excavator
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
cur_excavator_ava_time
=
np
.
zeros
(
self
.
excavator
.
get_excavator_num
())
self
.
cur_dump_ava_time
=
np
.
zeros
(
self
.
dump
.
get_dump_num
())
self
.
cur_truck_reach_dump
=
np
.
zeros
(
truck
.
get_truck_num
())
self
.
cur_truck_reach_excavator
=
np
.
zeros
(
truck
.
get_truck_num
())
self
.
cur_excavator_ava_time
=
np
.
zeros
(
excavator
.
get_excavator_num
())
self
.
cur_dump_ava_time
=
np
.
zeros
(
dump
.
get_dump_num
())
# 卡车完成装载及卸载时间(矿卡可用时间)
self
.
cur_truck_ava_time
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
cur_truck_ava_time
=
np
.
zeros
(
truck
.
get_truck_num
())
# 模拟矿卡可用时间
self
.
sim_truck_ava_time
=
np
.
zeros
(
self
.
truck
.
get_truck_num
())
self
.
sim_truck_ava_time
=
np
.
zeros
(
truck
.
get_truck_num
())
# 模拟各设备可用时间(防止调度修改真实产量)
self
.
sim_excavator_ava_time
=
np
.
zeros
(
self
.
excavator
.
get_excavator_num
())
self
.
sim_dump_ava_time
=
np
.
zeros
(
self
.
dump
.
get_dump_num
())
self
.
sim_excavator_ava_time
=
np
.
zeros
(
excavator
.
get_excavator_num
())
self
.
sim_dump_ava_time
=
np
.
zeros
(
dump
.
get_dump_num
())
# 挖机/卸载设备预计产量(包含正在驶往挖机/卸载设备那部分矿卡的载重)
self
.
pre_dump_real_mass
=
np
.
zeros
(
self
.
dump
.
get_dump_num
())
self
.
pre_excavator_real_mass
=
np
.
zeros
(
self
.
excavator
.
get_excavator_num
())
self
.
pre_dump_real_mass
=
np
.
zeros
(
dump
.
get_dump_num
())
self
.
pre_excavator_real_mass
=
np
.
zeros
(
excavator
.
get_excavator_num
())
# 维护一个矿卡调度表
self
.
Seq
=
[[]
for
_
in
range
(
self
.
truck
.
get_truck_num
())]
self
.
Seq
=
[[]
for
_
in
range
(
truck
.
get_truck_num
())]
# 调度开始时间
self
.
start_time
=
datetime
.
now
()
# self.relative_now_time = datetime.now() - self.start_time
...
...
@@ -52,29 +52,29 @@ class Dispatcher(WalkManage):
# 下面是交通流调度部分
# 驶往挖机的实际车流
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
self
.
dump
.
get_dump_num
(),
self
.
excavator
.
get_excavator_num
())
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
self
.
dump
.
get_dump_num
(),
self
.
excavator
.
get_excavator_num
())
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往挖机的实际车次
self
.
goto_dump_truck_num
=
np
.
zeros
(
(
self
.
dump
.
get_dump_num
(),
self
.
excavator
.
get_excavator_num
())
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车次
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
self
.
dump
.
get_dump_num
(),
self
.
excavator
.
get_excavator_num
())
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往挖机的理想车流
self
.
opt_goto_dump_traffic_flow
=
np
.
zeros
(
(
self
.
dump
.
get_dump_num
(),
self
.
excavator
.
get_excavator_num
())
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
opt_goto_excavator_traffic_flow
=
np
.
zeros
(
(
self
.
dump
.
get_dump_num
(),
self
.
excavator
.
get_excavator_num
())
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
self
.
path
=
PathPlanner
()
...
...
@@ -82,22 +82,22 @@ class Dispatcher(WalkManage):
# 更新矿卡预计抵达目的地时间
def
update_truck_reach_time
(
self
):
try
:
dynamic_excavator_num
=
self
.
excavator
.
get_excavator_num
()
dumps
=
self
.
dump
.
get_dump_num
()
trucks
=
self
.
truck
.
get_truck_num
()
dynamic_excavator_num
=
excavator
.
get_excavator_num
()
dumps
=
dump
.
get_dump_num
()
trucks
=
truck
.
get_truck_num
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
truck_current_task
=
truck
.
get_truck_current_task
()
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
truck_current_trip
=
truck
.
get_truck_current_trip
()
cur_truck_reach_excavator
=
self
.
truck
.
get_truck_reach_excavator
()
cur_truck_reach_excavator
=
truck
.
get_truck_reach_excavator
()
cur_truck_reach_dump
=
self
.
truck
.
get_truck_reach_dump
()
cur_truck_reach_dump
=
truck
.
get_truck_reach_dump
()
excavator_ava_ls
=
[[]
for
_
in
range
(
dynamic_excavator_num
)]
dump_ava_ls
=
[[]
for
_
in
range
(
dumps
)]
for
i
in
range
(
trucks
):
task
=
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
truck_current_trip
[
i
][
1
]
if
task
in
[
0
,
1
]:
reach_time
=
cur_truck_reach_excavator
[
i
]
...
...
@@ -112,7 +112,7 @@ class Dispatcher(WalkManage):
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
# print(
self.
truck_index_to_uuid_dict)
# print(truck_index_to_uuid_dict)
# print(excavator_ava_ls)
# print(dump_ava_ls)
except
Exception
as
es
:
...
...
@@ -131,9 +131,9 @@ class Dispatcher(WalkManage):
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
),
)
loading_time
=
self
.
excavator
.
get_loading_time
()
loading_time
=
excavator
.
get_loading_time
()
loading_task_time
=
self
.
excavator
.
get_loading_task_time
()
loading_task_time
=
excavator
.
get_loading_task_time
()
try
:
...
...
@@ -154,7 +154,7 @@ class Dispatcher(WalkManage):
)
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])
]
=
self
.
cur_excavator_ava_time
[
excavator_index
]
]
=
self
.
cur_excavator_ava_time
[
excavator_index
]
# # 若挖机可用时间严重偏离,进行修正
# if abs(self.cur_excavator_ava_time[excavator_index] - now) > 60:
...
...
@@ -168,7 +168,7 @@ class Dispatcher(WalkManage):
# 更新卸载设备预计可用时间
def
update_dump_ava_time
(
self
,
dump_ava_ls
):
dynamic_dump_num
=
self
.
dump
.
get_dump_num
()
dynamic_dump_num
=
dump
.
get_dump_num
()
# 初始化卸载设备可用时间
self
.
cur_dump_ava_time
=
np
.
full
(
...
...
@@ -177,9 +177,9 @@ class Dispatcher(WalkManage):
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
),
)
unloading_time
=
self
.
dump
.
get_unloading_time
()
unloading_time
=
dump
.
get_unloading_time
()
unloading_task_time
=
self
.
dump
.
get_unloading_task_time
()
unloading_task_time
=
dump
.
get_unloading_task_time
()
try
:
...
...
@@ -214,16 +214,16 @@ class Dispatcher(WalkManage):
# 更新实际交通流
def
update_actual_traffic_flow
(
self
):
loading_task_time
=
self
.
excavator
.
get_loading_task_time
()
loading_task_time
=
excavator
.
get_loading_task_time
()
unloading_task_time
=
self
.
dump
.
get_unloading_task_time
()
unloading_task_time
=
dump
.
get_unloading_task_time
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
payload
=
self
.
truck
.
get_payload
()
truck_current_task
=
truck
.
get_truck_current_task
()
truck_current_trip
=
truck
.
get_truck_current_trip
()
payload
=
truck
.
get_payload
()
dynamic_dump_num
=
self
.
dump
.
get_dump_num
()
dynamic_excavator_num
=
self
.
excavator
.
get_excavator_num
()
dynamic_dump_num
=
dump
.
get_dump_num
()
dynamic_excavator_num
=
excavator
.
get_excavator_num
()
self
.
goto_dump_truck_num
=
np
.
zeros
((
dynamic_excavator_num
,
dynamic_dump_num
))
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
...
...
@@ -237,37 +237,82 @@ class Dispatcher(WalkManage):
)
try
:
for
i
in
range
(
dynamic_truck_num
):
task
=
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
truck_current_trip
[
i
][
1
]
start_area_index
=
truck_current_trip
[
i
][
0
]
# 若矿卡正常行驶,需要将该部分载重计入实时产量
#
# logger.info("debug1")
# logger.info("end_area")
# logger.info(end_area_index)
# logger.info("start_area")
# logger.info(start_area_index)
if
task
in
heavy_task_set
:
self
.
goto_dump_truck_num
[
end_area_index
][
start_area_index
]
=
(
self
.
goto_dump_truck_num
[
end_area_index
][
start_area_index
]
+
1
)
self
.
actual_goto_dump_traffic_flow
[
end_area_index
][
start_area_index
]
=
self
.
actual_goto_dump_traffic_flow
[
end_area_index
][
start_area_index
]
+
float
(
payload
[
i
]
)
self
.
goto_dump_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_dump_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
# logger.info("debug2")
if
task
in
empty_task_set
:
self
.
goto_excavator_truck_num
[
start_area_index
][
end_area_index
]
=
(
self
.
goto_excavator_truck_num
[
start_area_index
][
end_area_index
]
+
1
)
self
.
actual_goto_excavator_traffic_flow
[
start_area_index
][
end_area_index
]
=
self
.
actual_goto_excavator_traffic_flow
[
start_area_index
][
end_area_index
]
+
float
(
payload
[
i
]
)
self
.
goto_excavator_truck_num
[
start_area_index
][
end_area_index
]
+=
1
self
.
actual_goto_excavator_traffic_flow
[
start_area_index
][
end_area_index
]
+=
float
(
payload
[
i
])
# logger.info("debug1")
# 若矿卡正常行驶,需要将该部分载重计入实时产量
# if task in heavy_task_set:
# logger.info("更新不及时debug")
# logger.info("end_area")
# logger.info(end_area_index)
# logger.info("start_area")
# logger.info(start_area_index)
#
# self.goto_dump_truck_num[end_area_index][start_area_index] = (
# self.goto_dump_truck_num[end_area_index][start_area_index] + 1
# )
# self.actual_goto_dump_traffic_flow[end_area_index][
# start_area_index
# ] = self.actual_goto_dump_traffic_flow[end_area_index][
# start_area_index
# ] + float(
# payload[i]
# )
# logger.info("debug2")
# if task in empty_task_set:
# self.goto_excavator_truck_num[start_area_index][end_area_index] = (
# self.goto_excavator_truck_num[start_area_index][end_area_index]
# + 1
# )
# self.actual_goto_excavator_traffic_flow[start_area_index][
# end_area_index
# ] = self.actual_goto_excavator_traffic_flow[start_area_index][
# end_area_index
# ] + float(
# payload[i]
# )
#
# print(np.expand_dims(unloading_time,axis=0).repeat(dynamic_excavator_num, axis=0))
# logger.info("self.goto_dump_truck_num")
# logger.info(self.goto_dump_truck_num)
#
# logger.info("self.actual_goto_dump_traffic_flow")
# logger.info(self.actual_goto_dump_traffic_flow)
#
# logger.info("self.goto_excavator_truck_num")
# logger.info(self.goto_excavator_truck_num)
#
# logger.info("self.actual_goto_excavator_traffic_flow")
# logger.info(self.actual_goto_excavator_traffic_flow)
self
.
actual_goto_dump_traffic_flow
=
self
.
actual_goto_dump_traffic_flow
/
(
self
.
distance_to_dump
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
...
...
@@ -277,6 +322,32 @@ class Dispatcher(WalkManage):
)
)
self
.
actual_goto_excavator_traffic_flow
=
(
self
.
actual_goto_excavator_traffic_flow
/
(
self
.
distance_to_excavator
.
reshape
(
dynamic_dump_num
,
dynamic_excavator_num
)
/
(
1000
*
heavy_speed
)
+
np
.
expand_dims
(
loading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_dump_num
,
axis
=
0
)
)
)
logger
.
info
(
"self.goto_dump_truck_num"
)
logger
.
info
(
self
.
goto_dump_truck_num
)
logger
.
info
(
"self.actual_goto_dump_traffic_flow"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
"self.goto_excavator_truck_num"
)
logger
.
info
(
self
.
goto_excavator_truck_num
)
logger
.
info
(
"self.actual_goto_excavator_traffic_flow"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
except
Exception
as
es
:
logger
.
error
(
"更新不及时"
)
logger
.
error
(
es
)
...
...
@@ -299,19 +370,21 @@ class Dispatcher(WalkManage):
)
logger
.
info
(
"驶往卸点实际车流"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
self
.
actual_goto_excavator_traffic_flow
=
(
self
.
actual_goto_excavator_traffic_flow
/
(
self
.
distance_to_excavator
.
reshape
(
dynamic_excavator_num
,
dynamic_dump_num
)
/
(
1000
*
heavy_speed
)
+
np
.
expand_dims
(
loading_task_time
,
axis
=
0
)
.
repeat
(
dynamic_dump_num
,
axis
=
0
)
)
)
logger
.
info
(
"________________loading_task_time__________"
)
logger
.
info
(
loading_task_time
)
# self.actual_goto_excavator_traffic_flow = (
# self.actual_goto_excavator_traffic_flow
# / (
# self.distance_to_excavator.reshape(
# dynamic_dump_num, dynamic_excavator_num
# )
# / (1000 * heavy_speed)
# + np.expand_dims(loading_task_time, axis=0).repeat(
# dynamic_dump_num, axis=0
# )
# )
# )
# print("驶往挖机实际载重")
# print(self.actual_goto_excavator_traffic_flow)
...
...
@@ -344,34 +417,39 @@ class Dispatcher(WalkManage):
self
.
period_walk_para_load
()
# 更新卸载设备对象
self
.
dump
.
para_period_update
()
dump
.
para_period_update
()
# 更新挖机对象
self
.
excavator
.
para_period_update
()
excavator
.
para_period_update
()
# 更新矿卡对象
self
.
truck
.
para_period_update
()
truck
.
para_period_update
()
def
state_period_update
(
self
):
try
:
truck
.
state_period_update
()
self
.
truck
.
state_period_update
()
# 更新实时车流
self
.
update_actual_traffic_flow
()
# 更新实时
车流
self
.
update_actual_traffic_flow
()
# 计算理想
车流
(
self
.
opt_goto_dump_traffic_flow
,
self
.
opt_goto_excavator_traffic_flow
,)
=
traffic_flow_plan
()
# 计算理想车流
(
self
.
opt_goto_dump_traffic_flow
,
self
.
opt_goto_excavator_traffic_flow
,)
=
traffic_flow_plan
()
# 矿卡抵达时间
excavator_reach_list
,
dump_reach_list
=
self
.
update_truck_reach_time
()
# 矿卡抵达
时间
excavator_reach_list
,
dump_reach_list
=
self
.
update_truck_reach_time
(
)
# 挖机可用
时间
self
.
update_excavator_ava_time
(
excavator_reach_list
)
# 挖机
可用时间
self
.
update_excavator_ava_time
(
excavator
_reach_list
)
# 卸载设备
可用时间
self
.
update_dump_ava_time
(
dump
_reach_list
)
# 卸载设备可用时间
self
.
update_dump_ava_time
(
dump_reach_list
)
self
.
cost_to_excavator
,
self
.
cost_to_dump
,
self
.
cost_park_to_excavator
=
self
.
path
.
walk_cost
()
self
.
cost_to_excavator
,
self
.
cost_to_dump
,
self
.
cost_park_to_excavator
=
self
.
path
.
walk_cost
()
except
Exception
as
es
:
logger
.
error
(
"周期更新异常"
)
logger
.
error
(
es
)
def
sim_para_reset
(
self
):
...
...
@@ -381,6 +459,59 @@ class Dispatcher(WalkManage):
self
.
sim_excavator_ava_time
=
copy
.
deepcopy
(
self
.
cur_excavator_ava_time
)
self
.
sim_dump_ava_time
=
copy
.
deepcopy
(
self
.
cur_dump_ava_time
)
def
reset
(
self
):
# 模拟挖机/卸载设备产量(防止调度修改真实产量)
self
.
sim_dump_real_mass
=
np
.
zeros
(
dump
.
get_dump_num
())
self
.
sim_excavator_real_mass
=
np
.
zeros
(
excavator
.
get_excavator_num
())
# 真实设备可用时间
self
.
cur_truck_reach_dump
=
np
.
zeros
(
truck
.
get_truck_num
())
self
.
cur_truck_reach_excavator
=
np
.
zeros
(
truck
.
get_truck_num
())
self
.
cur_excavator_ava_time
=
np
.
zeros
(
excavator
.
get_excavator_num
())
self
.
cur_dump_ava_time
=
np
.
zeros
(
dump
.
get_dump_num
())
# 卡车完成装载及卸载时间(矿卡可用时间)
print
(
"here1"
)
print
(
truck
.
get_truck_num
())
self
.
cur_truck_ava_time
=
np
.
zeros
(
truck
.
get_truck_num
())
# 模拟矿卡可用时间
self
.
sim_truck_ava_time
=
np
.
zeros
(
truck
.
get_truck_num
())
# 模拟各设备可用时间(防止调度修改真实产量)
self
.
sim_excavator_ava_time
=
np
.
zeros
(
excavator
.
get_excavator_num
())
self
.
sim_dump_ava_time
=
np
.
zeros
(
dump
.
get_dump_num
())
# 挖机/卸载设备预计产量(包含正在驶往挖机/卸载设备那部分矿卡的载重)
self
.
pre_dump_real_mass
=
np
.
zeros
(
dump
.
get_dump_num
())
self
.
pre_excavator_real_mass
=
np
.
zeros
(
excavator
.
get_excavator_num
())
# 维护一个矿卡调度表
self
.
Seq
=
[[]
for
_
in
range
(
truck
.
get_truck_num
())]
# 下面是交通流调度部分
# 驶往挖机的实际车流
self
.
actual_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
actual_goto_dump_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往挖机的实际车次
self
.
goto_dump_truck_num
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车次
self
.
goto_excavator_truck_num
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往挖机的理想车流
self
.
opt_goto_dump_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
# 驶往卸载设备的实际车流
self
.
opt_goto_excavator_traffic_flow
=
np
.
zeros
(
(
dump
.
get_dump_num
(),
excavator
.
get_excavator_num
())
)
def
truck_schedule
(
self
,
truck_id
):
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
.
disabled
...
...
@@ -388,24 +519,24 @@ class Dispatcher(WalkManage):
# cost_to_excavator, cost_to_dump, cost_park_to_excavator = self.path.walk_cost()
excavator_priority_coefficient
=
self
.
excavator
.
excavator_priority_coefficient
excavator_priority_coefficient
=
excavator
.
excavator_priority_coefficient
excavator_material_priority
=
self
.
excavator
.
excavator_material_priority
excavator_material_priority
=
excavator
.
excavator_material_priority
# 矿卡对应序号
truck_index
=
self
.
truck_uuid_to_index_dict
[
truck_id
]
truck_index
=
truck
.
truck_uuid_to_index_dict
[
truck_id
]
# 矿卡行程
trip
=
self
.
truck
.
get_truck_current_trip
()[
truck_index
]
trip
=
truck
.
get_truck_current_trip
()[
truck_index
]
# 矿卡当前任务
task
=
self
.
truck
.
get_truck_current_task
()[
self
.
truck_index_to_uuid_dict
[
truck_index
]]
task
=
truck
.
get_truck_current_task
()[
truck
.
truck_index_to_uuid_dict
[
truck_index
]]
# 挖机装载时间
loading_time
=
self
.
excavator
.
get_loading_time
()
loading_time
=
excavator
.
get_loading_time
()
# 路网信息
walk_time_park_to_excavator
=
walk_manage
.
get_walk_time_park_to_excavator
()
\
*
(
empty_speed
/
float
(
self
.
truck
.
empty_speed
[
truck_id
]))
*
(
empty_speed
/
float
(
truck
.
empty_speed
[
truck_id
]))
dynamic_dump_num
=
self
.
dump
.
get_dump_num
()
dynamic_excavator_num
=
self
.
excavator
.
get_excavator_num
()
dynamic_dump_num
=
dump
.
get_dump_num
()
dynamic_excavator_num
=
excavator
.
get_excavator_num
()
now
=
float
(
(
datetime
.
now
()
-
self
.
start_time
)
...
...
@@ -420,13 +551,13 @@ class Dispatcher(WalkManage):
try
:
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
logger
.
info
(
"矿卡行程:无"
)
logger
.
info
(
f
"涉及挖机:{list(
self
.excavator_uuid_to_index_dict.keys())}"
)
logger
.
info
(
f
"涉及挖机:{list(
excavator
.excavator_uuid_to_index_dict.keys())}"
)
logger
.
info
(
f
"行程时间:{(np.maximum(self.sim_excavator_ava_time, now + walk_time_park_to_excavator[0, :]) + loading_time - now)}"
)
logger
.
info
(
f
"行驶时间:{walk_time_park_to_excavator[0, :] + loading_time}"
)
logger
.
info
(
"物料类型"
)
if
truck_id
in
self
.
truck
.
truck_material_bind
:
logger
.
info
(
self
.
truck
.
truck_material_bind
[
truck_id
])
if
truck_id
in
truck
.
truck_material_bind
:
logger
.
info
(
truck
.
truck_material_bind
[
truck_id
])
logger
.
info
(
"挖机物料优先级"
)
logger
.
info
(
excavator_material_priority
)
logger
.
info
(
"挖机设备优先级"
)
...
...
@@ -436,8 +567,8 @@ class Dispatcher(WalkManage):
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
logger
.
error
(
es
)
if
truck_id
in
self
.
truck
.
truck_excavator_bind
:
target
=
self
.
excavator_uuid_to_index_dict
[
self
.
truck
.
truck_excavator_bind
[
truck_id
]]
if
truck_id
in
truck
.
truck_excavator_bind
:
target
=
excavator
.
excavator_uuid_to_index_dict
[
truck
.
truck_excavator_bind
[
truck_id
]]
else
:
transport_value
=
self
.
cost_park_to_excavator
...
...
@@ -445,15 +576,15 @@ class Dispatcher(WalkManage):
logger
.
info
(
transport_value
)
target
=
np
.
argmin
(
transport_value
+
self
.
truck
.
excavator_exclude_modify
[
truck_index
]
+
self
.
truck
.
excavator_material_bind_modify
[
truck_index
])
+
truck
.
excavator_exclude_modify
[
truck_index
]
+
truck
.
excavator_material_bind_modify
[
truck_index
])
logger
.
info
(
f
"目的地:{
self
.excavator_index_to_uuid_dict[target]}"
)
logger
.
info
(
f
"目的地:{
excavator
.excavator_index_to_uuid_dict[target]}"
)
if
task
in
[
0
,
1
,
2
]:
try
:
logger
.
info
(
"矿卡状态:矿卡空载"
)
logger
.
info
(
f
"涉及卸载设备:{list(
self
.dump_uuid_to_index_dict.keys())}"
)
logger
.
info
(
f
"涉及卸载设备:{list(
dump
.dump_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
logger
.
error
(
es
)
...
...
@@ -477,9 +608,9 @@ class Dispatcher(WalkManage):
try
:
logger
.
info
(
"挖机id:"
)
logger
.
info
(
self
.
e
xcavator_uuid_to_index_dict
)
logger
.
info
(
excavator
.
xcavator_uuid_to_index_dict
)
logger
.
info
(
"卸点id:"
)
logger
.
info
(
self
.
dump_uuid_to_index_dict
)
logger
.
info
(
dump
.
dump_uuid_to_index_dict
)
logger
.
info
(
f
"卸载点实际车流:"
)
logger
.
info
(
self
.
actual_goto_dump_traffic_flow
)
logger
.
info
(
f
"卸载点理想车流:"
)
...
...
@@ -490,21 +621,24 @@ class Dispatcher(WalkManage):
logger
.
info
(
"卸载点理想车流"
)
logger
.
info
(
self
.
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:])
logger
.
info
(
"空载trip"
)
logger
.
info
(
trip
)
logger
.
info
(
"物料类型"
)
if
truck_id
in
self
.
truck
.
truck_material_bind
:
logger
.
info
(
self
.
truck
.
truck_material_bind
[
truck_id
])
if
truck_id
in
truck
.
truck_material_bind
:
logger
.
info
(
truck
.
truck_material_bind
[
truck_id
])
logger
.
info
(
"驶往卸点的运输成本"
)
logger
.
info
(
self
.
cost_to_dump
)
logger
.
info
(
"卸点物料修正"
)
logger
.
info
(
self
.
truck
.
dump_material_bind_modify
)
logger
.
info
(
truck
.
dump_material_bind_modify
)
except
Exception
as
es
:
logger
.
info
(
"车流及修正因子"
)
logger
.
info
(
es
)
if
truck_id
in
self
.
truck
.
truck_dump_bind
:
bind_unload_area_id
=
self
.
truck
.
truck_dump_bind
[
truck_id
]
for
key
,
value
in
self
.
dump_index_to_unload_area_index_dict
.
items
():
if
truck_id
in
truck
.
truck_dump_bind
:
bind_unload_area_id
=
truck
.
truck_dump_bind
[
truck_id
]
for
key
,
value
in
dump
.
dump_index_to_unload_area_index_dict
.
items
():
if
value
==
unload_area_uuid_to_index_dict
[
bind_unload_area_id
]:
target
=
key
break
...
...
@@ -516,32 +650,35 @@ class Dispatcher(WalkManage):
/
(
self
.
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
)
logger
.
info
(
"transport_value"
)
logger
.
info
(
transport_value
)
logger
.
info
(
"_____________here________"
)
logger
.
info
(
truck
.
dump_material_bind_modify
[
truck_index
])
target
=
np
.
argmin
(
transport_value
+
self
.
truck
.
dump_material_bind_modify
[
truck_index
])
+
truck
.
dump_material_bind_modify
[
truck_index
])
logger
.
info
(
"车流比:"
)
logger
.
info
((
self
.
actual_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
)
\
/
(
self
.
opt_goto_dump_traffic_flow
[
int
(
trip
[
1
]),
:]
+
0.001
))
logger
.
info
(
f
"目的地:{
self
.dump_index_to_uuid_dict[target]}"
)
logger
.
info
(
f
"目的地:{
dump
.dump_index_to_uuid_dict[target]}"
)
elif
task
in
[
3
,
4
,
5
]:
try
:
logger
.
info
(
"矿卡状态:矿卡重载"
)
logger
.
info
(
f
"涉及挖机设备:{list(
self
.excavator_uuid_to_index_dict.keys())}"
)
logger
.
info
(
f
"涉及挖机设备:{list(
excavator
.excavator_uuid_to_index_dict.keys())}"
)
except
Exception
as
es
:
logger
.
error
(
f
"矿卡{truck_id}状态不匹配"
)
logger
.
error
(
es
)
try
:
assert
np
.
array
(
self
.
actual_goto_excavator_traffic_flow
)
.
shape
==
(
dynamic_
excavator
_num
,
dynamic_
dump
_num
,)
dynamic_
dump
_num
,
dynamic_
excavator
_num
,)
assert
np
.
array
(
self
.
opt_goto_excavator_traffic_flow
)
.
shape
==
(
dynamic_excavator_num
,
dynamic_dump_num
,)
dynamic_dump_num
,
dynamic_excavator_num
,)
except
Exception
as
es
:
logger
.
warning
(
es
)
self
.
actual_goto_excavator_traffic_flow
=
np
.
array
(
...
...
@@ -554,52 +691,73 @@ class Dispatcher(WalkManage):
self
.
opt_goto_excavator_traffic_flow
=
np
.
array
(
self
.
opt_goto_excavator_traffic_flow
)
try
:
logger
.
info
(
"挖机id:"
)
logger
.
info
(
self
.
excavator_uuid_to_index_dict
)
logger
.
info
(
excavator
.
excavator_uuid_to_index_dict
)
logger
.
info
(
"卸点id:"
)
logger
.
info
(
self
.
dump_uuid_to_index_dict
)
logger
.
info
(
dump
.
dump_uuid_to_index_dict
)
logger
.
info
(
f
"挖机实际车流:"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
)
logger
.
info
(
f
"挖机理想车流:"
)
logger
.
info
(
self
.
opt_goto_excavator_traffic_flow
)
logger
.
info
(
"重载trip"
)
logger
.
info
(
trip
)
try
:
logger
.
info
(
"挖机实际车流_行"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:])
logger
.
info
(
"挖机理想车流_行"
)
logger
.
info
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:])
except
Exception
as
es
:
logger
.
info
(
"trip出错"
)
logger
.
info
(
trip
)
logger
.
info
(
es
)
logger
.
info
(
"挖机实际车流"
)
logger
.
info
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:])
logger
.
info
(
"挖机理想车流"
)
logger
.
info
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:])
logger
.
info
(
"物料类型"
)
if
truck_id
in
self
.
truck
.
truck_material_bind
:
logger
.
info
(
self
.
truck
.
truck_material_bind
[
truck_id
])
if
truck_id
in
truck
.
truck_material_bind
:
logger
.
info
(
truck
.
truck_material_bind
[
truck_id
])
logger
.
info
(
"驶往挖机的运输成本"
)
logger
.
info
(
self
.
cost_to_excavator
)
logger
.
info
(
"挖机物料修正"
)
logger
.
info
(
self
.
truck
.
excavator_material_bind_modify
)
logger
.
info
(
truck
.
excavator_material_bind_modify
)
logger
.
info
(
"挖机优先级修正"
)
logger
.
info
(
self
.
excavator
.
excavator_priority_coefficient
)
logger
.
info
(
excavator
.
excavator_priority_coefficient
)
except
Exception
as
es
:
logger
.
info
(
"车流及修正因子"
)
logger
.
info
(
es
)
if
truck_id
in
self
.
truck
.
truck_excavator_bind
:
target
=
self
.
excavator_uuid_to_index_dict
[
self
.
truck
.
truck_excavator_bind
[
truck_id
]]
else
:
if
rule3
and
rule4
:
transport_value
=
self
.
cost_to_excavator
[
int
(
trip
[
1
]),
:]
try
:
if
truck_id
in
truck
.
truck_excavator_bind
:
target
=
excavator
.
excavator_uuid_to_index_dict
[
truck
.
truck_excavator_bind
[
truck_id
]]
logger
.
info
(
"矿卡已绑定挖机"
)
else
:
transport_value
=
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
\
/
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
logger
.
info
(
"transport_value"
)
logger
.
info
(
transport_value
)
logger
.
info
(
"cost_to_excavator"
)
logger
.
info
(
self
.
cost_to_excavator
)
if
rule3
and
rule4
:
transport_value
=
self
.
cost_to_excavator
[
int
(
trip
[
1
]),
:]
else
:
transport_value
=
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
\
/
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
logger
.
info
(
"transport_value"
)
logger
.
info
(
transport_value
)
target
=
np
.
argmin
(
transport_value
+
truck
.
excavator_exclude_modify
[
truck_index
]
+
truck
.
excavator_material_bind_modify
[
truck_index
])
except
Exception
as
es
:
logger
.
info
(
"trip出错1"
)
logger
.
info
(
es
)
target
=
np
.
argmin
(
transport_value
+
self
.
truck
.
excavator_exclude_modify
[
truck_index
]
+
self
.
truck
.
excavator_material_bind_modify
[
truck_index
])
logger
.
info
(
"车流比:"
)
logger
.
info
(
try
:
logger
.
info
(
"车流比:"
)
logger
.
info
(
(
self
.
actual_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
)
/
(
self
.
opt_goto_excavator_traffic_flow
[
trip
[
1
],
:]
+
0.001
))
except
Exception
as
es
:
logger
.
info
(
"trip出错2"
)
logger
.
info
(
es
)
logger
.
info
(
f
"目的地:{
self
.excavator_index_to_uuid_dict[target]}"
)
logger
.
info
(
f
"目的地:{
excavator
.excavator_index_to_uuid_dict[target]}"
)
logger
.
info
(
"=========================================================="
)
...
...
@@ -607,154 +765,165 @@ class Dispatcher(WalkManage):
def
schedule_construct
(
self
):
# try:
# 读取所需信息
trucks
=
self
.
truck
.
get_truck_num
()
truck_current_trip
=
self
.
truck
.
get_truck_current_trip
()
truck_current_task
=
self
.
truck
.
get_truck_current_task
()
payload
=
self
.
truck
.
get_payload
()
unloading_time
=
self
.
dump
.
get_unloading_time
()
loading_time
=
self
.
excavator
.
get_loading_time
()
# 出入场时间
loading_task_time
=
self
.
excavator
.
get_loading_task_time
()
unloading_task_time
=
self
.
dump
.
get_unloading_task_time
()
walk_time_to_unload_area
=
walk_manage
.
get_walk_time_to_unload_area
()
walk_time_to_load_area
=
walk_manage
.
get_walk_time_to_load_area
()
global
truck
global
excavator
global
dump
# Seq初始化
Seq
=
[[
truck_current_trip
[
i
][
1
],
-
1
]
for
i
in
range
(
trucks
)]
self
.
reset
()
# 根据矿卡最早可用时间顺序进行规划
temp
=
copy
.
deepcopy
(
self
.
cur_truck_ava_time
)
-
self
.
truck
.
truck_priority
print
(
"here2"
,
self
.
cur_truck_ava_time
)
try
:
# 没有启动的矿卡加上一个很大的值,降低其优先级
for
i
in
range
(
trucks
):
task
=
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
if
task
==
-
2
:
temp
[
i
]
=
temp
[
i
]
+
M
except
Exception
as
es
:
logger
.
error
(
es
)
index
=
np
.
argsort
(
temp
.
reshape
(
1
,
-
1
))
index
=
index
.
flatten
()
# 对于在线矿卡已经赋予新的派车计划,更新其最早可用时间,及相关设备时间参数
for
truck
in
index
:
if
len
(
Seq
[
truck
])
>
0
:
# 读取所需信息
trucks
=
truck
.
get_truck_num
()
truck_current_trip
=
truck
.
get_truck_current_trip
()
truck_current_task
=
truck
.
get_truck_current_task
()
payload
=
truck
.
get_payload
()
unloading_time
=
dump
.
get_unloading_time
()
loading_time
=
excavator
.
get_loading_time
()
# try:
# 出入场时间
loading_task_time
=
excavator
.
get_loading_task_time
()
unloading_task_time
=
dump
.
get_unloading_task_time
()
task
=
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
truck
]]
walk_time_to_unload_area
=
walk_manage
.
get_walk_time_to_unload_area
()
walk_time_to_load_area
=
walk_manage
.
get_walk_time_to_load_area
()
# 矿卡结束当前派车计划后的目的地
end_eq_index
=
truck_current_trip
[
truck
][
1
]
# Seq初始化
Seq
=
[[
truck_current_trip
[
i
][
1
],
-
1
]
for
i
in
range
(
trucks
)
]
# 调用调度函数,得到最优目的地序号
target_eq_index
=
self
.
truck_schedule
(
self
.
truck_index_to_uuid_dict
[
truck
])
# 根据矿卡最早可用时间顺序进行规划
print
(
self
.
cur_truck_ava_time
)
print
(
truck
.
truck_priority
)
temp
=
copy
.
deepcopy
(
self
.
cur_truck_ava_time
)
-
truck
.
truck_priority
# 写入Seq序列
Seq
[
truck
][
1
]
=
target_eq_index
# except Exception as es:
# logger.error(f'矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 派车计划计算异常')
# logger.error(es)
try
:
# 没有启动的矿卡加上一个很大的值,降低其优先级
for
i
in
range
(
trucks
):
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
i
]]
if
task
==
-
2
:
temp
[
i
]
=
temp
[
i
]
+
M
except
Exception
as
es
:
logger
.
info
(
"矿卡排序启动异常"
)
logger
.
error
(
es
)
index
=
np
.
argsort
(
temp
.
reshape
(
1
,
-
1
))
index
=
index
.
flatten
()
# 对于在线矿卡已经赋予新的派车计划,更新其最早可用时间,及相关设备时间参数
for
truck_index
in
index
:
if
len
(
Seq
[
truck_index
])
>
0
:
# try:
task
=
truck_current_task
[
truck
.
truck_index_to_uuid_dict
[
truck_index
]]
# 矿卡结束当前派车计划后的目的地
end_eq_index
=
truck_current_trip
[
truck_index
][
1
]
# 调用调度函数,得到最优目的地序号
target_eq_index
=
self
.
truck_schedule
(
truck
.
truck_index_to_uuid_dict
[
truck_index
])
# 写入Seq序列
Seq
[
truck_index
][
1
]
=
target_eq_index
# except Exception as es:
# logger.error(f'矿卡 {truck_uuid_to_name_dict[truck_index_to_uuid_dict[truck]]} 派车计划计算异常')
# logger.error(es)
try
:
if
task
in
empty_task_set
:
target_area_index
=
dump
.
dump_index_to_unload_area_index_dict
[
target_eq_index
]
end_area_index
=
excavator
.
excavator_index_to_load_area_index_dict
[
end_eq_index
]
# 更新变量,预计产量更新
self
.
sim_dump_real_mass
[
target_eq_index
]
=
\
(
self
.
sim_dump_real_mass
[
target_eq_index
]
+
payload
[
truck_index
])
# 预计卸载设备可用时间更新
self
.
sim_dump_ava_time
[
target_eq_index
]
=
(
max
(
self
.
sim_dump_ava_time
[
target_eq_index
],
self
.
sim_truck_ava_time
[
truck_index
]
+
\
walk_time_to_unload_area
[
target_area_index
][
end_area_index
],)
+
unloading_task_time
[
target_eq_index
]
)
elif
task
in
heavy_task_set
:
target_area_index
=
(
excavator
.
excavator_index_to_load_area_index_dict
[
target_eq_index
])
end_area_index
=
dump
.
dump_index_to_unload_area_index_dict
[
end_eq_index
]
# 更新变量,预计产量更新
self
.
sim_excavator_real_mass
[
target_eq_index
]
=
(
self
.
sim_excavator_real_mass
[
target_eq_index
]
+
payload
[
truck_index
])
# 预计装载点可用时间更新
self
.
sim_excavator_ava_time
[
target_eq_index
]
=
(
max
(
self
.
sim_excavator_ava_time
[
target_eq_index
],
self
.
sim_truck_ava_time
[
truck_index
]
+
walk_time_to_unload_area
[
end_area_index
][
target_area_index
],)
\
+
loading_task_time
[
target_eq_index
])
else
:
pass
except
Exception
as
es
:
logger
.
error
(
f
"矿卡 {truck_uuid_to_name_dict[truck.truck_index_to_uuid_dict[truck_index]]} 调度状态更新异常"
)
logger
.
error
(
es
)
for
i
in
range
(
len
(
Seq
)):
try
:
record
=
{
"truckId"
:
truck
.
truck_index_to_uuid_dict
[
i
]}
task
=
truck
.
get_truck_current_task
()[
truck
.
truck_index_to_uuid_dict
[
i
]]
if
task
in
empty_task_set
:
target_area_index
=
self
.
dump_index_to_unload_area_index_dict
[
target_eq_index
]
end_area_index
=
self
.
excavator_index_to_load_area_index_dict
[
end_eq_index
]
# 更新变量,预计产量更新
self
.
sim_dump_real_mass
[
target_eq_index
]
=
\
(
self
.
sim_dump_real_mass
[
target_eq_index
]
+
payload
[
truck
])
# 预计卸载设备可用时间更新
self
.
sim_dump_ava_time
[
target_eq_index
]
=
(
max
(
self
.
sim_dump_ava_time
[
target_eq_index
],
self
.
sim_truck_ava_time
[
truck
]
+
\
walk_time_to_unload_area
[
target_area_index
][
end_area_index
],)
+
unloading_task_time
[
target_eq_index
]
)
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
dump
.
dump_index_to_uuid_dict
[
Seq
[
i
][
1
]],
isauto
=
1
,
isdeleted
=
0
,)
.
first
())
record
[
"exactorId"
]
=
item
.
exactor_id
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"dispatchId"
]
=
item
.
id
record
[
"isdeleted"
]
=
False
record
[
"creator"
]
=
item
.
creator
record
[
"createtime"
]
=
item
.
createtime
.
strftime
(
"
%
b
%
d,
%
Y
%#
I:
%#
M:
%#
S
%
p"
)
elif
task
in
heavy_task_set
:
target_area_index
=
(
self
.
excavator_index_to_load_area_index_dict
[
target_eq_index
])
end_area_index
=
self
.
dump_index_to_unload_area_index_dict
[
end_eq_index
]
# 更新变量,预计产量更新
self
.
sim_excavator_real_mass
[
target_eq_index
]
=
(
self
.
sim_excavator_real_mass
[
target_eq_index
]
+
payload
[
truck
])
# 预计装载点可用时间更新
self
.
sim_excavator_ava_time
[
target_eq_index
]
=
(
max
(
self
.
sim_excavator_ava_time
[
target_eq_index
],
self
.
sim_truck_ava_time
[
truck
]
+
walk_time_to_unload_area
[
end_area_index
][
target_area_index
],)
\
+
loading_task_time
[
target_eq_index
])
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
isauto
=
1
,
isdeleted
=
0
,)
.
first
())
record
[
"exactorId"
]
=
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]]
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"dispatchId"
]
=
item
.
id
record
[
"isdeleted"
]
=
False
record
[
"creator"
]
=
item
.
creator
record
[
"createtime"
]
=
item
.
createtime
.
strftime
(
"
%
b
%
d,
%
Y
%#
I:
%#
M:
%#
S
%
p"
)
elif
task
==
-
2
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
excavator
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
isauto
=
1
,
isdeleted
=
0
,)
.
first
())
record
[
"exactorId"
]
=
item
.
exactor_id
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"dispatchId"
]
=
item
.
id
record
[
"isdeleted"
]
=
False
record
[
"creator"
]
=
item
.
creator
record
[
"createtime"
]
=
item
.
createtime
.
strftime
(
"
%
b
%
d,
%
Y
%#
I:
%#
M:
%#
S
%
p"
)
else
:
pass
redis5
.
set
(
truck
.
truck_index_to_uuid_dict
[
i
],
str
(
json
.
dumps
(
record
)))
except
Exception
as
es
:
logger
.
error
(
f
"矿卡 {truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[truck]]} 调度状态更新异常"
)
logger
.
error
(
"调度结果写入异常-redis写入异常"
)
logger
.
error
(
f
"调度结果:{Seq}"
)
logger
.
error
(
es
)
for
i
in
range
(
len
(
Seq
)):
try
:
record
=
{
"truckId"
:
self
.
truck_index_to_uuid_dict
[
i
]}
task
=
self
.
truck
.
get_truck_current_task
()[
self
.
truck_index_to_uuid_dict
[
i
]]
if
task
in
empty_task_set
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
dump_id
=
self
.
dump_index_to_uuid_dict
[
Seq
[
i
][
1
]],
isauto
=
1
,
isdeleted
=
0
,)
.
first
())
record
[
"exactorId"
]
=
item
.
exactor_id
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"dispatchId"
]
=
item
.
id
record
[
"isdeleted"
]
=
False
record
[
"creator"
]
=
item
.
creator
record
[
"createtime"
]
=
item
.
createtime
.
strftime
(
"
%
b
%
d,
%
Y
%#
I:
%#
M:
%#
S
%
p"
)
elif
task
in
heavy_task_set
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
self
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
isauto
=
1
,
isdeleted
=
0
,)
.
first
())
record
[
"exactorId"
]
=
self
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]]
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"dispatchId"
]
=
item
.
id
record
[
"isdeleted"
]
=
False
record
[
"creator"
]
=
item
.
creator
record
[
"createtime"
]
=
item
.
createtime
.
strftime
(
"
%
b
%
d,
%
Y
%#
I:
%#
M:
%#
S
%
p"
)
elif
task
==
-
2
:
item
=
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
exactor_id
=
self
.
excavator_index_to_uuid_dict
[
Seq
[
i
][
1
]],
isauto
=
1
,
isdeleted
=
0
,)
.
first
())
record
[
"exactorId"
]
=
item
.
exactor_id
record
[
"dumpId"
]
=
item
.
dump_id
record
[
"loadAreaId"
]
=
item
.
load_area_id
record
[
"unloadAreaId"
]
=
item
.
unload_area_id
record
[
"dispatchId"
]
=
item
.
id
record
[
"isdeleted"
]
=
False
record
[
"creator"
]
=
item
.
creator
record
[
"createtime"
]
=
item
.
createtime
.
strftime
(
"
%
b
%
d,
%
Y
%#
I:
%#
M:
%#
S
%
p"
)
else
:
pass
redis5
.
set
(
self
.
truck_index_to_uuid_dict
[
i
],
str
(
json
.
dumps
(
record
)))
except
Exception
as
es
:
logger
.
error
(
"调度结果写入异常-redis写入异常"
)
logger
.
error
(
f
"调度结果:{Seq}"
)
logger
.
error
(
es
)
for
i
in
range
(
trucks
):
print
(
"dispatch_setting:"
)
print
(
redis5
.
get
(
self
.
truck_index_to_uuid_dict
[
i
]))
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
for
i
in
range
(
trucks
):
print
(
"dispatch_setting:"
)
print
(
redis5
.
get
(
truck
.
truck_index_to_uuid_dict
[
i
]))
except
Exception
as
es
:
logger
.
error
(
"更新不及时"
)
logger
.
error
(
es
)
logger
.
info
(
"#####################################周期更新结束#####################################"
)
...
...
@@ -763,6 +932,7 @@ class Dispatcher(WalkManage):
def
para_process
(
dispatcher
):
logger
.
info
(
"papa_process!"
)
# 清空数据库缓存
...
...
@@ -773,27 +943,15 @@ def para_process(dispatcher):
session_postgre
.
commit
()
session_postgre
.
flush
()
# 更新周期参数
period_para_update
()
# 周期更新
dispatcher
.
para_period_update
()
# # 参数重置
# dispatcher.sim_para_reset()
# try:
# 调度计算
# dispatcher.schedule_construct()
# except Exception as es:
# logger.error("更新不及时")
# logger.error(es)
def
state_process
(
dispatcher
):
#
print("state_process!")
print
(
"state_process!"
)
# 清空数据库缓存
session_mysql
.
commit
()
...
...
@@ -806,6 +964,8 @@ def state_process(dispatcher):
# 周期更新
dispatcher
.
state_period_update
()
# 参数重置
dispatcher
.
sim_para_reset
()
...
...
@@ -821,10 +981,19 @@ def state_process(dispatcher):
# 下面三个函数保证程序定期执行,不用管他
def
process
(
dispatcher
):
# try:
# 更新周期参数
period_para_update
()
# if dynamic_dump_num * dynamic_excavator_num == 0:
# raise Exception("无动态派车计划可用")
para_process
(
dispatcher
)
state_process
(
dispatcher
)
# except Exception as es:
# logger.warning(es)
# logger.warning("无动态派车计划可用")
scheduler
=
sched
.
scheduler
(
time
.
time
,
time
.
sleep
)
...
...
@@ -845,4 +1014,4 @@ if __name__ == "__main__":
dispatcher
=
Dispatcher
()
main
(
10
,
dispatcher
)
\ No newline at end of file
main
(
10
,
dispatcher
)
settings.py
View file @
d950f451
...
...
@@ -43,7 +43,7 @@ filehandler = logging.handlers.RotatingFileHandler(log_path + "/dispatch.log", m
# 设置后缀名称,跟strftime的格式一样
filehandler
.
suffix
=
"
%
Y-
%
m-
%
d_
%
H-
%
M.log"
formatter
=
logging
.
Formatter
(
"
%(asctime)
s -
%(name)
s:
%(levelname)
s
%(message)
s"
)
formatter
=
logging
.
Formatter
(
"
%(asctime)
s -
%(name)
s:
%(levelname)
s
%(
filename)
s
%(
message)
s"
)
filehandler
.
setFormatter
(
formatter
)
logger
.
addHandler
(
filehandler
)
...
...
traffic_flow/traffic_flow_info.py
View file @
d950f451
...
...
@@ -14,6 +14,10 @@ from equipment.excavator import ExcavatorInfo
from
equipment.dump
import
DumpInfo
from
equipment.truck
import
TruckInfo
truck
=
TruckInfo
()
excavator
=
ExcavatorInfo
()
dump
=
DumpInfo
()
# 车流规划类
class
Traffic_para
(
WalkManage
):
def
__init__
(
self
,
num_of_load_area
,
num_of_unload_area
,
num_of_excavator
,
num_of_dump
):
...
...
@@ -34,11 +38,10 @@ class Traffic_para(WalkManage):
self
.
walk_time_to_dump
=
np
.
zeros
((
num_of_excavator
,
num_of_dump
))
# 逻辑重载运输路线距离
# self.payload = 200 # 有效载重(不同型号矿卡载重不同,这里暂时认为车队是同质的)
self
.
truck
=
TruckInfo
()
self
.
payload
=
np
.
mean
(
self
.
truck
.
get_payload
())
self
.
payload
=
np
.
mean
(
truck
.
get_payload
())
self
.
empty_speed
=
sum
(
self
.
truck
.
empty_speed
.
values
())
/
self
.
truck
.
get_truck_num
()
# 空载矿卡平均时速
self
.
heavy_speed
=
sum
(
self
.
truck
.
heavy_speed
.
values
())
/
self
.
truck
.
get_truck_num
()
# 重载矿卡平均时速
self
.
empty_speed
=
sum
(
truck
.
empty_speed
.
values
())
/
truck
.
get_truck_num
()
# 空载矿卡平均时速
self
.
heavy_speed
=
sum
(
truck
.
heavy_speed
.
values
())
/
truck
.
get_truck_num
()
# 重载矿卡平均时速
self
.
min_throughout
=
1000
# 最小产量约束
self
.
truck_total_num
=
0
...
...
@@ -49,9 +52,6 @@ class Traffic_para(WalkManage):
self
.
path_planner
=
PathPlanner
()
self
.
path_planner
.
walk_cost
()
self
.
excavator
=
ExcavatorInfo
()
self
.
dump
=
DumpInfo
()
self
.
excavator_priority_coefficient
=
np
.
ones
(
num_of_excavator
)
# 每个电铲的优先级系数
self
.
excavator_material_priority
=
np
.
ones
(
num_of_excavator
)
# 每个电铲的物料优先级系数
self
.
grade_loading_array
=
np
.
zeros
(
num_of_excavator
)
# 用于保存电铲挖掘矿石的品位
...
...
@@ -77,7 +77,7 @@ class Traffic_para(WalkManage):
try
:
rule3
=
session_mysql
.
query
(
DispatchRule
)
.
filter_by
(
id
=
3
)
.
first
()
if
not
rule3
.
disabled
:
for
dump_index
in
range
(
dynamic_
excavator
_num
):
for
dump_index
in
range
(
dynamic_
dump
_num
):
unload_area_id
=
unload_area_index_to_uuid_dict
[
self
.
dump_index_to_unload_area_index_dict
[
dump_index
]]
unload_ability
=
session_postgre
.
query
(
DumpArea
)
.
filter_by
(
Id
=
unload_area_id
)
.
first
()
.
UnloadAbililty
...
...
@@ -88,7 +88,7 @@ class Traffic_para(WalkManage):
else
:
self
.
dump_strength
=
np
.
full
(
self
.
num_of_dump
,
5000
)
for
dump_index
in
range
(
dynamic_
excavator
_num
):
for
dump_index
in
range
(
dynamic_
dump
_num
):
# self.dump_strength[dump_index] = 10000 # 卸载设备最大卸载能力,单位吨/小时
self
.
grade_upper_dump_array
[
dump_index
]
=
100
# 卸点品位上限
self
.
grade_lower_dump_array
[
dump_index
]
=
100
# 卸点品位下限
...
...
@@ -98,31 +98,6 @@ class Traffic_para(WalkManage):
logger
.
error
(
es
)
logger
.
error
(
"卸载点信息设置异常"
)
# # 提取挖机信息并建立映射
# def extract_excavator_info(self):
# try:
# excavator_index = 0
# for dispatch in session_mysql.query(Dispatch).filter_by(isdeleted=0, isauto=1).all():
# excavator_id = dispatch.exactor_id
# load_area_id = dispatch.load_area_id
# if excavator_id not in self.excavator_uuid_to_index_dict:
# # excavator_uuid <-> excavator_uuid
# self.excavator_uuid_to_index_dict[excavator_id] = excavator_index
# self.excavator_index_to_uuid_dict[excavator_index] = excavator_id
# # excavator_uuid -> load_area_uuid
# self.excavator_uuid_to_load_area_uuid_dict[excavator_id] = load_area_id
# # excavator_id -> load_area_id
# self.excavator_index_to_load_area_index_dict[
# self.excavator_uuid_to_index_dict[excavator_id]] = \
# load_area_uuid_to_index_dict[load_area_id]
#
# self.excavator_strength[excavator_index] = 300 # 挖机最大装载能力,单位吨/小时
# self.grade_loading_array[excavator_index] = 100 # 挖机装载物料品位
# self.excavator_priority_coefficient[excavator_index] = 1 # 挖机优先级
# excavator_index += 1
# except Exception as es:
# logger.error("车流规划读取挖机信息异常")
# 设置挖信息
def
extract_excavator_info
(
self
):
try
:
...
...
@@ -147,129 +122,6 @@ class Traffic_para(WalkManage):
logger
.
error
(
es
)
logger
.
error
(
"挖机信息设置异常"
)
# def extract_walk_time_info(self):
# # load_area_uuid <-> load_area_id
# # unload_area_uuid <-> unload_area_id
# load_area_index = 0
# unload_area_index = 0
# for walk_time in session_postgre.query(WalkTime).all():
#
# load_area_id = str(walk_time.load_area_id)
# unload_area_id = str(walk_time.unload_area_id)
#
# if load_area_id not in load_area_uuid_to_index_dict:
# load_area_uuid_to_index_dict[load_area_id] = load_area_index
# load_area_index_to_uuid_dict[load_area_index] = load_area_id
# load_area_index += 1
# if unload_area_id not in unload_area_uuid_to_index_dict:
# unload_area_uuid_to_index_dict[unload_area_id] = unload_area_index
# unload_area_index_to_uuid_dict[unload_area_index] = unload_area_id
# unload_area_index += 1
# 根据物料优先级生成新的影响调度的coast矩阵
# def arrange_material_type (self, material_type):
#
# # 首先判断物料的种
# # if material_type:
# # logger.info(f'物料类型是土方')
# # else:
# # logger.info(f'物料类型是煤方')
# def extract_excavator_priority(self):
# for excavator_id in dynamic_excavator_set:
# item = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
# self.excavator_priority_coefficient[self.excavator_uuid_to_index_dict[excavator_id]] = item.priority + 1
#
# self.excavator.update_excavator_material()
#
# # 物料优先级控制
# rule = 1
# rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
# material_priority_use = rule7.disabled
# if material_priority_use == 0:
# rule = rule7.rule_weight
#
# if rule == 0:
# if self.excavator.excavator_material[excavator_id] == 'c8092d59-7597-44d7-a731-5a568b46060e':
# print("here111")
# self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
# elif rule == 2:
# if self.excavator.excavator_material[excavator_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418':
# self.excavator_material_priority[self.excavator_uuid_to_index_dict[excavator_id]] = 5
#
# print("挖机优先级")
# print(self.excavator_material_priority)
#
# def extract_dump_priority(self):
# for excavator_id in dynamic_excavator_set:
# item = session_mysql.query(Equipment).filter_by(id=excavator_id).first()
# self.excavator_priority_coefficient[self.excavator_uuid_to_index_dict[excavator_id]] = item.priority + 1
# def extract_walk_time_info(self, include_material_type):
#
# # try:
# # 车流规划部分矩阵格式与其余两个模块不同
# cost_to_load_area = self.path_planner.cost_to_load_area
# cost_to_unload_area = self.path_planner.cost_to_unload_area
#
# distance_to_load_area = self.path_planner.distance_to_load_area
# distance_to_unload_area = self.path_planner.distance_to_unload_area
#
# self.load_area_material_type = {}
# self.unload_area_material_type = {}
# for item in session_postgre.query(DiggingWorkArea).all():
# load_area_id = str(item.Id)
# # if load_area_id in load_area_uuid_to_index_dict:
# self.load_area_material_type[load_area_id] = item.Material
#
# for item in session_postgre.query(DumpArea).all():
# unload_area_id = str(item.Id)
# # if unload_area_id in unload_area_uuid_to_index_dict:
# self.unload_area_material_type[unload_area_id] = item.Material
#
#
# # # 物料优先级控制
# # factor = 1
# # rule = 1
# # rule7 = session_mysql.query(DispatchRule).filter_by(id=7).first()
# # material_priority_use = rule7.disabled
# # if material_priority_use == 0:
# # rule = rule7.rule_weight
# #
# # # 路网信息读取
# # for unload_area_index in range(unload_area_num):
# # for load_area_index in range(load_area_num):
# # unload_area_id = unload_area_index_to_uuid_dict[unload_area_index]
# # load_area_id = load_area_index_to_uuid_dict[load_area_index]
# # if unload_area_id in unload_area_uuid_to_index_dict and load_area_id in load_area_uuid_to_index_dict:
# #
# # print(cost_to_load_area[unload_area_index][load_area_index], (empty_speed * 1000), self.payload)
# #
# # if rule == 0:
# # if self.load_area_material_type[load_area_id] == 'c8092d59-7597-44d7-a731-5a568b46060e':
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # 5 * (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# # else:
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# #
# # elif rule == 1:
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# #
# # elif rule == 2:
# # if self.load_area_material_type[load_area_id] == 'c481794b-6ced-45b9-a9c4-c4a388f44418':
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # 5 * (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# # else:
# # self.goto_load_area_factor[unload_area_index][load_area_index] = \
# # (cost_to_load_area[unload_area_index][load_area_index] / (empty_speed * 1000)) / self.payload
# #
# # self.goto_unload_area_factor[load_area_index][unload_area_index] = \
# # (cost_to_unload_area[unload_area_index][load_area_index] / (heavy_speed * 1000)) / self.payload
def
extract_walk_time_info
(
self
):
try
:
# 车流规划部分矩阵格式与其余两个模块不同
...
...
@@ -309,9 +161,9 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
tra_para
.
extract_walk_time_info
()
tr
a_para
.
tr
uck
.
update_truck_payload
()
truck
.
update_truck_payload
()
tra_para
.
payload
=
np
.
mean
(
tr
a_para
.
tr
uck
.
get_payload
())
tra_para
.
payload
=
np
.
mean
(
truck
.
get_payload
())
# 全部矿卡设备集合
truck_set
=
set
(
update_total_truck
())
...
...
@@ -336,36 +188,6 @@ def Traffic_para_init(num_of_load_area, num_of_unload_area, num_of_excavator, nu
tra_para
.
goto_dump_factor
[
i
][
j
]
=
\
tra_para
.
goto_unload_area_factor
[
load_area_index
][
unload_area_index
]
# # 设备优先级
# if not device_priority_use:
# print("here1")
# # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# tra_para.priority_coefficient_goto_dump[i][j] = tra_para.excavator_priority_coefficient[i] \
# * tra_para.dump_priority_coefficient[j]
#
# # 每条装载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# tra_para.priority_coefficient_goto_excavator[j][i] = tra_para.excavator_priority_coefficient[i] \
# * tra_para.dump_priority_coefficient[j]
# # 物料优先级
# if not material_priority_use:
# print("here2")
# # # 每条卸载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# # tra_para.priority_coefficient_goto_dump[i][j] += tra_para.excavator_material_priority[i] \
# # * tra_para.dump_material_priority[j]
#
# # 每条装载道路的优先级,等于电铲的优先级乘以卸载点的优先级
# print(tra_para.excavator_material_priority[i], tra_para.dump_material_priority)
# tra_para.priority_coefficient_goto_excavator[j][i] = tra_para.excavator_material_priority[i] \
# * tra_para.dump_material_priority[j]
# # 逻辑距离赋值,来自实际道路距离
# tra_para.walk_time_to_excavator[j][i] = \
# tra_para.walk_time_to_load_area[unload_area_index][load_area_index]
#
# tra_para.walk_time_to_dump[i][j] = \
# tra_para.walk_time_to_unload_area[load_area_index][unload_area_index]
print
(
"cout"
,
tra_para
.
priority_coefficient_goto_dump
,
tra_para
.
priority_coefficient_goto_excavator
)
# except Exception as es:
...
...
traffic_flow/traffic_flow_planner.py
View file @
d950f451
...
...
@@ -9,10 +9,7 @@
# import
import
pulp
from
traffic_flow.traffic_flow_info
import
*
# from backstore_traffic_flow_info import *
# import time
# start = time.time()
# much_job = [x**2 for x in range (1, 1000000, 3)]
from
para_config
import
*
# 从数据库中读取挖机和卸载设备相关参数,并将线性规划所用参数保存在TrafficProgPara类中
...
...
@@ -42,14 +39,15 @@ def transportation_problem_slove(coefficient_goto_dump, coefficient_goto_excavat
prob
+=
(
pulp
.
lpDot
(
flatten
(
var_x
),
coefficient_goto_dump
.
flatten
()))
else
:
prob
=
pulp
.
LpProblem
(
'Transportation Problem'
,
sense
=
pulp
.
LpMinimize
)
goto_excavator_cost
=
var_
x
*
walk_time_to_excavator
goto_dump_cost
=
var_
y
*
walk_time_to_dump
goto_excavator_cost
=
var_
y
*
walk_time_to_excavator
goto_dump_cost
=
var_
x
*
walk_time_to_dump
prob
+=
(
pulp
.
lpSum
(
flatten
(
goto_excavator_cost
))
+
1.5
*
pulp
.
lpSum
(
flatten
(
goto_dump_cost
)))
# 定义约束条件
# 最小产量约束,仅在最小化成本模式下成立
if
max_unload_weigh_alg_flag
==
False
:
prob
+=
pulp
.
lpSum
(
var_x
)
>=
min_throughout
for
i
in
range
(
col
):
prob
+=
pulp
.
lpSum
(
var_y
[
i
])
>=
min_throughout
[
i
]
logger
.
info
(
"road_factor"
)
logger
.
info
(
w_ij
)
...
...
@@ -144,6 +142,10 @@ def traffic_flow_plan():
print
(
"装载区数量:"
,
load_area_num
,
"卸载区数量:"
,
unload_area_num
,
"挖机数量:"
,
excavator_num
,
"卸载设备数量:"
,
dump_num
)
# try:
if
(
load_area_num
*
unload_area_num
*
excavator_num
*
dump_num
==
0
):
raise
Exception
(
"无派车计划可用"
)
# 初始化参量
traffic_programme_para
=
Traffic_para_init
(
load_area_num
,
unload_area_num
,
excavator_num
,
dump_num
)
# traffic_programme_para = traffic_programme_para_init(load_area_num, unload_area_num, excavator_num, dump_num)
...
...
@@ -204,7 +206,11 @@ def traffic_flow_plan():
return
res
[
"var_x"
],
res
[
"var_y"
]
traffic_flow_plan
()
# except Exception as es:
# logger.error("车流规划参数异常")
# logger.error(es)
return
None
# end = time.time()
# print("used {:.5}s".format(end-start))
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