Commit 430230f1 authored by 张晓彤's avatar 张晓彤

二次调度不再绑定启动

parent dcdedf9e
...@@ -20,16 +20,21 @@ class Dispatcher: ...@@ -20,16 +20,21 @@ class Dispatcher:
""" """
class for group dispatch program. class for group dispatch program.
""" """
def __init__(self, truck: TruckInfo, dump: DumpInfo, excavator: ExcavatorInfo, pre_sch: PreSchedule, request_mode=False): def __init__(self, truck: TruckInfo, dump: DumpInfo, excavator: ExcavatorInfo, pre_sch: PreSchedule,
request_mode=False, active=False):
self.group_list = {} self.group_list = {}
self.truck = truck self.truck = truck
self.dump = dump self.dump = dump
self.excavator = excavator self.excavator = excavator
self.pre_sch = pre_sch self.pre_sch = pre_sch
self.request_mode = request_mode self.request_mode = request_mode
self.topo = graph_construct()
self.submission = DispatchSubmission(dump, excavator, truck, self.topo)
self.logger = get_logger("zxt.dispatcher") self.logger = get_logger("zxt.dispatcher")
self.redispatch_active = active
if self.redispatch_active:
self.topo = graph_construct()
else:
self.topo = None
self.submission = DispatchSubmission(dump, excavator, truck, self.topo)
def period_update(self): def period_update(self):
""" """
...@@ -41,7 +46,10 @@ class Dispatcher: ...@@ -41,7 +46,10 @@ class Dispatcher:
self.excavator.excavator_para_period_update() self.excavator.excavator_para_period_update()
self.truck.truck_para_period_update(self.dump, self.excavator) self.truck.truck_para_period_update(self.dump, self.excavator)
self.truck.state_period_update() self.truck.state_period_update()
self.topo = graph_construct() if self.redispatch_active:
self.topo = graph_construct()
else:
self.topo = None
def group_generate(self): def group_generate(self):
""" """
......
...@@ -323,7 +323,8 @@ class GroupDispatcher: ...@@ -323,7 +323,8 @@ class GroupDispatcher:
""" """
self.logger = logging.getLogger("zxt.GroupDispatcher") self.logger = logging.getLogger("zxt.GroupDispatcher")
self.group = group self.group = group
self.redispatcher = ReDispatcher(self.group) if self.group.topo is not None:
self.redispatcher = ReDispatcher(self.group)
def group_dispatch(self, Solver) -> Mapping[str, List[str]]: def group_dispatch(self, Solver) -> Mapping[str, List[str]]:
""" """
...@@ -566,60 +567,66 @@ class GroupDispatcher: ...@@ -566,60 +567,66 @@ class GroupDispatcher:
self.logger.error(es) self.logger.error(es)
truck_dispatch[i] = [None, None] truck_dispatch[i] = [None, None]
elif truck_task == 0: elif truck_task == 0:
if i in self.group.truck.get_truck_locate_dict(): if self.group.topo is not None:
truck_locate = self.group.truck.get_truck_locate_dict()[i] if i in self.group.truck.get_truck_locate_dict():
truck_locate = self.group.truck.get_truck_locate_dict()[i]
else:
self.logger.error(f'车辆 {i} 位置信息丢失')
truck_dispatch[i] = [None, None]
return
self.logger.info(self.group.truck.truck_is_temp)
try:
truck_is_temp = self.group.truck.truck_is_temp[i]
except Exception as es:
truck_is_temp = False
self.logger.error("车辆临时字段异常")
self.logger.error(es)
# 车辆当前位于交叉路口前,且排队等待
self.logger.info("潜在二次调度车辆状态")
self.logger.info(f'车辆 {i}')
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
self.logger.info(self.group.topo.cross_bf_lanes)
self.logger.info(self.group.truck.truck_current_state)
self.logger.info(truck_is_temp)
# if (truck_locate in self.topo.cross_bf_lanes) and (self.truck.truck_current_state[truck_id] == 2) \
# and (not truck_is_temp):
if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2):
self.logger.info("触发二次调度")
# self.redispatch_to_excavator(i, truck_dispatch, truck_locate)
self.redispatcher.redispatch_to_excavator(i, truck_dispatch, truck_locate)
else: else:
self.logger.error(f'车辆 {i} 位置信息丢失') pass
truck_dispatch[i] = [None, None]
return
self.logger.info(self.group.truck.truck_is_temp)
try:
truck_is_temp = self.group.truck.truck_is_temp[i]
except Exception as es:
truck_is_temp = False
self.logger.error("车辆临时字段异常")
self.logger.error(es)
# 车辆当前位于交叉路口前,且排队等待
self.logger.info("潜在二次调度车辆状态")
self.logger.info(f'车辆 {i}')
self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
self.logger.info(self.group.topo.cross_bf_lanes)
self.logger.info(self.group.truck.truck_current_state)
self.logger.info(truck_is_temp)
# if (truck_locate in self.topo.cross_bf_lanes) and (self.truck.truck_current_state[truck_id] == 2) \
# and (not truck_is_temp):
if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2):
self.logger.info("触发二次调度")
# self.redispatch_to_excavator(i, truck_dispatch, truck_locate)
self.redispatcher.redispatch_to_excavator(i, truck_dispatch, truck_locate)
elif truck_task == 3: elif truck_task == 3:
try: if self.group.topo is not None:
truck_locate = self.group.truck.get_truck_locate_dict()[i] try:
except Exception as es: truck_locate = self.group.truck.get_truck_locate_dict()[i]
self.logger.error("车辆位置信息丢失") except Exception as es:
self.logger.error(es) self.logger.error("车辆位置信息丢失")
truck_dispatch[i] = [None, None] self.logger.error(es)
return truck_dispatch[i] = [None, None]
try: return
truck_is_temp = self.group.truck.truck_is_temp[i] try:
except Exception as es: truck_is_temp = self.group.truck.truck_is_temp[i]
truck_is_temp = False except Exception as es:
self.logger.error("车辆临时字段异常") truck_is_temp = False
self.logger.error(es) self.logger.error("车辆临时字段异常")
self.logger.info(f'车辆位置 {truck_locate}') self.logger.error(es)
self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}') self.logger.info(f'车辆位置 {truck_locate}')
self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}') self.logger.info(f'车辆状态 {self.group.truck.truck_current_state[i]}')
# 车辆当前位于交叉路口前,且排队等待 self.logger.info(f'车辆临时 {truck_is_temp} {type(truck_is_temp)}')
if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2) \ # 车辆当前位于交叉路口前,且排队等待
and (not truck_is_temp): if (truck_locate in self.group.topo.cross_bf_lanes) and (self.group.truck.truck_current_state[i] == 2) \
and (not truck_is_temp):
# self.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
self.redispatcher.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip) # self.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
self.redispatcher.redispatch_to_dump(i, truck_dispatch, truck_locate, truck_trip)
else:
pass
# def redispatch_to_dump(self, truck_id: str, truck_dispatch: Mapping[str, List[str]], truck_locate: str, truck_trip: List[int]): # def redispatch_to_dump(self, truck_id: str, truck_dispatch: Mapping[str, List[str]], truck_locate: str, truck_trip: List[int]):
# """ # """
......
...@@ -124,25 +124,27 @@ class DispatchSubmission: ...@@ -124,25 +124,27 @@ class DispatchSubmission:
# TODO: # TODO:
# 判断了两次是否拥堵,需要改善 # 判断了两次是否拥堵,需要改善
# 车辆重载等待,且前方道路阻塞 if self.topo is not None:
if task == 3 and state == 2 and truck_id in self.truck.get_truck_locate_dict() and \
self.truck.get_truck_locate_dict()[truck_id] in self.topo.cross_bf_lanes: # 车辆重载等待,且前方道路阻塞
# try: if task == 3 and state == 2 and truck_id in self.truck.get_truck_locate_dict() and \
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]: self.truck.get_truck_locate_dict()[truck_id] in self.topo.cross_bf_lanes:
self.logger.info("二次调度前往卸载区") # try:
record["isTemp"] = True # 避免反复修改 # if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
POST(truck_id) self.logger.info("二次调度前往卸载区")
# else: record["isTemp"] = True # 避免反复修改
# self.logger.info("车辆已完成二次调度-无需更改派车计划") POST(truck_id)
# else:
# except Exception as es: # self.logger.info("车辆已完成二次调度-无需更改派车计划")
# self.logger.error(es)
# self.logger.error("二次调度失败") # except Exception as es:
# record["isTemp"] = False # self.logger.error(es)
# redis5.set(truck_id, str(json.dumps(record))) # self.logger.error("二次调度失败")
else: # record["isTemp"] = False
self.logger.info("正常调度前往卸载区") # redis5.set(truck_id, str(json.dumps(record)))
record["isTemp"] = False else:
self.logger.info("正常调度前往卸载区")
record["isTemp"] = False
self.logger.info(f'redis 注入 {record}') self.logger.info(f'redis 注入 {record}')
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
...@@ -180,26 +182,28 @@ class DispatchSubmission: ...@@ -180,26 +182,28 @@ class DispatchSubmission:
# try: # try:
record = redis_format(truck_id, group_id, str(uuid.uuid1()), item) record = redis_format(truck_id, group_id, str(uuid.uuid1()), item)
# 车辆重载等待,且前方道路阻塞 if self.topo is not None:
if task == 0 and state == 2 and truck_id in self.truck.get_truck_locate_dict() and \
self.truck.get_truck_locate_dict()[truck_id] in self.topo.cross_bf_lanes: # 车辆重载等待,且前方道路阻塞
# 车辆停车等待 if task == 0 and state == 2 and truck_id in self.truck.get_truck_locate_dict() and \
# try: self.truck.get_truck_locate_dict()[truck_id] in self.topo.cross_bf_lanes:
# if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]: # 车辆停车等待
self.logger.info("二次调度前往装载区") # try:
record["isTemp"] = True # 避免反复修改 # if truck_id in self.truck.truck_is_temp and not self.truck.truck_is_temp[truck_id]:
POST(truck_id) self.logger.info("二次调度前往装载区")
# else: record["isTemp"] = True # 避免反复修改
# self.logger.info("车辆已完成二次调度-无需更改派车计划") POST(truck_id)
# except Exception as es: # else:
# self.logger.error(es) # self.logger.info("车辆已完成二次调度-无需更改派车计划")
# self.logger.error("二次调度失败") # except Exception as es:
# record["isTemp"] = False # self.logger.error(es)
# redis5.set(truck_id, str(json.dumps(record))) # self.logger.error("二次调度失败")
# record["isTemp"] = False
else: # redis5.set(truck_id, str(json.dumps(record)))
self.logger.info("正常调度前往装载区")
record["isTemp"] = False else:
self.logger.info("正常调度前往装载区")
record["isTemp"] = False
self.logger.info(f'redis 注入 {record}') self.logger.info(f'redis 注入 {record}')
redis5.set(truck_id, str(json.dumps(record))) redis5.set(truck_id, str(json.dumps(record)))
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
import numpy as np import numpy as np
from settings import * from settings import *
from tables import *
import pandas as pd import pandas as pd
from tables import DispatchMatch, DispatchEquipment from tables import DispatchMatch, DispatchEquipment
from bidict import bidict from bidict import bidict
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
from data.static_data_process import * from data.static_data_process import *
from settings import * from settings import *
from tables import *
import numpy as np import numpy as np
# 全局参数设定 # 全局参数设定
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
# 静态数据处理(函数名即为注释) # 静态数据处理(函数名即为注释)
from settings import * from settings import *
from tables import *
logger = get_logger("zxt.static_data_process") logger = get_logger("zxt.static_data_process")
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
from data.para_config import * from data.para_config import *
from settings import * from settings import *
from tables import *
# 卸载设备类 # 卸载设备类
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
from data.para_config import * from data.para_config import *
from settings import * from settings import *
from tables import *
# 挖机设备类 # 挖机设备类
......
# from para_config import * # from para_config import *
from settings import * from settings import *
from tables import *
import numpy as np import numpy as np
import sched import sched
import time import time
......
...@@ -19,6 +19,7 @@ from core.schedule import PreSchedule ...@@ -19,6 +19,7 @@ from core.schedule import PreSchedule
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
from util import CoreException from util import CoreException
from core.group import direct2redis from core.group import direct2redis
import argparse
def process(dispatcher): def process(dispatcher):
...@@ -130,6 +131,16 @@ def main(inc, dispatcher): ...@@ -130,6 +131,16 @@ def main(inc, dispatcher):
if __name__ == "__main__": if __name__ == "__main__":
# 创建参数解析器
parser = argparse.ArgumentParser(description='argparse some parameters.')
# 添加参数
parser.add_argument('--active', action='store_true', help='active re-dispatch?')
# 参数解析
args = parser.parse_args()
redispatch_active = args.active
# 初始化日志 # 初始化日志
set_log() set_log()
# 获取日志器 # 获取日志器
...@@ -150,7 +161,7 @@ if __name__ == "__main__": ...@@ -150,7 +161,7 @@ if __name__ == "__main__":
pre_sch = PreSchedule(truck, excavator, dump) pre_sch = PreSchedule(truck, excavator, dump)
# 实例化矿卡调度器 # 实例化矿卡调度器
dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False) dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False, redispatch_active)
logger.info(" ") logger.info(" ")
logger.info("调度系统启动") logger.info("调度系统启动")
......
...@@ -17,6 +17,7 @@ import time ...@@ -17,6 +17,7 @@ import time
from core.dispatcher import Dispatcher from core.dispatcher import Dispatcher
from core.schedule import PreSchedule from core.schedule import PreSchedule
from data.dispatchInfo import DispatchInfo from data.dispatchInfo import DispatchInfo
import argparse
def direct2redis(): def direct2redis():
...@@ -150,6 +151,18 @@ def main(inc, dispatcher): ...@@ -150,6 +151,18 @@ def main(inc, dispatcher):
if __name__ == "__main__": if __name__ == "__main__":
# 创建参数解析器
parser = argparse.ArgumentParser(description='argparse some parameters.')
# 添加参数
parser.add_argument('--active', action='store_true', help='active re-dispatch?')
parser.add_argument('--sqlserver', action='store_true', help='use SQLserver?')
# 参数解析
args = parser.parse_args()
redispatch_active = args.active
# 初始化日志 # 初始化日志
set_log() set_log()
# 获取日志器 # 获取日志器
...@@ -170,7 +183,7 @@ if __name__ == "__main__": ...@@ -170,7 +183,7 @@ if __name__ == "__main__":
pre_sch = PreSchedule(truck, excavator, dump) pre_sch = PreSchedule(truck, excavator, dump)
# 实例化矿卡调度器 # 实例化矿卡调度器
dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False) dispatcher = Dispatcher(truck, dump, excavator, pre_sch, False, redispatch_active)
logger.info(" ") logger.info(" ")
logger.info("调度系统启动") logger.info("调度系统启动")
......
...@@ -19,6 +19,8 @@ from datetime import datetime, timedelta ...@@ -19,6 +19,8 @@ from datetime import datetime, timedelta
import copy import copy
import json import json
global redispatch_active
json_file = "config.json" json_file = "config.json"
with open(json_file) as f: with open(json_file) as f:
......
#!/bin/bash #!/bin/bash
python3 topo_update_server.py python3 topo_update_server.py
nohup python3 realtime_dispatch.py >/dev/null 2>&1 & nohup python3 realtime_dispatch.py --active >/dev/null 2>&1 &
\ No newline at end of file \ No newline at end of file
...@@ -15,6 +15,7 @@ from sqlalchemy.orm import sessionmaker, scoped_session ...@@ -15,6 +15,7 @@ from sqlalchemy.orm import sessionmaker, scoped_session
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
from urllib.parse import quote from urllib.parse import quote
import json, os import json, os
from settings import *
relative_path = os.path.dirname(os.path.abspath(__file__)) # 获取当前文件夹的绝对路径 relative_path = os.path.dirname(os.path.abspath(__file__)) # 获取当前文件夹的绝对路径
json_file = os.path.join(relative_path, "config.json") json_file = os.path.join(relative_path, "config.json")
...@@ -83,63 +84,6 @@ session_postgre.expire_on_commit = False ...@@ -83,63 +84,6 @@ session_postgre.expire_on_commit = False
# 定义对象: # 定义对象:
# 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): class WalkTime(Base):
__tablename__ = 'work_area_distance' __tablename__ = 'work_area_distance'
...@@ -164,61 +108,6 @@ class WalkTime(Base): ...@@ -164,61 +108,6 @@ class WalkTime(Base):
self.to_unload_lanes = to_unload_lanes self.to_unload_lanes = to_unload_lanes
self.to_load_lanes = to_load_lanes self.to_load_lanes = to_load_lanes
# 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): class EquipmentPair(Base):
__tablename__ = 'sys_equipment_pair' __tablename__ = 'sys_equipment_pair'
...@@ -368,13 +257,6 @@ class WalkTimePark(Base): ...@@ -368,13 +257,6 @@ class WalkTimePark(Base):
self.park_load_lanes = park_load_lanes self.park_load_lanes = park_load_lanes
# class DispatchSetting(Base):
# __tablename__ = 'sys_dispatch_setting_v'
# id = Column(VARCHAR(36), primary_key=True)
#
# def __init__(self, id):
# self.id = id
class Equipment(Base): class Equipment(Base):
__tablename__ = 'sys_equipment' __tablename__ = 'sys_equipment'
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment