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
46f1a731
Commit
46f1a731
authored
Jul 07, 2021
by
Allvey
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
日志信息调整
parents
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
1451 additions
and
0 deletions
+1451
-0
CHANGELOG.txt
CHANGELOG.txt
+14
-0
Tables.py
Tables.py
+319
-0
WatoDisp.py
WatoDisp.py
+1118
-0
No files found.
CHANGELOG.txt
0 → 100644
View file @
46f1a731
^^^^^^^^^^^^^^^^^^^^^^^^^^
Changelog for package Dispatch
^^^^^^^^^^^^^^^^^^^^^^^^^^
--------------------
[version]: 1.0.1
[message]: add
[feather]:
[fix ]:
[TODO ]:
[info ]: author: zxt ; time: 2021-07-07 15:46:00 ; email: ; tel: ;
--------------------
\ No newline at end of file
Tables.py
0 → 100644
View file @
46f1a731
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/6/22 12:46
# @Author : Opfer
# @Site :
# @File : Tables.py
# @Software: PyCharm
from
sqlalchemy
import
Column
,
create_engine
from
sqlalchemy
import
VARCHAR
,
DateTime
,
Float
,
Integer
,
BOOLEAN
from
sqlalchemy.orm
import
sessionmaker
from
sqlalchemy.ext.declarative
import
declarative_base
import
numpy
as
np
from
redis
import
StrictRedis
,
ConnectionPool
import
redis
from
datetime
import
datetime
,
timedelta
import
copy
import
json
import
sched
import
time
pool5
=
ConnectionPool
(
host
=
'192.168.28.111'
,
db
=
5
,
port
=
6379
,
password
=
'Huituo@123'
)
redis5
=
StrictRedis
(
connection_pool
=
pool5
)
pool2
=
ConnectionPool
(
host
=
'192.168.28.111'
,
db
=
2
,
port
=
6379
,
password
=
'Huituo@123'
)
redis2
=
StrictRedis
(
connection_pool
=
pool2
)
# 创建对象的基类:
Base
=
declarative_base
()
# 初始化数据库连接:
engine_mysql
=
create_engine
(
'mysql+mysqlconnector://root:Huituo@123@192.168.28.111:3306/waytous'
)
engine_postgre
=
create_engine
(
'postgresql://postgres:Huituo@123@192.168.28.111:5432/shenbao_2021520'
)
# 创建DBsession_mysql类型:
DBsession_mysql
=
sessionmaker
(
bind
=
engine_mysql
)
DBsession_postgre
=
sessionmaker
(
bind
=
engine_postgre
)
# 创建session_mysql对象:
session_mysql
=
DBsession_mysql
()
session_postgre
=
DBsession_postgre
()
# 定义对象:
# class Excavator(Base):
# __tablename__ = 'excavator_property'
#
# excavator_id = Column(VARCHAR(36), primary_key=True)
# load_area_id = Column(VARCHAR(36))
# average_load_time = Column(Integer)
# target_mass = Column(Float(2))
# actual_mass = Column(Float(2))
# # virtual_mass = Column(Float(2))
# # last_load_time = Column(DateTime)
#
# def __init__(self, excavator_id, load_area_id, average_load_time, target_mass, actual_mass):
# self.excavator_id = excavator_id
# self.load_area_id = load_area_id
# self.average_load_time = average_load_time
# self.target_mass = target_mass
# self.actual_mass = actual_mass
# # self.virtual_mass = virtual_mass
# # self.last_load_time = last_load_time
# class Dump(Base):
# __tablename__ = 'dump_property'
#
# dump_id = Column(VARCHAR(36), primary_key=True)
# unload_area_id = Column(VARCHAR(36))
# average_unload_time = Column(Integer)
# target_mass = Column(Float(2))
# actual_mass = Column(Float(2))
# # virtual_mass = Column(Float(2))
# # last_unload_time = Column(DateTime)
#
# def __init__(self, dump_id, unload_area_id, average_unload_time, target_mass, actual_mass):
# self.dump_id = dump_id
# self.unload_area_id = unload_area_id
# self.average_unload_time = average_unload_time
# self.target_mass = target_mass
# self.actual_mass = actual_mass
# # self.virtual_mass = virtual_mass
# # self.last_unload_time = last_unload_time
# class Walk_time(Base):
# __tablename__ = 'walk_time'
#
# Rid = Column(VARCHAR(36), primary_key=True)
# load_area_id = Column(VARCHAR(36))
# unload_area_id = Column(VARCHAR(36))
# walktime_load = Column(Float(2))
# walktime_unload = Column(Float(2))
#
# def __init__(self, Rid, load_area_id, unload_area_id, walktime_load, walktime_unload):
# self.Rid = Rid
# self.load_area_id = load_area_id
# self.unload_area_id = unload_area_id
# self.walktime_load = walktime_load
# self.walktime_unload = walktime_unload
class
WalkTime
(
Base
):
__tablename__
=
'work_area_distance'
load_area_id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
unload_area_id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
load_area_name
=
Column
(
VARCHAR
(
30
))
unload_area_name
=
Column
(
VARCHAR
(
30
))
to_unload_distance
=
Column
(
Float
(
10
))
to_load_distance
=
Column
(
Float
(
10
))
def
__init__
(
self
,
load_area_id
,
unload_area_id
,
load_area_name
,
unload_area_name
,
to_load_distance
,
to_unload_distance
):
self
.
load_area_id
=
load_area_id
self
.
unload_area_id
=
unload_area_id
self
.
load_area_name
=
load_area_name
self
.
unload_area_name
=
unload_area_name
self
.
to_load_distance
=
to_load_distance
self
.
to_unload_distance
=
to_unload_distance
# Rid = Column(VARCHAR(36), primary_key=True)
# load_area_id = Column(VARCHAR(36))
# unload_area_id = Column(VARCHAR(36))
# walktime_load = Column(Float(2))
# walktime_unload = Column(Float(2))
#
# def __init__(self, Rid, load_area_id, unload_area_id, walktime_load, walktime_unload):
# self.Rid = Rid
# self.load_area_id = load_area_id
# self.unload_area_id = unload_area_id
# self.walktime_load = walktime_load
# self.walktime_unload = walktime_unload
# class Truck(Base):
# __tablename__ = 'truck_status'
#
# truck_id = Column(VARCHAR(36), primary_key=True)
# # dispatch_id = Column(VARCHAR(36))
# current_task = Column(Integer)
# # reach_time = Column(DateTime)
# last_load_time = Column(DateTime)
# last_unload_time = Column(DateTime)
# payload = Column(Float(2))
#
# def __init__(self, truck_id, current_task, last_load_time, last_unload_time, payload):
# self.truck_id = truck_id
# # self.dispatch_id = dispatch_id
# self.current_task = current_task
# # self.reach_time = reach_time
# self.last_load_time = last_load_time
# self.last_unload_time = last_unload_time
# self.payload = payload
#
# def check_existing(self):
# existing = session_mysql.query(Truck).filter_by(truck_id=self.truck_id).first()
# if not existing:
# truck = Truck(self.truck_id, self.dispatch_id, self.status, self.reach_time, self.last_load_time, self.last_unload_time, self.payload)
# else:
# truck = existing
# session_mysql.close()
# return truck
# class Dispatch(Base):
# __tablename__ = 'dispatch_pair'
#
# dispatch_id = Column(VARCHAR(36), primary_key=True)
# excavator_id = Column(VARCHAR(36))
# dump_id = Column(VARCHAR(36))
#
# def __init__(self, dispatch_id, excavator_id, dump_id):
# self.dispatch_id = dispatch_id
# self.excavator_id = excavator_id
# self.dump_id = dump_id
class
EquipmentPair
(
Base
):
__tablename__
=
'sys_equipment_pair'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
truck_id
=
Column
(
VARCHAR
(
36
))
exactor_id
=
Column
(
VARCHAR
(
36
))
dump_id
=
Column
(
VARCHAR
(
36
))
load_area_id
=
Column
(
VARCHAR
(
36
))
unload_area_id
=
Column
(
VARCHAR
(
36
))
dispatch_id
=
Column
(
VARCHAR
(
36
))
isdeleted
=
Column
(
BOOLEAN
)
def
__init__
(
self
,
id
,
truck_id
,
exactor_id
,
dump_id
,
load_area_id
,
unload_area_id
,
dispatch_id
,
isdeleted
):
self
.
id
=
id
self
.
truck_id
=
truck_id
self
.
exactor_id
=
exactor_id
self
.
dump_id
=
dump_id
self
.
load_area_id
=
load_area_id
self
.
unload_area_id
=
unload_area_id
self
.
dispatch_id
=
dispatch_id
self
.
isdeleted
=
isdeleted
class
Dispatch
(
Base
):
# 表的名字:
__tablename__
=
'sys_dispatch_setting'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
load_area_id
=
Column
(
VARCHAR
(
36
))
exactor_id
=
Column
(
VARCHAR
(
36
))
unload_area_id
=
Column
(
VARCHAR
(
36
))
dump_id
=
Column
(
VARCHAR
(
36
))
isauto
=
Column
(
BOOLEAN
)
truck_id
=
Column
(
VARCHAR
(
36
))
remark
=
Column
(
VARCHAR
(
100
))
proportion_id
=
Column
(
VARCHAR
(
36
))
isdeleted
=
Column
(
BOOLEAN
)
creator
=
Column
(
VARCHAR
(
36
))
createtime
=
Column
(
DateTime
)
updator
=
Column
(
VARCHAR
(
36
))
updatetime
=
Column
(
DateTime
)
deletor
=
Column
(
VARCHAR
(
36
))
deletetime
=
Column
(
DateTime
)
def
__init__
(
self
,
id
,
load_area_id
,
exactor_id
,
unload_area_id
,
dump_id
,
isauto
,
truck_id
,
remark
,
proportion_id
,
isdeleted
,
creator
,
createtime
,
updator
,
updatetime
,
deletor
,
deletetime
):
self
.
id
=
id
self
.
load_area_id
=
load_area_id
self
.
excavator_id
=
exactor_id
self
.
unload_area_id
=
unload_area_id
self
.
dump_id
=
dump_id
self
.
isauto
=
isauto
self
.
truck_id
=
truck_id
self
.
remark
=
remark
self
.
proportion_id
=
proportion_id
self
.
isdeleted
=
isdeleted
self
.
creator
=
creator
self
.
createtime
=
createtime
self
.
updator
=
updator
self
.
updatetime
=
updatetime
self
.
deletor
=
deletor
self
.
deletetime
=
deletetime
class
WalkTimePort
(
Base
):
__tablename__
=
'park_load_distance'
park_area_id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
load_area_id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
park_area_name
=
Column
(
VARCHAR
(
36
))
load_area_name
=
Column
(
VARCHAR
(
36
))
park_load_distance
=
Column
(
Float
(
10
))
def
__init__
(
self
,
park_area_id
,
load_area_id
,
park_area_name
,
load_area_name
,
park_load_distance
):
self
.
park_area_id
=
park_area_id
self
.
load_area_id
=
load_area_id
self
.
park_area_name
=
park_area_name
self
.
load_area_name
=
load_area_name
self
.
park_load_distance
=
park_load_distance
class
Equipment
(
Base
):
__tablename__
=
'sys_equipment'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
equipment_id
=
Column
(
VARCHAR
(
64
))
device_name
=
Column
(
VARCHAR
(
64
))
device_type
=
Column
(
VARCHAR
(
36
))
equipment_spec
=
Column
(
VARCHAR
(
36
))
equipment_state
=
Column
(
Integer
)
isdeleted
=
Column
(
Integer
)
def
__init__
(
self
,
id
,
equipment_id
,
device_name
,
device_type
,
equipment_spec
,
equipment_state
,
isdeleted
):
self
.
id
=
id
self
.
equipment_id
=
equipment_id
self
.
device_name
=
device_name
self
.
device_type
=
device_type
self
.
equipment_spec
=
equipment_spec
self
.
equipment_state
=
equipment_state
self
.
isdeleted
=
isdeleted
class
EquipmentSpec
(
Base
):
__tablename__
=
'sys_equipment_spec'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
capacity
=
Column
(
Integer
)
def
__init__
(
self
,
id
,
capacity
):
self
.
id
=
id
self
.
capacity
=
capacity
class
LoadInfo
(
Base
):
__tablename__
=
'sys_loadinfo'
time
=
Column
(
DateTime
,
primary_key
=
True
)
dump_id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
load_weight
=
Column
(
Float
(
8
))
def
__init__
(
self
,
time
,
dump_id
,
load_weight
):
self
.
time
=
time
self
.
dump_id
=
dump_id
self
.
load_weght
=
load_weight
class
JobRecord
(
Base
):
__tablename__
=
'statistic_job_record'
id
=
Column
(
VARCHAR
(
36
),
primary_key
=
True
)
equipment_id
=
Column
(
VARCHAR
(
50
))
start_time
=
Column
(
DateTime
)
end_time
=
Column
(
DateTime
)
work_type
=
Column
(
Integer
)
def
__init__
(
self
,
id
,
equipment_id
,
start_time
,
end_time
,
work_type
):
self
.
id
=
id
self
.
equipment_id
=
equipment_id
self
.
start_time
=
start_time
self
.
end_time
=
end_time
self
.
work_type
=
work_type
\ No newline at end of file
WatoDisp.py
0 → 100644
View file @
46f1a731
#!E:\Pycharm Projects\Waytous
# -*- coding: utf-8 -*-
# @Time : 2021/6/15 10:35
# @Author : Opfer
# @Site :
# @File : WatoDisp.py
# @Software: PyCharm
from
sqlalchemy
import
Column
,
create_engine
from
sqlalchemy
import
VARCHAR
,
DateTime
,
Float
,
Integer
,
BOOLEAN
from
sqlalchemy.orm
import
sessionmaker
from
sqlalchemy.ext.declarative
import
declarative_base
import
numpy
as
np
from
redis
import
StrictRedis
,
ConnectionPool
import
redis
from
datetime
import
datetime
,
timedelta
import
copy
import
json
import
sched
import
time
from
Tables
import
*
from
urllib.parse
import
quote
import
logging
import
logging.handlers
# 全局参数设定
########################################################################################################################
empty_task_set
=
[
0
,
1
,
5
]
heavy_task_set
=
[
2
,
3
,
4
]
# 空载矿卡速度,单位(km/h)
empty_speed
=
25
# 重载矿卡速度,单位(km/h)
heavy_speed
=
22
# 卸点目标卸载量
dump_target_mass
=
5000
# 挖机目标装载量
shovel_target_mass
=
5000
task_set
=
[
-
2
,
0
,
1
,
2
,
3
,
4
,
5
]
M
=
100000000
# 连接reids
########################################################################################################################
pool5
=
ConnectionPool
(
host
=
'192.168.28.111'
,
db
=
5
,
port
=
6379
,
password
=
'Huituo@123'
)
redis5
=
StrictRedis
(
connection_pool
=
pool5
)
pool2
=
ConnectionPool
(
host
=
'192.168.28.111'
,
db
=
2
,
port
=
6379
,
password
=
'Huituo@123'
)
redis2
=
StrictRedis
(
connection_pool
=
pool2
)
# 创建对象的基类:
Base
=
declarative_base
()
# 初始化数据库连接:
engine_mysql
=
create_engine
(
'mysql+mysqlconnector://root:
%
s@192.168.28.111:3306/waytous'
%
quote
(
'Huituo@123'
))
engine_postgre
=
create_engine
(
'postgresql://postgres:
%
s@192.168.28.111:5432/shenbao_2021520'
%
quote
(
'Huituo@123'
))
# 创建DBsession_mysql类型:
DBsession_mysql
=
sessionmaker
(
bind
=
engine_mysql
)
DBsession_postgre
=
sessionmaker
(
bind
=
engine_postgre
)
# 创建session_mysql对象:
session_mysql
=
DBsession_mysql
()
session_postgre
=
DBsession_postgre
()
# 创建日志
########################################################################################################################
# logging初始化工作
logging
.
basicConfig
()
logger
=
logging
.
getLogger
(
__name__
)
logger
.
setLevel
(
logging
.
INFO
)
timefilehandler
=
logging
.
handlers
.
TimedRotatingFileHandler
(
"logs/dispatch.log"
,
when
=
'M'
,
interval
=
1
,
backupCount
=
60
)
# 设置后缀名称,跟strftime的格式一样
timefilehandler
.
suffix
=
"
%
Y-
%
m-
%
d_
%
H-
%
M.log"
formatter
=
logging
.
Formatter
(
'
%(asctime)
s|
%(name)-12
s:
%(levelname)-8
s
%(message)
s'
)
timefilehandler
.
setFormatter
(
formatter
)
logger
.
addHandler
(
timefilehandler
)
########################################################################################################################
# load_area_id <-> load_area_index
# unload_area_id <-> unload_area_index
load_area_uuid_to_index_dict
=
{}
unload_area_uuid_to_index_dict
=
{}
load_area_index_to_uuid_dict
=
{}
unload_area_index_to_uuid_dict
=
{}
unload_area_num
=
0
load_area_num
=
0
for
item
in
session_postgre
.
query
(
WalkTime
)
.
all
():
load_area
=
str
(
item
.
load_area_id
)
unload_area
=
str
(
item
.
unload_area_id
)
if
load_area
not
in
load_area_uuid_to_index_dict
:
load_area_uuid_to_index_dict
[
load_area
]
=
load_area_num
load_area_index_to_uuid_dict
[
load_area_num
]
=
load_area
load_area_num
=
load_area_num
+
1
if
unload_area
not
in
unload_area_uuid_to_index_dict
:
unload_area_uuid_to_index_dict
[
unload_area
]
=
unload_area_num
unload_area_index_to_uuid_dict
[
unload_area_num
]
=
unload_area
unload_area_num
=
unload_area_num
+
1
########################################################################################################################
# park_id <-> park_index
park_uuid_to_index_dict
=
{}
park_index_to_uuid_dict
=
{}
park_num
=
0
for
item
in
session_postgre
.
query
(
WalkTimePort
)
.
all
():
park
=
str
(
item
.
park_area_id
)
if
park
not
in
park_uuid_to_index_dict
:
park_uuid_to_index_dict
[
park
]
=
park_num
park_index_to_uuid_dict
[
park_num
]
=
park
park_num
=
park_num
+
1
########################################################################################################################
# truck_id <-> truck_name
truck_uuid_to_name_dict
=
{}
truck_name_to_uuid_dict
=
{}
for
item
in
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
1
)
.
all
():
truck_id
=
item
.
id
truck_name
=
item
.
equipment_id
truck_name_to_uuid_dict
[
truck_name
]
=
truck_id
truck_uuid_to_name_dict
[
truck_id
]
=
truck_name
########################################################################################################################
# 矿卡集合
truck_set
=
[]
query
=
np
.
array
(
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
1
,
isdeleted
=
0
)
.
all
())
for
item
in
query
:
truck_set
.
append
(
item
.
id
)
truck_set
=
set
(
truck_set
)
# 固定派车矿卡集合
fixed_truck_set
=
[]
query
=
np
.
array
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isauto
=
0
,
isdeleted
=
0
)
.
all
())
for
item
in
query
:
fixed_truck_set
.
append
(
item
.
truck_id
)
fixed_truck_set
=
set
(
fixed_truck_set
)
# 动态派车矿卡集合
dynamic_truck_set
=
truck_set
.
difference
(
fixed_truck_set
)
# print("可用于动态派车的矿卡:")
# print(dynamic_truck_set)
logger
.
info
(
"可用于动态派车的矿卡:"
)
logger
.
info
(
dynamic_truck_set
)
########################################################################################################################
# 用于动态派车的挖机集合
dynamic_excavator_set
=
[]
# 用于动态调度的卸载点集合
dynamic_dump_set
=
[]
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isdeleted
=
0
,
isauto
=
1
)
.
all
():
dynamic_excavator_set
.
append
(
item
.
exactor_id
)
dynamic_dump_set
.
append
(
item
.
dump_id
)
# 用于动态调度的挖机及卸载设备数量
dynamic_excavator_set
=
set
(
dynamic_excavator_set
)
dynamic_dump_set
=
set
(
dynamic_dump_set
)
# for item in dynamic_truck_set:
# now = datetime.now()
# truck = Truck(truck_id=item, current_task=-1, last_load_time=now, last_unload_time=now, payload=220.0)
#
# truck = truck.check_existing()
# session_mysql.add(truck)
#
# session_mysql.commit()
def
seq_is_empty
(
sequence
):
# 判断sequence是否为空
for
i
in
range
(
len
(
sequence
)):
if
len
(
sequence
[
i
])
!=
0
:
return
False
return
True
def
sequence_meet
(
sequence
):
# 判断构造解是否达标
meet
=
True
for
i
in
range
(
len
(
sequence
)):
meet
=
meet
and
len
(
sequence
[
i
])
>
2
return
meet
class
Dispatcher
:
def
__init__
(
self
):
# 设备数量
self
.
dumps
=
len
(
dynamic_dump_set
)
self
.
shovels
=
len
(
dynamic_excavator_set
)
self
.
trucks
=
len
(
dynamic_truck_set
)
self
.
dis
=
np
.
full
((
self
.
dumps
,
self
.
shovels
),
M
)
# 目标产量
self
.
dump_target_mass
=
np
.
zeros
(
self
.
dumps
)
self
.
shovel_target_mass
=
np
.
zeros
(
self
.
shovels
)
# 真实实际产量
self
.
cur_dump_real_mass
=
np
.
zeros
(
self
.
dumps
)
self
.
cur_shovel_real_mass
=
np
.
zeros
(
self
.
shovels
)
# 预计产量
self
.
pre_dump_real_mass
=
copy
.
deepcopy
(
self
.
cur_dump_real_mass
)
self
.
pre_shovel_real_mass
=
copy
.
deepcopy
(
self
.
cur_shovel_real_mass
)
# 模拟实际产量(防止修改真实产量)
self
.
sim_dump_real_mass
=
np
.
zeros
(
self
.
dumps
)
self
.
sim_shovel_real_mass
=
np
.
zeros
(
self
.
shovels
)
# 真实设备可用时间
self
.
cur_truck_reach_dump
=
np
.
zeros
(
self
.
trucks
)
self
.
cur_truck_reach_shovel
=
np
.
zeros
(
self
.
trucks
)
self
.
cur_shovel_ava_time
=
np
.
zeros
(
self
.
shovels
)
self
.
cur_dump_ava_time
=
np
.
zeros
(
self
.
dumps
)
# 模拟各设备可用时间
self
.
sim_truck_reach_dump
=
np
.
zeros
(
self
.
trucks
)
self
.
sim_truck_reach_shovel
=
np
.
zeros
(
self
.
trucks
)
self
.
sim_shovel_ava_time
=
np
.
zeros
(
self
.
shovels
)
self
.
sim_dump_ava_time
=
np
.
zeros
(
self
.
dumps
)
# 矿卡阶段
self
.
truck_current_task
=
{}
# 维护一个矿卡调度表
self
.
Seq
=
[[]
for
_
in
range
(
self
.
trucks
)]
# 调度开始时间
self
.
start_time
=
datetime
.
now
()
# self.relative_now_time = datetime.now() - self.start_time
# 行走时间
self
.
com_time_area
=
np
.
full
((
unload_area_num
,
load_area_num
),
M
)
self
.
go_time_area
=
np
.
full
((
unload_area_num
,
load_area_num
),
M
)
self
.
com_time_eq
=
np
.
full
((
self
.
dumps
,
self
.
shovels
),
M
)
self
.
go_time_eq
=
np
.
full
((
self
.
dumps
,
self
.
shovels
),
M
)
self
.
park_to_load_area
=
np
.
full
((
park_num
,
load_area_num
),
M
)
self
.
park_to_load_eq
=
np
.
full
((
park_num
,
self
.
shovels
),
M
)
# 卡车完成装载及卸载时间
self
.
cur_truck_ava_time
=
np
.
zeros
(
self
.
trucks
)
self
.
sim_truck_ava_time
=
np
.
zeros
(
self
.
trucks
)
# 处理距离
for
item
in
session_postgre
.
query
(
WalkTime
)
.
all
():
load_area
=
str
(
item
.
load_area_id
)
unload_area
=
str
(
item
.
unload_area_id
)
load_area_index
=
load_area_uuid_to_index_dict
[
load_area
]
unload_area_index
=
unload_area_uuid_to_index_dict
[
unload_area
]
self
.
com_time_area
[
unload_area_index
][
load_area_index
]
=
60
/
1000
*
item
.
to_load_distance
/
empty_speed
self
.
go_time_area
[
unload_area_index
][
load_area_index
]
=
60
/
1000
*
item
.
to_unload_distance
/
heavy_speed
def
update
(
self
):
print
(
"#####################################周期更新#####################################"
)
logger
.
info
(
"周期更新开始"
)
# 初始化挖机可用时间
self
.
cur_shovel_ava_time
=
np
.
full
(
self
.
shovels
,
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
################################################################################################################
# 矿卡集合
################################################################################################################
# 读取矿卡集合
truck_set
=
[]
query
=
np
.
array
(
session_mysql
.
query
(
Equipment
)
.
filter_by
(
device_type
=
1
,
isdeleted
=
0
)
.
all
())
for
item
in
query
:
truck_set
.
append
(
item
.
id
)
truck_set
=
set
(
truck_set
)
# 固定派车矿卡集合
fixed_truck_set
=
[]
query
=
np
.
array
(
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isauto
=
0
,
isdeleted
=
0
)
.
all
())
for
item
in
query
:
fixed_truck_set
.
append
(
item
.
truck_id
)
fixed_truck_set
=
set
(
fixed_truck_set
)
# 动态派车矿卡集合
self
.
dynamic_truck_set
=
truck_set
.
difference
(
fixed_truck_set
)
# 更新矿卡数量
self
.
trucks
=
len
(
self
.
dynamic_truck_set
)
################################################################################################################
# 更新矿卡参数
################################################################################################################
# 卡车完成装载及卸载时间
self
.
cur_truck_ava_time
=
np
.
zeros
(
self
.
trucks
)
self
.
sim_truck_ava_time
=
np
.
zeros
(
self
.
trucks
)
# 真实设备可用时间
self
.
cur_truck_reach_dump
=
np
.
zeros
(
self
.
trucks
)
self
.
cur_truck_reach_shovel
=
np
.
zeros
(
self
.
trucks
)
# 模拟各设备可用时间
self
.
sim_truck_reach_dump
=
np
.
zeros
(
self
.
trucks
)
self
.
sim_truck_reach_shovel
=
np
.
zeros
(
self
.
trucks
)
################################################################################################################
# 动态派车挖机、卸载设备集合
################################################################################################################
# 用于动态派车的挖机集合
self
.
dynamic_excavator_set
=
[]
# 用于动态调度的卸载点集合
self
.
dynamic_dump_set
=
[]
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isdeleted
=
0
,
isauto
=
1
)
.
all
():
self
.
dynamic_excavator_set
.
append
(
item
.
exactor_id
)
self
.
dynamic_dump_set
.
append
(
item
.
dump_id
)
# 用于动态调度的挖机及卸载设备数量
self
.
dynamic_excavator_set
=
set
(
self
.
dynamic_excavator_set
)
self
.
dynamic_dump_set
=
set
(
self
.
dynamic_dump_set
)
# 更新挖机和卸载设备数量
self
.
dumps
=
len
(
self
.
dynamic_dump_set
)
self
.
shovels
=
len
(
self
.
dynamic_excavator_set
)
# print("检测到挖机数量:", self.shovels)
# print(self.dynamic_excavator_set)
# print("检测到卸点数量:", self.dumps)
# 初始化挖机可用时间
self
.
cur_shovel_ava_time
=
np
.
full
(
self
.
shovels
,
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
################################################################################################################
# 挖机卸载点映射
################################################################################################################
self
.
excavator_uuid_to_index_dict
=
{}
# 用于将Excavator表中的area_id映射到index
self
.
dump_uuid_to_index_dict
=
{}
# 用于将Dump表中的area_id映射到index
self
.
excavator_index_to_uuid_dict
=
{}
# 用于将index映射到Excavator表中的area_id
self
.
dump_index_to_uuid_dict
=
{}
# 用于将index映射到Dump表中的area_id
self
.
dump_uuid_to_unload_area_uuid_dict
=
{}
self
.
excavator_uuid_to_load_area_uuid_dict
=
{}
self
.
excavator_index_to_load_area_index_dict
=
{}
self
.
dump_index_to_unload_area_index_dict
=
{}
excavator_num
=
0
dump_num
=
0
for
item
in
session_mysql
.
query
(
Dispatch
)
.
filter_by
(
isdeleted
=
0
,
isauto
=
1
)
.
all
():
# excavator_id <-> excavator_index
# dump_id <-> dump_index
# excavator_id <-> load_area_id
# dump_id <-> unload_area_id
# excavator_index <-> load_area_index
# dump_index <-> unload_area_index
excavator_id
=
item
.
exactor_id
load_area_id
=
item
.
load_area_id
unload_area_id
=
item
.
unload_area_id
dump_id
=
item
.
dump_id
if
dump_id
not
in
self
.
dump_uuid_to_unload_area_uuid_dict
:
self
.
dump_uuid_to_index_dict
[
dump_id
]
=
dump_num
self
.
dump_index_to_uuid_dict
[
dump_num
]
=
dump_id
self
.
dump_uuid_to_unload_area_uuid_dict
[
dump_id
]
=
unload_area_id
self
.
dump_index_to_unload_area_index_dict
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
\
unload_area_uuid_to_index_dict
[
unload_area_id
]
dump_num
=
dump_num
+
1
if
excavator_id
not
in
self
.
excavator_uuid_to_index_dict
:
self
.
excavator_uuid_to_index_dict
[
excavator_id
]
=
excavator_num
self
.
excavator_index_to_uuid_dict
[
excavator_num
]
=
excavator_id
self
.
excavator_uuid_to_load_area_uuid_dict
[
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
]
excavator_num
=
excavator_num
+
1
# print(self.excavator_index_to_load_area_index_dict)
################################################################################################################
# 设备距离
################################################################################################################
for
i
in
range
(
self
.
dumps
):
for
j
in
range
(
self
.
shovels
):
self
.
com_time_eq
[
i
][
j
]
=
self
.
com_time_area
[
self
.
dump_index_to_unload_area_index_dict
[
i
]]
\
[
self
.
excavator_index_to_load_area_index_dict
[
j
]]
self
.
go_time_eq
[
i
][
j
]
=
self
.
go_time_area
[
self
.
dump_index_to_unload_area_index_dict
[
i
]]
\
[
self
.
excavator_index_to_load_area_index_dict
[
j
]]
for
item
in
session_postgre
.
query
(
WalkTimePort
)
.
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
]
self
.
park_to_load_area
[
park_index
][
load_area_index
]
=
60
/
1000
*
item
.
park_load_distance
/
empty_speed
for
i
in
range
(
park_num
):
for
j
in
range
(
self
.
shovels
):
self
.
park_to_load_eq
[
i
][
j
]
=
self
.
park_to_load_area
[
i
][
self
.
excavator_index_to_load_area_index_dict
[
j
]]
################################################################################################################
# 矿卡映射
################################################################################################################
self
.
truck_uuid_to_index_dict
=
{}
self
.
truck_index_to_uuid_dict
=
{}
# truck_id <-> truck_index
truck_num
=
0
for
truck_id
in
self
.
dynamic_truck_set
:
self
.
truck_uuid_to_index_dict
[
truck_id
]
=
truck_num
self
.
truck_index_to_uuid_dict
[
truck_num
]
=
truck_id
truck_num
=
truck_num
+
1
################################################################################################################
# 卡车当前任务
################################################################################################################
# self.truck_current_stage = np.array(session_mysql.query(Truck.status).all())
self
.
truck_current_task
=
{}
device_name_set
=
redis2
.
keys
()
for
item
in
device_name_set
:
item
=
item
.
decode
(
encoding
=
'utf-8'
)
json_value
=
json
.
loads
(
redis2
.
get
(
item
))
device_type
=
json_value
.
get
(
'type'
)
if
device_type
==
1
:
if
truck_name_to_uuid_dict
[
item
]
in
self
.
dynamic_truck_set
:
currentTask
=
json_value
.
get
(
'currentTask'
)
self
.
truck_current_task
[
truck_name_to_uuid_dict
[
item
]]
=
currentTask
try
:
if
currentTask
not
in
task_set
:
raise
Exception
(
f
'车辆{item}出现未知状态{currentTask}'
)
except
Exception
as
es
:
logger
.
warning
(
es
)
print
(
es
)
# print("矿卡当前任务:")
# print(self.truck_current_task)
logger
.
info
(
"矿卡当前任务:"
)
logger
.
info
(
self
.
truck_current_task
)
################################################################################################################
# 卡车当前状态
################################################################################################################
self
.
truck_current_state
=
{}
device_name_set
=
redis2
.
keys
()
for
item
in
device_name_set
:
item
=
item
.
decode
(
encoding
=
'utf-8'
)
json_value
=
json
.
loads
(
redis2
.
get
(
item
))
device_type
=
json_value
.
get
(
'type'
)
if
device_type
==
1
:
if
truck_name_to_uuid_dict
[
item
]
in
self
.
dynamic_truck_set
:
self
.
truck_current_state
[
truck_name_to_uuid_dict
[
item
]]
=
json_value
.
get
(
'state'
)
# print("矿卡当前状态:")
# print(self.truck_current_state)
################################################################################################################
# 有效载重
################################################################################################################
# self.payload = np.array(session_mysql.query(Truck.payload).all())
self
.
payload
=
np
.
zeros
(
self
.
trucks
)
for
truck_id
in
self
.
dynamic_truck_set
:
trcuk_index
=
self
.
truck_uuid_to_index_dict
[
truck_id
]
truck_spec
=
session_mysql
.
query
(
Equipment
)
.
filter_by
(
id
=
truck_id
)
.
first
()
.
equipment_spec
# truck_spec = query.equipment_spec
self
.
payload
[
trcuk_index
]
=
session_mysql
.
query
(
EquipmentSpec
)
.
filter_by
(
id
=
truck_spec
)
.
first
()
.
capacity
################################################################################################################
# 卡车最后一次装载/卸载时间
################################################################################################################
self
.
last_load_time
=
{}
self
.
last_unload_time
=
{}
self
.
relative_last_load_time
=
{}
self
.
relative_last_unload_time
=
{}
# for x in redis2.keys():
# print(redis2.get(x))
for
item
in
self
.
dynamic_truck_set
:
json_value
=
json
.
loads
(
redis2
.
get
(
truck_uuid_to_name_dict
[
item
]))
device_type
=
json_value
.
get
(
'type'
)
# 判断是否为矿卡
if
device_type
==
1
:
task
=
self
.
truck_current_task
[
item
]
state
=
self
.
truck_current_state
[
item
]
if
task
in
heavy_task_set
:
last_load_time_tmp
=
json_value
.
get
(
'lastLoadTime'
)
if
last_load_time_tmp
is
not
None
:
self
.
last_load_time
[
item
]
=
datetime
.
strptime
(
last_load_time_tmp
,
\
"
%
b
%
d,
%
Y
%
I:
%
M:
%
S
%
p"
)
else
:
self
.
last_load_time
[
item
]
=
datetime
.
now
()
self
.
relative_last_load_time
[
item
]
=
((
self
.
last_load_time
[
item
]
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
# print("相对last_load_time", self.relative_last_load_time[item])
logger
.
info
(
"相对last_load_time"
)
logger
.
info
(
self
.
relative_last_load_time
[
item
])
if
task
in
empty_task_set
:
last_unload_time_tmp
=
json_value
.
get
(
'lastUnloadTime'
)
if
last_unload_time_tmp
is
not
None
:
self
.
last_unload_time
[
item
]
=
datetime
.
strptime
(
last_unload_time_tmp
,
\
"
%
b
%
d,
%
Y
%
I:
%
M:
%
S
%
p"
)
else
:
self
.
last_unload_time
[
item
]
=
datetime
.
now
()
self
.
relative_last_unload_time
[
item
]
=
((
self
.
last_unload_time
[
item
]
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
# print("相对last_unload_time", self.relative_last_unload_time[item])
logger
.
info
(
"相对last_unload_time"
)
logger
.
info
(
self
.
relative_last_unload_time
[
item
])
################################################################################################################
# 计算平均装载时间
################################################################################################################
self
.
loading_time
=
np
.
zeros
(
self
.
shovels
)
for
excavator_id
in
self
.
excavator_uuid_to_index_dict
.
keys
():
ave_load_time
=
0
for
query
in
session_mysql
.
query
(
JobRecord
.
start_time
,
JobRecord
.
end_time
)
.
\
join
(
Equipment
,
JobRecord
.
equipment_id
==
Equipment
.
equipment_id
)
.
\
filter
(
Equipment
.
id
==
excavator_id
,
JobRecord
.
end_time
!=
None
)
.
\
order_by
(
JobRecord
.
start_time
.
desc
())
.
limit
(
10
):
ave_load_time
=
ave_load_time
+
int
(
(
query
.
end_time
-
query
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
self
.
loading_time
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
ave_load_time
/
10
################################################################################################################
# 计算平均卸载时间
################################################################################################################
self
.
unloading_time
=
np
.
zeros
(
dump_num
)
for
dump_id
in
self
.
dump_uuid_to_index_dict
.
keys
():
ave_unload_time
=
0
for
query
in
session_mysql
.
query
(
JobRecord
.
start_time
,
JobRecord
.
end_time
)
.
\
join
(
Equipment
,
JobRecord
.
equipment_id
==
Equipment
.
equipment_id
)
.
\
filter
(
Equipment
.
id
==
dump_id
,
JobRecord
.
end_time
!=
None
)
.
\
order_by
(
JobRecord
.
start_time
.
desc
())
.
limit
(
10
):
ave_unload_time
=
ave_unload_time
+
int
(
(
query
.
end_time
-
query
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
))
self
.
unloading_time
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
ave_unload_time
/
10
# print("average_unload_time: ", self.unloading_time[self.dump_uuid_to_index_dict[dump_id]])
################################################################################################################
# 读取实时装载卸载量
################################################################################################################
self
.
cur_shovel_real_mass
=
np
.
zeros
(
self
.
shovels
)
self
.
cur_dump_real_mass
=
np
.
zeros
(
self
.
dumps
)
now
=
datetime
.
now
()
.
strftime
(
'
%
Y-
%
m-
%
d'
)
for
excavator_id
in
self
.
excavator_uuid_to_index_dict
.
keys
():
# print(excavator_id)
for
query
in
session_mysql
.
query
(
LoadInfo
)
.
\
join
(
Equipment
,
LoadInfo
.
dump_id
==
Equipment
.
equipment_id
)
.
\
filter
(
Equipment
.
id
==
excavator_id
,
LoadInfo
.
time
>
now
)
.
\
order_by
(
LoadInfo
.
time
.
desc
())
.
all
():
# print("time:", query.time)
# print("load_weight:", )
self
.
cur_shovel_real_mass
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
=
\
self
.
cur_shovel_real_mass
[
self
.
excavator_uuid_to_index_dict
[
excavator_id
]]
+
query
.
load_weight
for
dump_id
in
self
.
dump_uuid_to_index_dict
.
keys
():
# print(excavator_id)
for
query
in
session_mysql
.
query
(
LoadInfo
)
.
\
join
(
Equipment
,
LoadInfo
.
dump_id
==
Equipment
.
equipment_id
)
.
\
filter
(
Equipment
.
id
==
dump_id
,
LoadInfo
.
time
>
now
)
.
\
order_by
(
LoadInfo
.
time
.
desc
())
.
all
():
# print("time:", query.time)
# print("load_weight:", )
self
.
cur_dump_real_mass
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
=
\
self
.
cur_dump_real_mass
[
self
.
dump_uuid_to_index_dict
[
dump_id
]]
+
query
.
load_weight
################################################################################################################
# 读取卡车当前行程
################################################################################################################
self
.
truck_current_trip
=
np
.
full
((
self
.
trucks
,
2
),
-
1
)
for
i
in
range
(
self
.
trucks
):
session_mysql
.
commit
()
truck_id
=
self
.
truck_index_to_uuid_dict
[
i
]
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
# print("truck_task:", truck_id, task)
item
=
session_mysql
.
query
(
EquipmentPair
)
.
filter_by
(
truck_id
=
truck_id
,
isdeleted
=
0
)
.
first
()
# if task in heavy_task_set:
# print(item.id, item.truck_id, item.exactor_id, item.dump_id, item.isdeleted)
try
:
if
task
in
empty_task_set
+
heavy_task_set
:
if
item
is
None
:
raise
Exception
(
"矿卡配对关系不存在"
)
except
Exception
as
es
:
print
(
es
)
logger
.
warning
(
es
)
return
state
=
self
.
truck_current_state
[
self
.
truck_index_to_uuid_dict
[
i
]]
# 若矿卡状态为空运
if
task
in
empty_task_set
:
# print("读取空载行程")
# print(item.exactor_id, item.dump_id)
# 若矿卡从低停车场空运出发????????
# if task == 0:
# last_unload_time = self.relative_last_unload_time[self.truck_index_to_uuid_dict[i]]
# # 开始区域id
# # 开始区域序号
# start_area_index = -1
# # 结束区域id
# end_area_id = self.excavator_uuid_to_load_area_uuid_dict[item.exactor_id]
# # 结束区域序号
# end_area_index = load_area_uuid_to_index_dict[end_area_id]
# self.truck_current_trip[i] = [-1, self.excavator_uuid_to_index_dict[item.exactor_id]]
# self.cur_truck_reach_shovel[i] = last_unload_time + self.com_time_area[start_area_index][
# end_area_index]
# else:
last_unload_time
=
self
.
relative_last_unload_time
[
self
.
truck_index_to_uuid_dict
[
i
]]
# 开始区域id
start_area_id
=
self
.
dump_uuid_to_unload_area_uuid_dict
[
item
.
dump_id
]
# 开始区域序号
start_area_index
=
unload_area_uuid_to_index_dict
[
start_area_id
]
end_area_id
=
self
.
excavator_uuid_to_load_area_uuid_dict
[
item
.
exactor_id
]
end_area_index
=
load_area_uuid_to_index_dict
[
end_area_id
]
self
.
truck_current_trip
[
i
]
=
[
self
.
dump_uuid_to_index_dict
[
item
.
dump_id
],
self
.
excavator_uuid_to_index_dict
[
item
.
exactor_id
]]
# if truck_uuid_to_name_dict[self.truck_index_to_uuid_dict[i]] in tmp_set:
# print("here")
# self.cur_truck_reach_shovel[i] = last_unload_time + 10 * self.com_time_area[start_area_index][
# end_area_index]
# else:
self
.
cur_truck_reach_shovel
[
i
]
=
last_unload_time
+
self
.
com_time_area
[
start_area_index
][
end_area_index
]
# 若矿卡状态为重载
elif
task
in
heavy_task_set
:
# print("读取重载行程")
# print(item.exactor_id, item.dump_id)
last_load_time
=
self
.
relative_last_load_time
[
self
.
truck_index_to_uuid_dict
[
i
]]
# 开始区域id
start_area_id
=
self
.
excavator_uuid_to_load_area_uuid_dict
[
item
.
exactor_id
]
# 开始区域序号
start_area_index
=
load_area_uuid_to_index_dict
[
start_area_id
]
# 结束区域id
end_area_id
=
self
.
dump_uuid_to_unload_area_uuid_dict
[
item
.
dump_id
]
# 结束区域序号
end_area_index
=
unload_area_uuid_to_index_dict
[
end_area_id
]
self
.
truck_current_trip
[
i
]
=
[
self
.
excavator_uuid_to_index_dict
[
item
.
exactor_id
],
self
.
dump_uuid_to_index_dict
[
item
.
dump_id
]]
self
.
cur_truck_reach_dump
[
i
]
=
last_load_time
+
self
.
go_time_area
[
end_area_index
][
start_area_index
]
# 其他状态,矿卡状态为-2,equipment_pair表不存在该矿卡
else
:
pass
self
.
truck_current_trip
.
flatten
()
# print("当前矿卡行程:")
# print(self.truck_current_trip)
################################################################################################################
# 读取卸点产量
################################################################################################################
# 卸载目标产量
# self.dump_target_mass = (np.array(session_mysql.query(Dump.target_mass).all())).flatten()
self
.
dump_target_mass
=
np
.
full
(
self
.
dumps
,
dump_target_mass
)
################################################################################################################
# 读取挖机产量
################################################################################################################
# 电铲目标产量
# self.shovel_target_mass = (np.array(session_mysql.query(Excavator.target_mass).all())).flatten()
self
.
shovel_target_mass
=
np
.
full
(
self
.
shovels
,
shovel_target_mass
)
################################################################################################################
# 计算挖机与卸载点预估产量
################################################################################################################
self
.
pre_dump_real_mass
=
copy
.
deepcopy
(
self
.
cur_dump_real_mass
)
self
.
pre_shovel_real_mass
=
copy
.
deepcopy
(
self
.
cur_shovel_real_mass
)
for
i
in
range
(
self
.
trucks
):
# task = self.truck_current_stage[i][0]
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
self
.
truck_current_trip
[
i
][
1
]
# 若矿卡正常行驶,需要将该部分载重计入实时产量
if
task
in
empty_task_set
or
(
task
==
-
1
and
state
==
4
):
self
.
pre_shovel_real_mass
[
end_area_index
]
=
self
.
pre_shovel_real_mass
[
end_area_index
]
+
self
.
payload
[
i
]
elif
task
in
heavy_task_set
or
(
task
==
-
1
and
state
==
5
):
self
.
pre_dump_real_mass
[
end_area_index
]
=
self
.
pre_dump_real_mass
[
end_area_index
]
+
self
.
payload
[
i
]
else
:
pass
################################################################################################################
# 矿卡抵达时间
################################################################################################################
now
=
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
shovel_ava_ls
=
[[]
for
_
in
range
(
self
.
shovels
)]
dump_ava_ls
=
[[]
for
_
in
range
(
self
.
dumps
)]
for
i
in
range
(
self
.
trucks
):
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
end_area_index
=
self
.
truck_current_trip
[
i
][
1
]
if
task
in
empty_task_set
:
reach_time
=
self
.
cur_truck_reach_shovel
[
i
]
shovel_ava_ls
[
end_area_index
]
.
append
([
reach_time
,
i
,
end_area_index
])
elif
task
in
heavy_task_set
:
reach_time
=
self
.
cur_truck_reach_dump
[
i
]
dump_ava_ls
[
end_area_index
]
.
append
([
reach_time
,
i
,
end_area_index
])
elif
task
==
-
2
:
self
.
cur_truck_ava_time
[
i
]
=
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
################################################################################################################
# 挖机可用时间
################################################################################################################
for
reach_ls
in
shovel_ava_ls
:
if
len
(
reach_ls
)
!=
0
:
reach_ls
=
np
.
array
(
reach_ls
)
tmp
=
reach_ls
[
np
.
lexsort
(
reach_ls
[:,
::
-
1
]
.
T
)]
for
i
in
range
(
len
(
tmp
)):
shovel_index
=
int
(
tmp
[
i
][
2
])
self
.
cur_shovel_ava_time
[
shovel_index
]
=
max
(
tmp
[
i
][
0
],
self
.
cur_shovel_ava_time
[
shovel_index
])
+
\
self
.
loading_time
[
shovel_index
]
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])]
=
self
.
cur_shovel_ava_time
[
shovel_index
]
# 若挖机可用时间严重偏离,进行修正
if
abs
(
self
.
cur_shovel_ava_time
[
shovel_index
]
-
now
)
>
60
:
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])]
=
now
if
abs
(
self
.
cur_shovel_ava_time
[
shovel_index
]
-
now
)
>
60
:
self
.
cur_shovel_ava_time
[
shovel_index
]
=
now
################################################################################################################
# 卸点可用时间
################################################################################################################
# dump_index = 0
for
reach_ls
in
dump_ava_ls
:
if
len
(
reach_ls
)
!=
0
:
reach_ls
=
np
.
array
(
reach_ls
)
tmp
=
reach_ls
[
np
.
lexsort
(
reach_ls
[:,
::
-
1
]
.
T
)]
for
i
in
range
(
len
(
tmp
)):
dump_index
=
int
(
tmp
[
i
][
2
])
self
.
cur_dump_ava_time
[
dump_index
]
=
max
(
tmp
[
i
][
0
],
self
.
cur_dump_ava_time
[
dump_index
])
+
\
self
.
unloading_time
[
dump_index
]
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])]
=
self
.
cur_dump_ava_time
[
dump_index
]
# 若卸点可用时间严重偏离,进行修正
if
abs
(
self
.
cur_dump_ava_time
[
dump_index
]
-
now
)
>
60
:
self
.
cur_dump_ava_time
[
dump_index
]
=
now
if
abs
(
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])]
-
now
)
>
60
:
self
.
cur_truck_ava_time
[
int
(
tmp
[
i
][
1
])]
=
now
# dump_index = dump_index + 1
logger
.
info
(
'f{周期更新结束}'
)
def
reset
(
self
):
# 卡车抵达时间重置
self
.
sim_truck_reach_dump
=
copy
.
deepcopy
(
self
.
cur_truck_reach_dump
)
self
.
sim_truck_reach_shovel
=
copy
.
deepcopy
(
self
.
cur_truck_reach_shovel
)
# 设备可用时间重置
self
.
sim_truck_ava_time
=
copy
.
deepcopy
(
self
.
cur_truck_ava_time
)
self
.
sim_shovel_ava_time
=
copy
.
deepcopy
(
self
.
cur_shovel_ava_time
)
self
.
sim_dump_ava_time
=
copy
.
deepcopy
(
self
.
cur_dump_ava_time
)
# 电铲\卸载点产量重置
self
.
sim_dump_real_mass
=
copy
.
deepcopy
(
self
.
pre_dump_real_mass
)
self
.
sim_shovel_real_mass
=
copy
.
deepcopy
(
self
.
pre_shovel_real_mass
)
def
truck_schedule_send_post
(
self
,
truck_id
):
truck_index
=
self
.
truck_uuid_to_index_dict
[
truck_id
]
trip
=
self
.
truck_current_trip
[
truck_index
]
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
truck_index
]]
# state = self.truck_current_state[self.truck_index_to_uuid_dict[truck_index]]
now
=
(
datetime
.
now
()
-
self
.
start_time
)
/
timedelta
(
hours
=
0
,
minutes
=
1
,
seconds
=
0
)
logger
.
info
(
" "
)
logger
.
info
(
f
'调度矿卡{truck_id} {truck_uuid_to_name_dict[truck_id]}'
)
#
# print(f'矿卡可用时间:{truck_uuid_to_name_dict[truck_id]}')
# print(self.sim_truck_ava_time[self.truck_uuid_to_index_dict[truck_id]])
#
# print(f'挖机可用时间:')
# print(self.sim_shovel_ava_time)
#
# print(f'卸点可用时间:')
# print(self.sim_dump_ava_time)
target
=
0
if
task
==
-
2
:
# print("矿卡状态:矿卡启动或故障恢复")
# print("矿卡行程:无")
# print("涉及电铲:")
# print(list(self.excavator_uuid_to_index_dict.keys()))
# print("电铲饱和度:")
# print(10 * (1 - self.sim_shovel_real_mass / self.shovel_target_mass))
# print("行程时间:")
# print((np.maximum(self.sim_shovel_ava_time,
# now + self.park_to_load_eq[0, :]) + self.loading_time
# - now))
# print("行驶时间:")
# print(self.park_to_load_eq[0, :] + self.loading_time)
logger
.
info
(
"矿卡状态:矿卡启动或故障恢复"
)
logger
.
info
(
"矿卡行程:无"
)
logger
.
info
(
f
'涉及电铲:{list(self.excavator_uuid_to_index_dict.keys())}'
)
logger
.
info
(
f
'电铲饱和度:{(1 - self.sim_shovel_real_mass / self.shovel_target_mass)}'
)
logger
.
info
(
f
'行程时间:{(np.maximum(self.sim_shovel_ava_time, now + self.park_to_load_eq[0, :]) + self.loading_time - now)}'
)
logger
.
info
(
f
'行驶时间:{self.park_to_load_eq[0, :] + self.loading_time}'
)
target
=
np
.
argmax
(
10
*
(
1
-
self
.
sim_shovel_real_mass
/
self
.
shovel_target_mass
)
/
(
np
.
maximum
(
self
.
sim_shovel_ava_time
,
now
+
self
.
park_to_load_eq
[
0
,
:])
+
self
.
loading_time
-
now
))
# print("目的地: ", self.excavator_index_to_uuid_dict[target])
logger
.
info
(
f
'目的地:{self.excavator_index_to_uuid_dict[target]}'
)
if
task
in
empty_task_set
:
# print("矿卡状态:矿卡空载")
# print("矿卡行程:", self.dump_index_to_uuid_dict[trip[0]], self.excavator_index_to_uuid_dict[trip[1]])
# print("涉及卸点:")
# print(list(self.dump_uuid_to_index_dict.keys()))
# print("卸点饱和度:")
# print(10 * (1 - self.sim_dump_real_mass / self.dump_target_mass))
# print("行程时间:")
# print((np.maximum(self.sim_dump_ava_time,
# # self.sim_truck_reach_shovel[truck_index] + self.loading_time[trip[1]]
# self.sim_truck_ava_time[truck_index]
# + self.go_time_eq[:, trip[1]]) + self.unloading_time
# - self.sim_truck_ava_time[truck_index]))
# # print("卸载时间:")
# # print(self.unloading_time)
# print("行驶时间:")
# print(self.go_time_eq[:, trip[1]] + self.unloading_time)
logger
.
info
(
"矿卡状态:矿卡空载"
)
logger
.
info
(
f
'矿卡行程:{self.dump_index_to_uuid_dict[trip[0]]}-{self.excavator_index_to_uuid_dict[trip[1]]}'
)
logger
.
info
(
f
'涉及卸点:{list(self.dump_uuid_to_index_dict.keys())}'
)
logger
.
info
(
f
'卸点饱和度:{(1 - self.sim_dump_real_mass / self.dump_target_mass)}'
)
logger
.
info
(
f
'行程时间:{(np.maximum(self.sim_dump_ava_time,self.sim_truck_ava_time[truck_index] + self.go_time_eq[:, trip[1]]) + self.unloading_time - self.sim_truck_ava_time[truck_index])}'
)
logger
.
info
(
f
'行驶时间:{self.go_time_eq[:, trip[1]] + self.unloading_time}'
)
# 卡车空载,计算下一次卸载点
# start_area_index = self.excavator_index_to_load_area_index_dict[trip[1]]
target
=
np
.
argmax
(
10
*
(
1
-
self
.
sim_dump_real_mass
/
self
.
dump_target_mass
)
/
(
np
.
maximum
(
self
.
sim_dump_ava_time
,
# self.sim_truck_reach_shovel[truck_index] + self.loading_time[trip[1]]
self
.
sim_truck_ava_time
[
truck_index
]
+
self
.
go_time_eq
[:,
trip
[
1
]])
+
self
.
unloading_time
-
self
.
sim_truck_ava_time
[
truck_index
]))
# print("目的地: ", self.dump_index_to_uuid_dict[target])
logger
.
info
(
f
'目的地:{self.dump_index_to_uuid_dict[target]}'
)
elif
task
in
heavy_task_set
:
# print("矿卡状态:矿卡重载")
# print("矿卡行程:", self.excavator_index_to_uuid_dict[trip[0]], self.dump_index_to_uuid_dict[trip[1]])
# print("涉及电铲:")
# print(list(self.excavator_uuid_to_index_dict.keys()))
# print("电铲饱和度:")
# print(10 * (1 - self.sim_shovel_real_mass / self.shovel_target_mass))
# print("装载时间:")
# print(self.loading_time)
# print("行程时间:")
# print((np.maximum(self.sim_shovel_ava_time,
# self.sim_truck_ava_time[truck_index]
# + self.com_time_eq[trip[1], :]) + self.loading_time
# - self.sim_truck_ava_time[truck_index]))
# print("行驶时间:")
# print(self.com_time_eq[trip[1], :])
logger
.
info
(
"矿卡状态:矿卡重载"
)
logger
.
info
(
f
'矿卡行程:{self.excavator_index_to_uuid_dict[trip[0]]}-{self.dump_index_to_uuid_dict[trip[1]]}'
)
logger
.
info
(
f
'涉及卸点:{list(self.excavator_uuid_to_index_dict.keys())}'
)
logger
.
info
(
f
'卸点饱和度:{(1 - self.sim_shovel_real_mass / self.shovel_target_mass)}'
)
logger
.
info
(
f
'行程时间:{(np.maximum(self.sim_shovel_ava_time,self.sim_truck_ava_time[truck_index] + self.com_time_eq[trip[1], :]) + self.loading_time - self.sim_truck_ava_time[truck_index])}'
)
logger
.
info
(
f
'行驶时间:{self.com_time_eq[trip[1], :] + self.loading_time}'
)
# 卡车重载,计算下一次装载点
# start_area_index = self.dump_index_to_unload_area_index_dict[trip[1]]
target
=
np
.
argmax
(
10
*
(
1
-
self
.
sim_shovel_real_mass
/
self
.
shovel_target_mass
)
/
(
np
.
maximum
(
self
.
sim_shovel_ava_time
,
self
.
sim_truck_ava_time
[
truck_index
]
+
self
.
com_time_eq
[
trip
[
1
],
:])
+
self
.
loading_time
-
self
.
sim_truck_ava_time
[
truck_index
]))
# print("目的地: ", self.excavator_index_to_uuid_dict[target])
logger
.
info
(
f
'目的地:{self.excavator_index_to_uuid_dict[target]}'
)
return
target
def
solution_construct
(
self
):
# Seq初始化
Seq
=
[[
self
.
truck_current_trip
[
i
][
1
],
-
1
]
for
i
in
range
(
self
.
trucks
)]
# 根据矿卡最早可用时间顺序进行规划
temp
=
copy
.
deepcopy
(
self
.
cur_truck_ava_time
)
for
i
in
range
(
self
.
trucks
):
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
if
task
==
-
2
:
temp
[
i
]
=
temp
[
i
]
+
M
index
=
np
.
argsort
(
temp
.
reshape
(
1
,
-
1
))
index
=
index
.
flatten
()
for
truck
in
index
:
if
len
(
Seq
[
truck
])
>
0
:
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
truck
]]
state
=
self
.
truck_current_state
[
self
.
truck_index_to_uuid_dict
[
truck
]]
end_eq_index
=
self
.
truck_current_trip
[
truck
][
1
]
target_eq_index
=
self
.
truck_schedule_send_post
(
self
.
truck_index_to_uuid_dict
[
truck
])
Seq
[
truck
][
1
]
=
target_eq_index
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
]
+
self
.
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
]
+
self
.
go_time_area
[
target_area_index
][
end_area_index
],
)
+
self
.
unloading_time
[
target_eq_index
]
)
elif
task
in
heavy_task_set
or
(
task
==
-
1
and
state
==
5
):
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_shovel_real_mass
[
target_eq_index
]
=
self
.
sim_shovel_real_mass
[
target_eq_index
]
+
\
self
.
payload
[
truck
]
# 预计装载点可用时间更新
self
.
sim_shovel_ava_time
[
target_eq_index
]
=
(
max
(
self
.
sim_shovel_ava_time
[
target_eq_index
],
self
.
sim_truck_ava_time
[
truck
]
+
self
.
go_time_area
[
end_area_index
][
target_area_index
],
)
+
self
.
loading_time
[
target_eq_index
]
)
# elif task == -2 or state == 7:
# target_area_index = self.excavator_index_to_load_area_index_dict[target_eq_index]
# # 更新变量,预计产量更新
# self.sim_shovel_real_mass[target_eq_index] = self.sim_shovel_real_mass[target_eq_index] + \
# self.payload[
# truck]
# # 预计装载点可用时间更新
# self.sim_shovel_ava_time[target_eq_index] = (
# max(
# self.sim_shovel_ava_time[target_eq_index],
# self.sim_truck_ava_time[truck]
# + self.park_to_load_area[0][target_area_index],
# )
# + self.loading_time[target_eq_index]
# )
else
:
pass
for
i
in
range
(
len
(
Seq
)):
record
=
{
"truckId"
:
self
.
truck_index_to_uuid_dict
[
i
]}
task
=
self
.
truck_current_task
[
self
.
truck_index_to_uuid_dict
[
i
]]
state
=
self
.
truck_current_state
[
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
# json_value = json.loads(redis5.get(self.truck_index_to_uuid_dict[i]))
#
# if json_value is not None:
#
# record["exactorId"] = json_value.get('exactorId')
# record["dumpId"] = json_value.get('dumpId')
# record["loadAreaId"] = json_value.get('loadAreaId')
# record["unloadAreaId"] = json_value.get('unloadAreaId')
# record["dispatchId"] = json_value.get('dispatchId')
# record["isdeleted"] = json_value.get('isdeleted')
# record["creator"] = json_value.get('creator')
# record["createtime"] = json_value.get('createtime')
# else:
# 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')
redis5
.
set
(
self
.
truck_index_to_uuid_dict
[
i
],
str
(
json
.
dumps
(
record
)))
for
i
in
range
(
self
.
trucks
):
print
(
"dispatch_setting:"
)
print
(
redis5
.
get
(
self
.
truck_index_to_uuid_dict
[
i
]))
return
Seq
def
process
(
obj
):
session_mysql
.
commit
()
session_mysql
.
flush
()
obj
.
update
()
obj
.
reset
()
obj
.
solution_construct
()
scheduler
=
sched
.
scheduler
(
time
.
time
,
time
.
sleep
)
def
perform
(
inc
,
obj
):
scheduler
.
enter
(
inc
,
0
,
perform
,
(
inc
,
obj
))
process
(
obj
)
def
main
(
inc
,
obj
):
scheduler
.
enter
(
0
,
0
,
perform
,
(
inc
,
obj
))
scheduler
.
run
()
if
__name__
==
"__main__"
:
logger
.
info
(
" "
)
logger
.
info
(
"调度系统启动"
)
obj
=
Dispatcher
()
main
(
60
,
obj
)
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