Commit 8794c315 authored by 张晓彤's avatar 张晓彤

解决空/重载过程中长时间无法获取派车计划问题

parent edc1105f
...@@ -14,6 +14,7 @@ from equipment import TruckInfo, ExcavatorInfo, DumpInfo ...@@ -14,6 +14,7 @@ from equipment import TruckInfo, ExcavatorInfo, DumpInfo
from core.schedule import PreSchedule from core.schedule import PreSchedule
from graph.graph_load import graph_construct from graph.graph_load import graph_construct
from core.group import GroupDispatcher from core.group import GroupDispatcher
from graph.topo_graph import *
class Dispatcher: class Dispatcher:
...@@ -31,7 +32,8 @@ class Dispatcher: ...@@ -31,7 +32,8 @@ class Dispatcher:
self.logger = get_logger("zxt.dispatcher") self.logger = get_logger("zxt.dispatcher")
self.redispatch_active = active self.redispatch_active = active
if self.redispatch_active: if self.redispatch_active:
self.topo = graph_construct() self.topo = Topo()
self.topo.generate_topo_graph()
else: else:
self.topo = None self.topo = None
self.submission = DispatchSubmission(dump, excavator, truck, self.topo) self.submission = DispatchSubmission(dump, excavator, truck, self.topo)
......
...@@ -561,7 +561,6 @@ class GroupDispatcher: ...@@ -561,7 +561,6 @@ class GroupDispatcher:
# 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区 # 车辆停止或者车辆位于卸载区内, 调度车辆前往装载区
if truck_task in [-2, 3, 4, 5]: if truck_task in [-2, 3, 4, 5]:
#
if truck_task == 3: if truck_task == 3:
if self.group.topo is not None and truck_locate is not None: if self.group.topo is not None and truck_locate is not None:
self.logger.info("潜在二次调度车辆状态") self.logger.info("潜在二次调度车辆状态")
...@@ -582,46 +581,15 @@ class GroupDispatcher: ...@@ -582,46 +581,15 @@ class GroupDispatcher:
self.logger.error("二次调度至卸载点失败") self.logger.error("二次调度至卸载点失败")
self.logger.error(es) self.logger.error(es)
else: else:
self.logger.info("未触发二次调度") self.logger.info("未触发二次调度, 执行重载周期调度")
self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
else: else:
self.logger.info("正常重载行驶无需调度") self.logger.info("正常重载行驶, 执行重载周期调度")
self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
else: else:
try: self.logger.info("卸载区内, 执行重载周期调度")
if truck_id in self.group.truck.truck_excavator_bind: self.heavy_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_task, truck_trip)
self.logger.info("车辆存在绑定关系")
try:
if truck_id not in self.group.truck.truck_excavator_bind:
raise CoreException(102, f'truck.group_excavators bind 中不存在 {truck_id}')
except CoreException as es:
es.with_traceback_info()
self.logger.error(es)
return
next_excavator_id = self.group.truck.truck_excavator_bind[truck_id]
else:
self.logger.info("触发调度算法逻辑")
next_excavator_value = s.solve(truck_info)
self.logger.info(f'车辆排斥修正 {truck_id}, {self.group.truck_excavator_exclude_modify[truck_id]}')
min_index = np.argmin(
next_excavator_value + self.group.truck_excavator_exclude_modify[truck_id])
# min_index = np.argmin(next_excavator_value)
next_excavator_id = self.group.excavator_uuid_index_dict.inverse[min_index]
self.logger.info(f'目标挖机 {min_index} {next_excavator_id}')
if truck_task == -2:
next_unload_area_id = "Park"
else:
dump_id = get_value("dump_index_to_uuid_dict")[truck_trip[-1]]
next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id]
truck_dispatch[truck_id] = [next_excavator_id, next_unload_area_id]
self.logger.info(f'调度结果 next_excavator_id: '
f'{next_excavator_id} next_unload_area_id: {next_unload_area_id}')
except Exception as es:
self.logger.error("重载车辆全智能模式-计算异常")
self.logger.error(es)
# 车辆位于装载区内, 调度车辆前往卸载区 # 车辆位于装载区内, 调度车辆前往卸载区
elif truck_task in [0, 1, 2]: elif truck_task in [0, 1, 2]:
...@@ -646,47 +614,92 @@ class GroupDispatcher: ...@@ -646,47 +614,92 @@ class GroupDispatcher:
self.logger.error("二次调度至装载点失败") self.logger.error("二次调度至装载点失败")
self.logger.error(es) self.logger.error(es)
else: else:
self.logger.info("未触发二次调度") self.logger.info("未触发二次调度,执行空载周期调度")
self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
# 穿越装载区判断 # 穿越装载区判断
if self.gothrough_active: if self.gothrough_active:
self.gothroghdispatcher.update_lanes_info() self.gothroghdispatcher.update_lanes_info()
self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck) self.gothroghdispatcher.redispatch_request(request_truck_id=truck_id, truck=self.group.truck)
else: else:
self.logger.info("正常空载行驶无需调度") self.logger.info("正常空载行驶,执行空载周期调度")
self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
else: else:
try: self.logger.info("装载区内,执行空载周期调度")
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]] self.empty_period_dispatch(s, truck_dispatch, truck_id, truck_info, truck_trip)
next_unload_area_value = s.solve(truck_info)
# TODO:车辆在空载状态是否应该如何计算,是计算下一次卸载区还是继续计算当前最优挖机
if truck_id in self.group.truck.truck_dump_bind:
self.logger.info("车辆存在绑定关系") def heavy_period_dispatch(self, s: AlgorithmBase, truck_dispatch: Mapping[str, List[str]], truck_id: str,
dump_uuid_to_unload_area_uuid_dict = get_value("dump_uuid_to_unload_area_uuid_dict") truck_info: CurrentTruck, truck_task: int, truck_trip: List[int]):
next_unload_area_id = dump_uuid_to_unload_area_uuid_dict[ try:
self.group.truck.truck_dump_bind[truck_id]] if truck_id in self.group.truck.truck_excavator_bind:
else: self.logger.info("车辆存在绑定关系")
self.logger.info("触发调度算法逻辑") # try:
next_unload_area_value *= self.group.group_walk_available[ # if truck_id not in self.group.truck.truck_excavator_bind:
self.group.excavator_uuid_index_dict[next_excavator_id], :].flatten() # raise CoreException(102, f'truck.group_excavators bind 中不存在 {truck_id}')
# except CoreException as es:
# es.with_traceback_info()
# self.logger.error(es)
# return
next_excavator_id = self.group.truck.truck_excavator_bind[truck_id]
else:
self.logger.info("触发调度算法逻辑")
next_excavator_value = s.solve(truck_info)
self.logger.info(f'车辆排斥修正 {truck_id}, {self.group.truck_excavator_exclude_modify[truck_id]}')
min_index = np.argmin(
next_excavator_value + self.group.truck_excavator_exclude_modify[truck_id])
# min_index = np.argmin(next_excavator_value)
next_excavator_id = self.group.excavator_uuid_index_dict.inverse[min_index]
self.logger.info(f'目标挖机 {min_index} {next_excavator_id}')
if truck_task == -2:
next_unload_area_id = "Park"
else:
dump_id = get_value("dump_index_to_uuid_dict")[truck_trip[-1]]
next_unload_area_id = get_value("dump_uuid_to_unload_area_uuid_dict")[dump_id]
truck_dispatch[truck_id] = [next_excavator_id, next_unload_area_id]
min_index = np.argmin(next_unload_area_value) self.logger.info(f'调度结果 next_excavator_id: '
next_unload_area_id = self.group.unload_area_uuid_index_dict.inverse[min_index] f'{next_excavator_id} next_unload_area_id: {next_unload_area_id}')
self.logger.info(f'目标卸点 {min_index} {next_unload_area_id}') except Exception as es:
# next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]] self.logger.error("重载车辆全智能模式-计算异常")
self.logger.error(es)
truck_dispatch[truck_id] = [next_excavator_id, next_unload_area_id] def empty_period_dispatch(self, s: AlgorithmBase, truck_dispatch: Mapping[str, List[str]], truck_id: str, truck_info: CurrentTruck,
truck_trip: List[int]):
try:
next_excavator_id = get_value("excavator_index_to_uuid_dict")[truck_trip[-1]]
next_unload_area_value = s.solve(truck_info)
if truck_id in self.group.truck.truck_dump_bind:
self.logger.info("车辆存在绑定关系")
dump_uuid_to_unload_area_uuid_dict = get_value("dump_uuid_to_unload_area_uuid_dict")
next_unload_area_id = dump_uuid_to_unload_area_uuid_dict[
self.group.truck.truck_dump_bind[truck_id]]
else:
self.logger.info("触发调度算法逻辑")
next_unload_area_value *= self.group.group_walk_available[
self.group.excavator_uuid_index_dict[next_excavator_id], :].flatten()
self.logger.info(f'调度结果 next_excavator_id: ' min_index = np.argmin(next_unload_area_value)
f'{next_excavator_id} next_unload_area_id: {next_unload_area_id}') next_unload_area_id = self.group.unload_area_uuid_index_dict.inverse[min_index]
except Exception as es: self.logger.info(f'目标卸点 {min_index} {next_unload_area_id}')
self.logger.error("空载车辆全智能模式-计算异常") # next_excavator_id = self.excavator_uuid_index_dict.inverse[truck_trip[-1]]
self.logger.error(es.__traceback__.tb_lineno)
self.logger.error(es)
truck_dispatch[truck_id] = [None, None]
# TODO:车辆在空载状态是否应该如何计算,是计算下一次卸载区还是继续计算当前最优挖机 truck_dispatch[truck_id] = [next_excavator_id, next_unload_area_id]
self.logger.info(f'调度结果 next_excavator_id: '
f'{next_excavator_id} next_unload_area_id: {next_unload_area_id}')
except Exception as es:
self.logger.error("空载车辆全智能模式-计算异常")
self.logger.error(es.__traceback__.tb_lineno)
self.logger.error(es)
truck_dispatch[truck_id] = [None, None]
def truck_construct(self, truck_id): def truck_construct(self, truck_id):
""" """
......
...@@ -193,12 +193,14 @@ class DispatchInfo: ...@@ -193,12 +193,14 @@ class DispatchInfo:
try: try:
for item in session_mysql.query(DispatchSetting).filter_by(isdeleted=0).all(): for item in session_mysql.query(DispatchSetting).filter_by(isdeleted=0).all():
# add group_excavators # add group_excavators
if item.group_id not in cls.group_excavator_dict.keys(): excavator_state = session_mysql.query(Equipment).filter_by(id=item.exactor_id).first()
cls.group_excavator_dict[item.group_id] = [item.exactor_id] if excavator_state is not None and excavator_state.disabled == 1:
else: if item.group_id not in cls.group_excavator_dict.keys():
if item.exactor_id not in cls.group_excavator_dict[item.group_id]: cls.group_excavator_dict[item.group_id] = [item.exactor_id]
cls.group_excavator_dict[item.group_id].append(item.exactor_id) else:
cls.excavator_group_dict[item.exactor_id] = item.group_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
# add group_unload_areas # add group_unload_areas
if item.group_id not in cls.group_unload_area_dict.keys(): if item.group_id not in cls.group_unload_area_dict.keys():
...@@ -208,21 +210,26 @@ class DispatchInfo: ...@@ -208,21 +210,26 @@ class DispatchInfo:
cls.group_unload_area_dict[item.group_id].append(item.unload_area_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 cls.unload_area_group_dict[item.unload_area_id] = item.group_id
# add group_dumps # add dump
if item.group_id not in cls.group_dump_dict.keys(): dump_state = session_mysql.query(Equipment).filter_by(id=item.dump_id).first()
cls.group_dump_dict[item.group_id] = [item.dump_id] if dump_state is not None and dump_state.disabled == 1:
else: # add group_dumps
if item.dump_id not in cls.group_dump_dict[item.group_id]: if item.group_id not in cls.group_dump_dict.keys():
cls.group_dump_dict[item.group_id].append(item.dump_id) cls.group_dump_dict[item.group_id] = [item.dump_id]
cls.dump_group_dict[item.dump_id] = item.group_id else:
if item.dump_id not in cls.group_dump_dict[item.group_id]:
cls.group_dump_dict[item.group_id].append(item.dump_id)
cls.dump_group_dict[item.dump_id] = item.group_id
# add truck # add truck
if item.group_id not in cls.group_truck_dict.keys(): truck_state = session_mysql.query(Equipment).filter_by(id=item.truck_id).first()
cls.group_truck_dict[item.group_id] = [item.truck_id] if truck_state is not None and truck_state.disabled == 1:
else: if item.group_id not in cls.group_truck_dict.keys():
if item.truck_id not in cls.group_truck_dict[item.group_id]: cls.group_truck_dict[item.group_id] = [item.truck_id]
cls.group_truck_dict[item.group_id].append(item.truck_id) else:
cls.truck_group_dict[item.truck_id] = item.group_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
print("存在的分组") print("存在的分组")
print(cls.group_excavator_dict.keys()) print(cls.group_excavator_dict.keys())
......
...@@ -166,4 +166,4 @@ if __name__ == "__main__": ...@@ -166,4 +166,4 @@ if __name__ == "__main__":
logger.info(" ") logger.info(" ")
logger.info("调度系统启动") logger.info("调度系统启动")
main(30, dispatcher) main(20, dispatcher)
#!/bin/bash #!/bin/bash
ps -ef|grep realtime_dispatch.py|grep -v grep |awk {'print $2'} ps -ef|grep realtime_dispatch.py|grep -v grep |awk {'print $2'} |xargs kill -9
kill -9 ps
python3 topo_update_server.py python3 topo_update_server.py
nohup python3 realtime_dispatch.py --active >/dev/null 2>&1 & nohup python3 realtime_dispatch.py --active >/dev/null 2>&1 &
nohup flask run --host=0.0.0.0 >/dev/null 2>&1 & nohup flask run --host=0.0.0.0 >/dev/null 2>&1 &
\ No newline at end of file
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