Commit 2927681e authored by Allvey's avatar Allvey

分流配比改进

parent e3f3cb42
......@@ -392,12 +392,18 @@ class DistributionRatio(object):
recent_unload_area_output = self.get_cumulative_production()
# 获取当前正在前往卸载车辆情况
current_heading_to_unload_area_trucks = self.get_current_heading_to_unload_area_truck()
current_heading_to_unload_area_trucks = self.get_current_heading_to_unload_area_truck()
self.logger.info("current_heading_to_unload_area_trucks")
self.logger.info(current_heading_to_unload_area_trucks)
# 计算逻辑累计产量
logic_cumulative_output = {k: recent_unload_area_output[k] + current_heading_to_unload_area_trucks[k]
for k in recent_unload_area_output}
self.logger.info("logic_cumulative_output")
self.logger.info(logic_cumulative_output)
# 获取分流比例
DispatchInfo.get_exactor_unload_match(self.excavator_id)
......@@ -406,6 +412,9 @@ class DistributionRatio(object):
for item in self.group.group_unload_areas:
unload_ratio[item] = DispatchInfo.unload_rate_dict[item]
self.logger.info("unload_ratio")
self.logger.info(unload_ratio)
# 逻辑累计产量与分流比例比值
logic_cumulative_output = {k: float(logic_cumulative_output[k]) / unload_ratio[k] for k in logic_cumulative_output}
......@@ -414,7 +423,6 @@ class DistributionRatio(object):
return target_unload_area
def get_cumulative_production(self):
"""
Get unloading point yield in the past hour.
......@@ -424,8 +432,11 @@ class DistributionRatio(object):
recent_unload_area_output = {}
recent_duration = datetime.now() - timedelta(hours=1)
for unload_area_id in self.group.group_unload_areas:
recent_unload_area_output[unload_area_id] = \
len(session_mysql.query(RecordTruckOutput).filter_by(unload_area_id=unload_area_id).all())
recent_unload_area_output[unload_area_id] = len(session_mysql.query(RecordTruckOutput).
filter(RecordTruckOutput.end_time > recent_duration,
RecordTruckOutput.unload_area_id == unload_area_id).all())
return recent_unload_area_output
def get_current_heading_to_unload_area_truck(self):
......@@ -435,18 +446,17 @@ class DistributionRatio(object):
current_heading_to_unload_area_trucks = {}
for truck_info in self.group.truck_info_list:
trip = truck_info.get_trip()
if trip in [3, 4]:
for unload_area_id in self.group.group_unload_areas:
current_heading_to_unload_area_trucks[unload_area_id] = 0
for truck_info in self.group.truck_info_list.values():
task = truck_info.get_task()
if task in [3, 4]:
heading_unload_area = truck_info.get_combined_unload_area()
current_heading_to_unload_area_trucks[heading_unload_area] += 1
return current_heading_to_unload_area_trucks
def get_unload_ratio(self):
"""
@date:2022/7/19 15:21
......
......@@ -31,11 +31,11 @@ class Dispatcher:
self.request_mode = request_mode
self.logger = get_logger("zxt.dispatcher")
self.redispatch_active = active
# if self.redispatch_active:
# self.topo = Topo()
# self.topo.generate_topo_graph()
# else:
self.topo = None
if self.redispatch_active:
self.topo = Topo()
self.topo.generate_topo_graph()
else:
self.topo = None
self.submission = DispatchSubmission(dump, excavator, truck, self.topo)
def period_update(self):
......
......@@ -419,41 +419,41 @@ class GroupDispatcher:
for truck_id in list(self.group.group_trucks):
try:
# construct CurrentTruck obj.
current_truck = self.truck_construct(truck_id)
self.logger.info(
f'============================= 车辆调度开始 {current_truck.get_name()} =============================')
# 全智能模式
if self.group.group_mode == 1:
self.logger.info("调度模式:全智能模式调度")
self.full_dynamic_mode(truck_id, solver, truck_dispatch, current_truck)
# 空车智能模式
elif self.group.group_mode == 2:
self.logger.info("调度模式:空车智能模式调度")
self.semi_dynamic_mode(truck_id, solver, truck_dispatch, current_truck)
# 定铲派车
elif self.group.group_mode == 3:
self.logger.info("调度模式:固定模式调度")
try:
truck_dispatch[truck_id] = DispatchInfo.get_truck_match(truck_id)
except Exception as es:
self.logger.error("固定派车-计算异常")
self.logger.error(es)
# 分流配比模式
elif self.group.group_mode == 4:
self.logger.info("调度模式:分流配比模式调度")
self.ratio_mode(truck_id, truck_dispatch, current_truck)
# try:
self.logger.info(
f'============================= 车辆调度结束 {current_truck.get_name()} =============================')
# construct CurrentTruck obj.
current_truck = self.truck_construct(truck_id)
self.logger.info(
f'============================= 车辆调度开始 {current_truck.get_name()} =============================')
# 全智能模式
if self.group.group_mode == 1:
self.logger.info("调度模式:全智能模式调度")
self.full_dynamic_mode(truck_id, solver, truck_dispatch, current_truck)
# 空车智能模式
elif self.group.group_mode == 2:
self.logger.info("调度模式:空车智能模式调度")
self.semi_dynamic_mode(truck_id, solver, truck_dispatch, current_truck)
# 定铲派车
elif self.group.group_mode == 3:
self.logger.info("调度模式:固定模式调度")
try:
truck_dispatch[truck_id] = DispatchInfo.get_truck_match(truck_id)
except Exception as es:
self.logger.error("固定派车-计算异常")
self.logger.error(es)
# 分流配比模式
elif self.group.group_mode == 4:
self.logger.info("调度模式:分流配比模式调度")
self.ratio_mode(truck_id, truck_dispatch, current_truck)
self.logger.info(
f'============================= 车辆调度结束 {current_truck.get_name()} =============================')
except Exception as es:
self.logger.error("调度调用异常")
self.logger.error(es)
# except Exception as es:
# self.logger.error("调度调用异常")
# self.logger.error(es)
self.logger.info(
f'================================== 分组调度结束 {self.group.group_name} ==================================')
......@@ -462,15 +462,16 @@ class GroupDispatcher:
def ratio_mode(self, i, truck_dispatch, truck_info):
solver = DistributionRatio(self.group, truck_info, truck_info.get_combined_excavator())
# next_excavator_id = truck_info.get_combined_excavator()
next_excavator_id = DispatchInfo.get_truck_exactor(i) # 获取该卡车对应的 excavator_id
solver = DistributionRatio(self.group, truck_info, next_excavator_id)
next_exactor_id = truck_info.get_combined_excavator()
# next_exactor_id = DispatchInfo.get_truck_exactor(i) # 获取该卡车对应的exactor_id
self.logger.info(f"分流配比模式,对应的卡车:{i}")
self.logger.info(f"矿卡对应的铲车:{next_exactor_id}")
self.logger.info(f"矿卡对应的铲车:{next_excavator_id}")
next_unload_area_id = None
truck_task = truck_info.get_trip()
truck_task = truck_info.get_task()
if truck_task == -2:
......@@ -479,21 +480,21 @@ class GroupDispatcher:
# 空载模式下,计算下一次卸载区的位置,按照分流配比的模式进行计算
elif truck_task in [0, 1, 2]:
try:
if i in self.group.truck.truck_dump_bind:
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[i]]
else:
# try:
# next_unload_area_id = DistributionRatio(next_exactor_id, self.group.truck).ratio_main()
if i in self.group.truck.truck_dump_bind:
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[i]]
else:
next_unload_area_id = solver.solve()
# next_unload_area_id = DistributionRatio(next_exactor_id, self.group.truck).ratio_main()
except Exception as es:
next_unload_area_id = solver.solve()
self.logger.error("分流配比模式-->>空载车辆计算异常")
self.logger.error(es)
# except Exception as es:
#
# self.logger.error("分流配比模式-->>空载车辆计算异常")
# self.logger.error(es)
# 重载模式下,按照固定派车进行计算
elif truck_task in [3, 4, 5]:
......@@ -508,7 +509,10 @@ class GroupDispatcher:
self.logger.error(es)
truck_dispatch[i] = [next_exactor_id, next_unload_area_id]
truck_dispatch[i] = [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}')
def semi_dynamic_mode(self, i, s, truck_dispatch, truck_info):
# TODO:和全智能调度很像,是否可以合并合;
......
......@@ -504,15 +504,28 @@ class DispatchEquipment(Base):
self.equipment_id = equipment_id
# class RecordTruckOutput(Base):
# __tablename__ = 'record_truck_output'
# end_time = Column(DateTime)
# id = Column(Integer, primary_key=True)
# unload_area_id = Column(VARCHAR(36))
# equipment_id = Column(VARCHAR(36))
#
# def __init__(self, id, unload_area_id, equipment_id, end_time):
# self.id = id
# self.end_time = end_time
# self.unload_area_id = unload_area_id
# self.equipment_id = equipment_id
class RecordTruckOutput(Base):
__tablename__ = 'record_truck_output'
end_dump_time = Column(DateTime)
id = Column(Integer, primary_key=True)
id = Column(VARCHAR(36), primary_key=True)
unload_area_id = Column(VARCHAR(36))
equipment_id = Column(VARCHAR(36))
end_time = Column(DateTime)
def __init__(self, id, unload_area_id, equipment_id, end_dump_time):
def __init__(self, id, unload_area_id, end_time ):
self.id = id
self.end_dump_time = end_dump_time
self.unload_area_id = unload_area_id
self.equipment_id = equipment_id
self.end_time = end_time
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