Commit db860cc7 authored by z5335534 Ao Guo's avatar z5335534 Ao Guo

空车智能,定铲派车,bug修复

parent 39d4f4f7
No preview for this file type
......@@ -157,9 +157,9 @@ class ExpectedTime(AlgorithmBase):
truck_avl_time = self.pre_sch.get_truck_avl_time(truck_id=truck_id)
group_dynamic_excavator_num = len(self.group.dump)
group_dynamic_excavator_num = len(self.group.excavator)
group_dynamic_dump_num = len(self.group.excavator)
group_dynamic_unload_area_num = len(self.group.unload_area)
except Exception as es:
self.logger.error("车辆调度信息读取异常")
......@@ -237,7 +237,7 @@ class ExpectedTime(AlgorithmBase):
excavator_group_index = self.group.excavator_uuid_index_dict[excavator_id]
# 车辆驶往各目的地时间
truck_reach_time = 60 * self.group.to_dump_distance[excavator_group_index, :] \
truck_reach_time = 60 * self.group.to_unload_area_distance[excavator_group_index, :] \
/ 1000 / self.truck.heavy_speed[truck_id] + truck_avl_time
# 车辆得到服务时间
......@@ -261,7 +261,7 @@ class ExpectedTime(AlgorithmBase):
except Exception as es:
self.logger.error("矿卡空载调度异常")
self.logger.error(es)
transport_value = np.zeros(group_dynamic_dump_num)
transport_value = np.zeros(group_dynamic_unload_area_num)
elif task in [3, 4, 5]:
################################################ 矿卡重载 ###############################################
......@@ -286,10 +286,10 @@ class ExpectedTime(AlgorithmBase):
dump_id = DeviceMap.dump_index_to_uuid_dict[int(trip[1])]
# 卸点对应分组编号
dump_group_index = self.group.dump_uuid_index_dict[dump_id]
unload_area_group_index = self.group.unload_area_uuid_index_dict[unload_area_id]
# 车辆驶往各目的地时间
truck_reach_time = 60 * self.group.to_excavator_distance[dump_group_index, :] \
truck_reach_time = 60 * self.group.to_excavator_distance[unload_area_group_index, :] \
/ 1000 / self.truck.empty_speed[truck_id] + truck_avl_time
# 计算车辆得到服务时间
......@@ -301,7 +301,7 @@ class ExpectedTime(AlgorithmBase):
except Exception as es:
self.logger.error("矿卡重载调度异常")
self.logger.error(es)
transport_value = np.zeros(group_dynamic_dump_num)
transport_value = np.zeros(group_dynamic_unload_area_num)
return transport_value
{
"para": {
"log_path": "/usr/local/fleet-log/dispatch",
"log_path": "/Users/guoao/Desktop/work_log/wek46/code_1/integrated-scheduling-v4/Logs",
"empty_speed": 17,
"heavy_speed": 17,
"dump_target_mass": 5000,
......@@ -27,4 +27,4 @@
"host": "192.168.9.152",
"password": "Huituo@123"
}
}
\ No newline at end of file
}
......@@ -51,7 +51,7 @@ class Dispatcher:
Generate and initialize dispatch groups.
:return: None
"""
for group_id in DispatchInfo.group_dump_dict.keys():
for group_id in DispatchInfo.group_excavator_dict.keys():
group = Group(group_id, self.truck, self.pre_sch)
self.group_list.append(group)
......@@ -69,6 +69,7 @@ class Dispatcher:
:return:
"""
for group in self.group_list:
truck_dispatch_plan_dict = group.group_dispatch(ExpectedTime)
self.logger.info(f'调度分组: {group.group_id} {DispatchInfo.group_name[group.group_id]}')
self.submission.group_dispatch_to_redis(group, truck_dispatch_plan_dict)
......@@ -112,10 +113,10 @@ class DispatchSubmission:
session_mysql.query(DispatchSetting)
.filter_by(
# exactor_id=dispatch_seq[0],
dump_id=dispatch_seq[1],
# dump_id=dispatch_seq[1],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
......@@ -125,7 +126,7 @@ class DispatchSubmission:
session_mysql.query(DispatchSetting)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
try:
record["id"] = item.id
......@@ -148,11 +149,11 @@ class DispatchSubmission:
item = (
session_mysql.query(DispatchSetting)
.filter_by(
exactor_id=dispatch_seq[0],
# exactor_id=dispatch_seq[0],
# dump_id=dispatch_seq[1],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
......@@ -161,7 +162,7 @@ class DispatchSubmission:
session_mysql.query(DispatchSetting)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
try:
record["id"] = item.id
record["exactorId"] = dispatch_seq[0]
......@@ -183,10 +184,10 @@ class DispatchSubmission:
item = (
session_mysql.query(DispatchSetting)
.filter_by(
exactor_id=dispatch_seq[0],
# exactor_id=dispatch_seq[0],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0).first())
isdeleted=0).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
......@@ -202,7 +203,7 @@ class DispatchSubmission:
session_mysql.query(DispatchSetting)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0).first())
isdeleted=0).first())
try:
......
......@@ -29,7 +29,7 @@ class Group:
""" Generate a group obj.
:param group_id: (uuid) group_id
"""
self.to_dump_congestion = None
self.to_unload_area_congestion = None
self.group_id = group_id
self.group_mode = 1
self.truck = truck
......@@ -37,23 +37,23 @@ class Group:
# group devices
self.excavator = {} # excavator_id -> unload_area_id
self.dump = {} # dump_id -> load_area_id
self.unload_area = {} # unload_area_id -> load_area_id
self.truck_set = set() # truck_id
# road network info.
self.to_excavator_distance = None
self.to_dump_distance = None
self.to_unload_area_distance = None
self.park_to_excavator_distance = None
# self.to_excavator_congestion = None
# self.to_dump_congestion = None
# self.to_unload_area_congestion = None
# self.park_to_excavator_congestion = None
# device map
self.truck_uuid_index_dict = bidict()
self.excavator_uuid_index_dict = bidict()
self.dump_uuid_index_dict = bidict()
self.unload_area_uuid_index_dict = bidict()
def update_group_mode(self):
"""
......@@ -72,7 +72,7 @@ class Group:
# update group devices
# DispatchInfo.update_device_group_structure()
self.excavator = DispatchInfo.get_excavator(self.group_id)
self.dump = DispatchInfo.get_dump(self.group_id)
self.unload_area = DispatchInfo.get_unload_area(self.group_id)
self.truck_set = DispatchInfo.get_truck_set(self.group_id)
def update_group_road_network(self):
......@@ -83,7 +83,7 @@ class Group:
# update group road network
# DispatchInfo.update_route_distance()
self.to_excavator_distance = DispatchInfo.get_to_excavator_distance(self.group_id)
self.to_dump_distance = DispatchInfo.get_to_dump_distance(self.group_id)
self.to_unload_area_distance = DispatchInfo.get_to_unload_area_distance(self.group_id)
self.park_to_excavator_distance = DispatchInfo.get_park_to_excavator_distance(self.group_id)
def update_group_device_map(self):
......@@ -96,15 +96,15 @@ class Group:
for i in range(len(self.excavator)):
self.excavator_uuid_index_dict[list(self.excavator)[i]] = i
for i in range(len(self.dump)):
self.dump_uuid_index_dict[list(self.dump)[i]] = i
for i in range(len(self.unload_area)):
self.unload_area_uuid_index_dict[list(self.unload_area)[i]] = i
for i in range(len(self.truck_set)):
self.truck_uuid_index_dict[list(self.truck_set)[i]] = i
self.truck_uuid_index_dict = bidict(self.truck_uuid_index_dict)
self.excavator_uuid_index_dict = bidict(self.excavator_uuid_index_dict)
self.dump_uuid_index_dict = bidict(self.dump_uuid_index_dict)
self.unload_area_uuid_index_dict = bidict(self.unload_area_uuid_index_dict)
# group_excavator_dict = {group_1: {excavator_1: load_area_1}, group_2: {excavator_2: load_area_2}}
......@@ -127,31 +127,57 @@ class Group:
"""
truck_dispatch = {}
assert issubclass(solver, AlgorithmBase)
s = solver(self, self.truck, self.pre_sch) # algorithm init
tt = self.truck_set
for i in list(self.truck_set):
truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]]
truck_task = self.truck.get_truck_current_task()[i]
if truck_task in [-2, 3, 4]:
next_excavator_value = s.solve(i)
# min_index = next_excavator_list.index(min(next_excavator_list))
min_index = np.argmin(next_excavator_value)
bb = self.excavator_uuid_index_dict
next_excavator_id = self.excavator_uuid_index_dict.inverse[min_index]
if truck_task == -2:
next_dump_id = "Park"
else:
next_dump_id = self.dump_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_dump_id]
if truck_task in [0, 1]:
next_dump_value = s.solve(i)
min_index = np.argmin(next_dump_value)
next_dump_id = self.dump_uuid_index_dict.inverse[min_index]
next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_dump_id]
if self.group_mode == 1:
assert issubclass(solver, AlgorithmBase)
s = solver(self, self.truck, self.pre_sch) # algorithm init
for i in list(self.truck_set):
truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]]
truck_task = self.truck.get_truck_current_task()[i]
if truck_task in [-2, 3, 4]:
next_excavator_value = s.solve(i)
# min_index = next_excavator_list.index(min(next_excavator_list))
min_index = np.argmin(next_excavator_value)
next_excavator_id = self.excavator_uuid_index_dict.inverse[min_index]
if truck_task == -2:
next_unload_area_id = "Park"
else:
next_unload_area_id = self.unload_area_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
if truck_task in [0, 1]:
next_unload_area_value = s.solve(i)
min_index = np.argmin(next_unload_area_value)
next_unload_area_id = self.unload_area_uuid_index_dict.inverse[min_index]
next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
# 空车智能模式
if self.group_mode == 2:
assert issubclass(solver, AlgorithmBase)
s = solver(self, self.truck, self.pre_sch) # algorithm init
for i in list(self.truck_set):
truck_trip = self.truck.get_truck_current_trip()[self.truck_uuid_index_dict[i]]
truck_task = self.truck.get_truck_current_task()[i]
if truck_task in [-2, 3, 4]:
next_excavator_value = s.solve(i)
# min_index = next_excavator_list.index(min(next_excavator_list))
min_index = np.argmin(next_excavator_value)
next_excavator_id = self.excavator_uuid_index_dict.inverse[min_index]
if truck_task == -2:
next_unload_area_id = "Park"
else:
next_unload_area_id = self.unload_area_uuid_index_dict.inverse[truck_trip[-1]]
truck_dispatch[i] = [next_excavator_id, next_unload_area_id]
if truck_task in [0, 1]:
truck_dispatch[i] = DispatchInfo.get_truck_team_trip(i)
if self.group_mode == 3:
for i in list(self.truck_set):
truck_dispatch[i] = DispatchInfo.get_truck_team_trip(i)
if self.group_mode == 4:
pass
# return dispatch plan
return truck_dispatch
......@@ -177,22 +203,22 @@ class Group:
#
# # group devices
# self.excavator_dict = {} # excavator_id -> unload_area_id
# self.dump = {} # dump_id -> load_area_id
# self.unload_area = {} # unload_area_id -> load_area_id
# self.truck_set = set() # truck_id
#
# # road network info.
# self.to_excavator_distance = None
# self.to_dump_distance = None
# self.to_unload_area_distance = None
# self.park_to_excavator_distance = None
#
# self.to_excavator_congestion = None
# self.to_dump_congestion = None
# self.to_unload_area_congestion = None
# self.park_to_excavator_congestion = None
#
# # device map
# self.truck_uuid_index_dict = bidict()
# self.excavator_uuid_index_dict = bidict()
# self.dump_uuid_index_dict = bidict()
# self.unload_area_uuid_index_dict = bidict()
#
# def update_xx_(self):
# """
......
......@@ -27,8 +27,8 @@ class DispatchInfo:
group_excavator_dict = {} # team_id -> dict {[excavator_id, excavator_id], ...}
excavator_group_dict = {} # excavator_id -> team_id 问题:多个key值对应一个value值
group_dump_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
dump_group_dict = {} # unload_area_id -> team_id
group_unload_area_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
unload_area_group_dict = {} # unload_area_id -> team_id
group_truck_dict = {} # team_id -> dict # {group_id:[truck_id,truck_id],...}
truck_group_dict = {} # truck_id -> team_id
......@@ -43,6 +43,8 @@ class DispatchInfo:
# group_name <-> group_id
group_name = {}
truck_team_trip_dict = {}
@classmethod
def renew_set(cls):
"""
......@@ -58,8 +60,8 @@ class DispatchInfo:
cls.group_excavator_dict = {}
cls.excavator_group_dict = {}
cls.group_dump_dict = {}
cls.dump_group_dict = {}
cls.group_unload_area_dict = {}
cls.unload_area_group_dict = {}
cls.group_truck_dict = {}
cls.truck_group_dict = {}
......@@ -69,8 +71,10 @@ class DispatchInfo:
cls.load_distance = {}
cls.unload_distance = {}
# cls.group_dump_dict = {} # cls.group_dump_dict.keys() 相当于所有的team_id
# cls.dump_group_dict = {} # cls.dump_group_dict.keys() 相当于所有的卸载区 unload_area_id
cls.truck_team_trip_dict = {}
# cls.group_unload_area_dict = {} # cls.group_unload_area_dict.keys() 相当于所有的team_id
# cls.unload_area_group_dict = {} # cls.unload_area_group_dict.keys() 相当于所有的卸载区 unload_area_id
# cls.group_excavator_dict = {}
# cls.excavator_group_dict = {}
# cls.load_excavator_dict = {} # cls.load_excavator_dict.keys() 相当于所有的装载区 load_area_id
......@@ -89,19 +93,7 @@ class DispatchInfo:
@desc:分组与卸载区、挖机、矿卡的映射和反映射
"""
logger = get_logger("mqc.update_device_group_structure")
# build excavator group map
# try:
# for item in session_postgre.query(DiggingWorkArea).all():
#
# if item.ExactorUuid is not None:
# cls.load_excavator_dict[str(item.Id)] = item.ExactorUuid
# cls.excavator_load_dict[item.ExactorUuid] = str(item.Id)
# aa = cls.load_excavator_dict
# except Exception as es:
# logger.error("挖机和装载区映射更新异常")
# logger.error(es)
try:
for item in session_mysql.query(DispatchSetting).all():
......@@ -112,116 +104,53 @@ class DispatchInfo:
logger.error("挖机和装载区映射更新异常")
logger.error(es)
# update excavator<->group and dump<->group map
# update excavator<->group and unload_area<->group map
try:
for item in session_mysql.query(DispatchSetting).filter_by(group_type=1).all():
# if item.group_code not in cls.group_excavator_dict.keys():
# cls.group_excavator_dict[item.group_code] = item.excavator_id
# else:
# cls.group_excavator_dict[item.group_code].append(item.excavator_id)
# cls.excavator_group_dict[item.excavator_id] = item.group_code
# if item.load_area_id is not None and item.dump_id is not None:
if item.group_code not in cls.group_excavator_dict.keys():
# add excavator
if item.group_id not in cls.group_excavator_dict.keys():
cls.group_excavator_dict[item.group_id] = [item.exactor_id]
else:
cls.group_excavator_dict[item.group_id].append(item.exactor_id)
if item.exactor_id not in cls.group_excavator_dict[item.group_id]:
cls.group_excavator_dict[item.group_id].append(item.exactor_id)
cls.excavator_group_dict[item.exactor_id] = item.group_id
if item.group_id not in cls.group_dump_dict.keys():
cls.group_dump_dict[item.group_id] = [item.unload_area_id]
# add unload_area
if item.group_id not in cls.group_unload_area_dict.keys():
cls.group_unload_area_dict[item.group_id] = [item.unload_area_id]
else:
cls.group_dump_dict[item.group_id].append(item.unload_area_id)
cls.dump_group_dict[item.unload_area_id] = item.group_id
if item.unload_area_id not in cls.group_unload_area_dict[item.group_id]:
cls.group_unload_area_dict[item.group_id].append(item.unload_area_id)
cls.unload_area_group_dict[item.unload_area_id] = item.group_id
# add truck
if item.group_id not in cls.group_truck_dict.keys():
cls.group_truck_dict[item.group_id] = [item.truck_id]
else:
cls.group_truck_dict[item.group_id].append(item.truck_id)
if item.truck_id not in cls.group_truck_dict[item.group_id]:
cls.group_truck_dict[item.group_id].append(item.truck_id)
cls.truck_group_dict[item.truck_id] = item.group_id
# hh = cls.group_excavator_dict
# hhhh = cls.group_truck_dict
except Exception as es:
logger.error("挖机/卸载区/矿卡与group_id映射更新异常")
logger.error(es)
# update group set
try:
cls.group_set = set(cls.group_excavator_dict.keys())
except Exception as es:
logger.error(es)
# try:
# for item in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
#
# # if item.group_code not in cls.group_excavator_dict.keys():
# # cls.group_excavator_dict[item.group_code] = item.excavator_id
# # else:
# # cls.group_excavator_dict[item.group_code].append(item.excavator_id)
# # cls.excavator_group_dict[item.excavator_id] = item.group_code
# if item.load_area_id is not None and item.dump_id is not None:
# if item.group_code not in cls.group_excavator_dict.keys():
# cls.group_excavator_dict[item.group_code] = [item.exactor_id]
# else:
# cls.group_excavator_dict[item.group_code].append(item.exactor_id)
# cls.excavator_group_dict[item.exactor_id] = item.group_code
#
# if item.group_code not in cls.group_dump_dict.keys():
# cls.group_dump_dict[item.group_code] = [item.unload_area_id]
# else:
# cls.group_dump_dict[item.group_code].append(item.unload_area_id)
# cls.dump_group_dict[item.unload_area_id] = item.group_code
# except Exception as es:
# logger.error("挖机/卸载区与group_id映射更新异常")
# logger.error(es)
# update truck<->group map
# try:
# for item in session_mysql.query(DispatchEquipment).filter_by(group_type=1).all():
# if item.group_code not in cls.group_truck_dict.keys():
# cls.group_truck_dict[item.group_code] = [item.equipment_id]
# else:
# cls.group_truck_dict[item.group_code].append(item.equipment_id)
# cls.truck_group_dict[item.equipment_id] = item.group_code
# except Exception as es:
# logger.error("矿卡与group_id映射更新异常")
# logger.error(es)
# update group set
# try:
# # group_dump_dict = {} -->> {team_id:[unload_area_id,unload_area_id],...}
# # dump_group_dict = {} # unload_area_id -> team_id
# group_code_dict = {} # group_code-->>team_id的映射
# for valve in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
# group_code_dict[valve.group_code] = valve.team_id
# if valve.team_id not in cls.group_dump_dict:
# cls.group_dump_dict[valve.team_id] = [valve.unload_area_id] # 注意:一个team_id可能对应多个unload_area_id
# else:
# cls.group_dump_dict[valve.team_id].append(valve.unload_area_id)
# cls.dump_group_dict[valve.unload_area_id] = valve.team_id # 一个unload_area_id只对应一个team_id
# # group_excavator_dict = {} -->> {team_id: [excavator_id, excavator_id], ...} # 一个team_id对应一组excavator_id, unload_area_id
# # excavator_group_dict = {} -->> excavator_id -> team_id 一个excavator_id只对应一个team_id
# for item in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
# if item.team_id in cls.group_excavator_dict:
# cls.group_excavator_dict[item.team_id].append(item.excavator_id)
# else:
# cls.group_excavator_dict[item.team_id] = [item.excavator_id]
# cls.excavator_group_dict[item.excavator_id] = item.team_id
# # group_truck_dict = {} -->> {team_id:[truck_id,truck_id],...}
# # truck_group_dict = {} -->> truck_id -> team_id
# for key in session_mysql.query(DispatchEquipment).filter_by(group_type=1).all():
# if key.group_code in group_code_dict:
# if key.group_code not in cls.group_truck_dict:
# cls.group_truck_dict[key.group_code] = [key.equipment_id]
# else:
# cls.group_truck_dict[key.group_code].append(key.equipment_id)
# cls.truck_group_dict[key.equipment_id] = group_code_dict[key.group_code]
# except Exception as es:
# logger.error("分组到卸载区的数据更新异常")
# logger.error(es)
# update truck->team id dict
try:
trucks = cls.truck_group_dict.keys()
for i in trucks:
trip_excavator = session_mysql.query(DispatchSetting).filter_by(truck_id=i).first().exactor_id
trip_unload_area = session_mysql.query(DispatchSetting).filter_by(truck_id=i).first().unload_area_id
cls.truck_team_trip_dict[i] = [trip_excavator, trip_unload_area]
except Exception as es:
logger.error(es)
@classmethod
def update_group_mode(cls):
......@@ -243,21 +172,6 @@ class DispatchInfo:
logger.error("group_id->mode_code更新异常")
logger.error(es)
# 新增:team_id-->>group_code;group_code-->>mode_code.结果:team_id-->>mode_code
# team_group_dict = {} # team_id-->>group_code的一个映射,格式:{team_id:group_code}
# group_mode_dict = {} # group-->>mode_code的一个映射,格式:{group_code:mode_code}
# try:
# for pos in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
# team_group_dict[pos.team_id] = pos.group_code
# for item in session_mysql.query(DispatchGroup).filter_by(group_type=1).all():
# group_mode_dict[item.group_code] = item.mode_code
# for key, value in team_group_dict.items():
# if value in group_mode_dict:
# cls.group_mode[key] = group_mode_dict[value]
# except Exception as es:
# logger.error("派车模式数据更新异常")
# logger.error(es)
@classmethod
def update_group_name(cls):
"""
......@@ -276,19 +190,6 @@ class DispatchInfo:
logger.error("group_id->name更新异常")
logger.error(es)
# @classmethod
# def dispatch_group_init(cls):
# """
# update basic paras (group_set, dict, num ...)
# :return:
# """
# try:
# for value in session_postgre.query(DiggingWorkArea).all():
# cls.load_excavator_dict[value.Id] = value.ExactorId
# cls.excavator_load_dict[value.ExactorId] = value.Id
# except Exception as es:
# logger.error("初始化数据更新异常")
# logger.error(es)
@classmethod
# 距离-->>数据格式:矩阵-->>to_load_distance
def update_route_distance(cls):
......@@ -308,7 +209,7 @@ class DispatchInfo:
for excavator_id in excavator_ids:
load_areas.append(cls.excavator_load_dict[excavator_id])
# 每个组的unload_areas
unload_areas = cls.group_dump_dict[item]
unload_areas = cls.group_unload_area_dict[item]
# unload->load 路网
unload_load_distance = np.zeros((len(unload_areas), len(load_areas)))
......@@ -331,51 +232,6 @@ class DispatchInfo:
logger.error(es)
# try:
# df = pd.DataFrame() # 记录装载区与卸载区之间的距离
# for item in session_postgre.query(WalkTime).all():
# temp = str(item.load_area_id), str(item.unload_area_id), item.to_load_distance, item.to_unload_distance
# df = pd.concat([df, pd.DataFrame([temp])], axis=0, ignore_index=True)
# except Exception as es:
# logger.error("路网距离数据更新异常1")
# logger.error(es)
#
# # 距离矩阵
# for team_id in list(cls.group_dump_dict.keys()):
# unload_nums = list(set(cls.group_dump_dict[team_id])) # 获取同一个team_id对应的卸载区列表
# exactor_nums = list(set(cls.group_excavator_dict[team_id])) # 获取同一个team_id对应的电铲列表
#
# unload_exactor_matrix = np.zeros(
# (len(unload_nums), len(exactor_nums))) # 初始化距离矩阵,记录从卸载区-->>电铲的距离,即to_load_distance,空车模式
# load_exactor_matrix = np.array(
# unload_exactor_matrix).T # 初始化距离矩阵,记录从装载区-->>电铲的距离,即to_unload_distance,重车模式
#
# try:
# for i in range(len(unload_nums)):
# for j in range(len(exactor_nums)):
# id = set(df.loc[df[1] == str(unload_nums[i])].index.to_list()) & set(
# df.loc[df[0] == str(cls.excavator_load_dict[j])].index.to_list()) # 集合属性
# unload_exactor_matrix[i][j] = df.iloc[list(id)[0]][2]
# except Exception as es:
# logger.error("路网距离数据更新异常2")
# logger.error(es)
#
# try:
# for m in range(len(exactor_nums)):
# for n in range(len(unload_nums)):
# id = set(df.loc[df[0] == str(cls.excavator_load_dict[m])].index.to_list()) & set(
# df.loc[df[1] == str(unload_nums[n])].index.to_list())
# load_exactor_matrix[m][n] = df.iloc[list(id)[0]][3]
# except Exception as es:
# logger.error("路网距离数据更新异常3")
# logger.error(es)
# cls.load_distance[team_id] = unload_exactor_matrix
# cls.unload_distance[team_id] = load_exactor_matrix
#
# except Exception as es:
# logger.error("路网距离数据更新异常4")
# logger.error(es)
@classmethod
def get_group_mode(cls, group_id):
return cls.group_mode[group_id]
......@@ -385,8 +241,8 @@ class DispatchInfo:
return set(cls.group_excavator_dict[group_id])
@classmethod
def get_dump(cls, group_id):
return set(cls.group_dump_dict[group_id])
def get_unload_area(cls, group_id):
return set(cls.group_unload_area_dict[group_id])
@classmethod
def get_truck_set(cls, group_id):
......@@ -401,9 +257,13 @@ class DispatchInfo:
return cls.load_distance[group_id]
@classmethod
def get_to_dump_distance(cls, group_id):
def get_to_unload_area_distance(cls, group_id):
return cls.unload_distance[group_id]
@classmethod
def get_truck_team_trip(cls, truck_id):
return cls.truck_team_trip_dict[truck_id]
@classmethod
def get_park_to_excavator_distance(cls, group_id):
......@@ -446,14 +306,14 @@ class DispatchInfo:
# group_set = set()
#
# # device group structure
# group_dump_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
# group_unload_area_dict = {} # team_id -> dict {unload_area_id, unload_area_id, ...}
# # {group_id:unload_area_id,...}
# group_excavator_dict = {} # team_id -> dict {[excavator_id, load_area_id], ...}
# # {group_id: [excavator_id, unload_area_id], ...}
# group_truck_dict = {} # team_id -> dict {truck_id, ...}
# # {group_id:[truck_id,truck_id],...}
#
# dump_group_dict = {} # unload_area_id -> team_id
# unload_area_group_dict = {} # unload_area_id -> team_id
# excavator_group_dict = {} # excavator_id -> team_id
# truck_group_dict = {} # truck_id -> team_id
#
......@@ -472,8 +332,8 @@ class DispatchInfo:
# @author:maqc
# @desc:实例化对象,可直接访问
# """
# cls.group_dump_dict = {}
# cls.dump_group_dict = {}
# cls.group_unload_area_dict = {}
# cls.unload_area_group_dict = {}
#
# cls.group_excavator_dict = {}
# cls.excavator_group_dict = {}
......@@ -494,16 +354,16 @@ class DispatchInfo:
# """
# logger = get_logger("mqc.update_device_group_structure")
# try:
# # group_dump_dict = {} -->> {group_id:unload_area_id,...}
# # dump_group_dict = {} # unload_area_id -> team_id
# # group_unload_area_dict = {} -->> {group_id:unload_area_id,...}
# # unload_area_group_dict = {} # unload_area_id -> team_id
# group_code_dict = {} # group_code-->>team_id的映射
# for valve in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
# group_code_dict[valve.group_code] = valve.team_id
# if valve.team_id not in cls.group_dump_dict:
# cls.group_dump_dict[valve.team_id] = [valve.unload_area_id] # 注意:一个team_id可能对应多个unload_area_id
# if valve.team_id not in cls.group_unload_area_dict:
# cls.group_unload_area_dict[valve.team_id] = [valve.unload_area_id] # 注意:一个team_id可能对应多个unload_area_id
# else:
# cls.group_dump_dict[valve.team_id].append(valve.unload_area_id)
# cls.dump_group_dict[valve.unload_area_id] = valve.team_id # 一个unload_area_id只对应一个team_id
# cls.group_unload_area_dict[valve.team_id].append(valve.unload_area_id)
# cls.unload_area_group_dict[valve.unload_area_id] = valve.team_id # 一个unload_area_id只对应一个team_id
# # group_excavator_dict = {} -->> {group_id: [excavator_id, unload_area_id], ...} # 一个team_id对应一组excavator_id, unload_area_id
# # excavator_group_dict = {} -->> excavator_id -> team_id 一个excavator_id只对应一个team_id
# for item in session_mysql.query(DispatchMatch).filter_by(group_type=1).all():
......@@ -552,7 +412,7 @@ class DispatchInfo:
# if truck_info == 1:
# for i in group_excavator():
# pass
# for j in group_dump():
# for j in group_unload_area():
# pass
# if truck_info == 2:
# pass
......
......@@ -569,7 +569,7 @@ class DispatchSubmission:
exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
......@@ -578,7 +578,7 @@ class DispatchSubmission:
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
try:
record["exactorId"] = item.exactor_id
......@@ -598,11 +598,12 @@ class DispatchSubmission:
try:
item = (
session_mysql.query(Dispatch)
.filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]],
.filter_by(
exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]],
dump_id=DeviceMap.dump_index_to_uuid_dict[Seq[i][0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
......@@ -611,7 +612,7 @@ class DispatchSubmission:
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
try:
record["exactorId"] = self.excavator.excavator_index_to_uuid_dict[Seq[i][1]]
record["dumpId"] = item.dump_id
......@@ -634,7 +635,7 @@ class DispatchSubmission:
.filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[Seq[i][1]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0).first())
isdeleted=0).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
......@@ -651,7 +652,7 @@ class DispatchSubmission:
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0).first())
isdeleted=0).first())
try:
record["exactorId"] = item.exactor_id
......@@ -713,7 +714,7 @@ class DispatchSubmission:
exactor_id=DeviceMap.excavator_index_to_uuid_dict[dispatch_seq[0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
......@@ -722,7 +723,7 @@ class DispatchSubmission:
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
try:
record["exactorId"] = item.exactor_id
......@@ -746,7 +747,7 @@ class DispatchSubmission:
dump_id=DeviceMap.dump_index_to_uuid_dict[dispatch_seq[0]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
except Exception as es:
......@@ -755,7 +756,7 @@ class DispatchSubmission:
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0, ).first())
isdeleted=0, ).first())
try:
record["exactorId"] = self.excavator.excavator_index_to_uuid_dict[dispatch_seq[1]]
record["dumpId"] = item.dump_id
......@@ -778,7 +779,7 @@ class DispatchSubmission:
.filter_by(exactor_id=DeviceMap.excavator_index_to_uuid_dict[dispatch_seq[1]],
truck_id=truck_id,
group_id=group_id,
isauto=1, isdeleted=0).first())
isdeleted=0).first())
if item is None:
raise Exception("调度计划表与实时监控不匹配")
......@@ -795,7 +796,7 @@ class DispatchSubmission:
session_mysql.query(Dispatch)
.filter_by(truck_id=truck_id,
# group_id=group_id,
isauto=1, isdeleted=0).first())
isdeleted=0).first())
try:
record["exactorId"] = item.exactor_id
......
......@@ -118,8 +118,9 @@ class DumpInfo(WalkManage):
self.dump_material = {}
for dump_id in get_value("dynamic_dump_set"):
try:
unload_area_id = session_mysql.query(DispatchSetting).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().Materials
# unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isauto=1, isdeleted=0).first().unload_area_id
unload_area_id = session_mysql.query(DispatchSetting).filter_by(dump_id=dump_id, isdeleted=0).first().unload_area_id
dump_material_id = list(session_postgre.query(DumpArea).filter_by(Id=unload_area_id).first().Materials)
self.dump_material[dump_id] = dump_material_id
except Exception as es:
self.logger.error("卸点物料更新异常")
......
......@@ -131,7 +131,8 @@ class ExcavatorInfo(WalkManage):
self.logger.info(self.dynamic_excavator_set)
for excavator_id in self.dynamic_excavator_set:
try:
load_area_id = session_mysql.query(DispatchSetting).filter_by(exactor_id=excavator_id, isdeleted=0, isauto=1).first().load_area_id
# load_area_id = session_mysql.query(DispatchSetting).filter_by(exactor_id=excavator_id, isdeleted=0, isauto=1).first().load_area_id
load_area_id = session_mysql.query(DispatchSetting).filter_by(exactor_id=excavator_id, isdeleted=0).first().load_area_id
excavator_material_id = session_postgre.query(DiggingWorkArea).filter_by(Id=load_area_id).first().Material
self.excavator_material[excavator_id] = excavator_material_id
except Exception as es:
......
......@@ -570,7 +570,6 @@ class TruckInfo(WalkManage):
def update_truck_material(self):
try:
self.truck_material_bind = {}
self.update_truck_excavator_bind()
self.update_truck_dump_area_bind()
......@@ -579,7 +578,6 @@ class TruckInfo(WalkManage):
self.dump_material_bind_modify = np.full((self.dynamic_truck_num, get_value("dynamic_dump_num")), 0)
for truck_id in self.dynamic_truck_set:
if truck_id in self.truck_dump_bind:
unload_area_id = self.truck_dump_bind[truck_id]
try:
......
......@@ -357,22 +357,19 @@ class WalkManage(DeviceMap):
# 计算设备路网距离及行走时间
try:
n = dynamic_dump_num
m = dynamic_excavator_num
for i in range(dynamic_dump_num):
for j in range(dynamic_excavator_num):
cls.distance_to_excavator[i][j] = cls.distance_to_load_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_excavator[i][j] = cls.walk_time_to_load_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.distance_to_dump[i][j] = cls.distance_to_unload_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_dump[i][j] = cls.walk_time_to_unload_area[
cls.dump_index_to_unload_area_index_dict[i]
][cls.excavator_index_to_load_area_index_dict[j]]
cls.distance_to_excavator[i][j] = cls.distance_to_load_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_excavator[i][j] = cls.walk_time_to_load_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
cls.distance_to_dump[i][j] = cls.distance_to_unload_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
cls.walk_time_to_dump[i][j] = cls.walk_time_to_unload_area[cls.dump_index_to_unload_area_index_dict[i]][cls.excavator_index_to_load_area_index_dict[j]]
except Exception as es:
logger.error("设备路网信息异常异常")
logger.error("设备路网信息异常")
logger.error(es)
try:
......
......@@ -119,20 +119,29 @@ def process(dispatcher):
# load_distance = {}
# unload_distance = {}
logger.info("Dispatchinfo,更新后信息")
logger.info("group_set")
logger.info(DispatchInfo.group_set)
logger.info("group_excavator_dict")
logger.info(DispatchInfo.group_excavator_dict)
logger.info(DispatchInfo.group_dump_dict)
logger.info("group_unload_area_dict")
logger.info(DispatchInfo.group_unload_area_dict)
logger.info("group_truck_dict")
logger.info(DispatchInfo.group_truck_dict)
logger.info("group_mode")
logger.info(DispatchInfo.group_mode)
logger.info("load_distance")
logger.info(DispatchInfo.load_distance)
logger.info("unload_distance")
logger.info(DispatchInfo.unload_distance)
logger.info(DispatchInfo.load_excavator_dict)
logger.info(DispatchInfo.excavator_load_dict)
logger.info(DispatchInfo.excavator_group_dict)
logger.info(DispatchInfo.dump_group_dict)
logger.info(DispatchInfo.truck_group_dict)
# logger.info("load_excavator_dict")
# logger.info(DispatchInfo.load_excavator_dict)
# logger.info("excavator_load_dict")
# logger.info(DispatchInfo.excavator_load_dict)
# logger.info(DispatchInfo.excavator_group_dict)
# logger.info(DispatchInfo.dump_group_dict)
# logger.info(DispatchInfo.truck_group_dict)
# 调度生成
dispatcher.period_update()
......
......@@ -152,7 +152,8 @@ def update_deveices_map(unload_area_uuid_to_index_dict, load_area_uuid_to_index_
excavator_num = 0
dump_num = 0
for item in (
session_mysql.query(DispatchSetting).filter_by(isdeleted=0, isauto=1).all()
# session_mysql.query(DispatchSetting).filter_by(isdeleted=0, isauto=1).all()
session_mysql.query(DispatchSetting).filter_by(isdeleted=0).all()
):
# excavator_id <-> excavator_index
# dump_id <-> dump_index
......@@ -227,7 +228,6 @@ def update_truck_uuid_index_map(dynamic_truck_set):
"truck_index_to_uuid_dict": truck_index_to_uuid_dict,
}
def update_total_truck():
# 矿卡集合
truck_list = []
......@@ -238,13 +238,11 @@ def update_total_truck():
.filter_by(device_type=1, isdeleted=0)
.all()
)
# for item in query:
# json_value = json.loads(redis2.get(item.equipment_id))
# is_online = json_value.get('isOnline')
# if is_online:
# truck_list.append(item.id)
for item in query:
truck_list.append(item.id)
......@@ -281,9 +279,8 @@ def update_dynamic_truck():
query = np.array(
session_mysql.query(DispatchSetting).filter_by(isdeleted=0).all()
)
for item in query:
if item.truck_id is not None:
if item.truck_id is not None and item.truck_id not in dynamic_truck_list:
dynamic_truck_list.append(item.truck_id)
except Exception as es:
......@@ -337,10 +334,9 @@ def update_autodisp_excavator():
# 用于动态派车的挖机集合
dynamic_excavator_list = []
try:
for item in (
session_mysql.query(DispatchSetting).filter_by().all()
):
dynamic_excavator_list.append(item.exactor_id)
for item in (session_mysql.query(DispatchSetting).filter_by().all()):
if item.exactor_id not in dynamic_excavator_list:
dynamic_excavator_list.append(item.exactor_id)
if len(dynamic_excavator_list) < 1:
raise Exception("无动态派车计划可用-动态派车挖机/卸载设备集合读取异常")
except Exception as es:
......@@ -355,10 +351,9 @@ def update_autodisp_dump():
# 用于动态调度的卸载点集合
dynamic_dump_list = []
try:
for item in (
session_mysql.query(DispatchSetting).filter_by().all()
):
dynamic_dump_list.append(item.dump_id)
for item in (session_mysql.query(DispatchSetting).filter_by().all()):
if item.dump_id not in dynamic_dump_list:
dynamic_dump_list.append(item.dump_id)
if len(dynamic_dump_list) < 1:
raise Exception("无动态派车计划可用-动态派车挖机/卸载设备集合读取异常")
except Exception as es:
......
......@@ -17,11 +17,11 @@ class DispatchInfo:
group_set = set()
# device group structure
group_dump_dict = {} # team_id -> dict {[dump_id, unload_area_id], [dump_id, unload_area_id], ...}
group_unload_area_dict = {} # team_id -> dict {[unload_area_id, unload_area_id], [unload_area_id, unload_area_id], ...}
group_excavator_dict = {} # team_id -> dict {[excavator_id, load_area_id], ...}
group_truck_dict = {} # team_id -> dict {truck_id, ...}
dump_group_dict = {} # dump_id -> team_id
unload_area_group_dict = {} # unload_area_id -> team_id
excavator_group_dict = {} # excavator_id -> team_id
truck_group_dict = {} # truck_id -> team_id
......
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