diff --git a/mtkl_sovler.py b/mtkl_sovler.py index a02d587..6a766c0 100644 --- a/mtkl_sovler.py +++ b/mtkl_sovler.py @@ -2,32 +2,33 @@ import random import math import matplotlib.pyplot as plt import matplotlib.patches as patches - +import yaml # 固定随机种子,便于复现 random.seed(42) +num_iterations = 100000 + # --------------------------- # 参数设置 # --------------------------- -H = 20 # 区域高度,网格点之间的距离为25m(单位距离) -W = 25 # 区域宽度 -k = 1 # 系统数量(车-巢-机系统个数) -num_iterations = 1000000 # 蒙特卡洛模拟迭代次数 +with open('params.yml', 'r', encoding='utf-8') as file: + params = yaml.safe_load(file) -# 时间系数(单位:秒,每个网格一张照片) -flight_time_factor = 3 # 每张照片对应的飞行时间,无人机飞行速度为9.5m/s,拍摄照片的时间间隔为3s -comp_uav_factor = 5 # 无人机上每张照片计算时间,5s -trans_time_factor = 0.3 # 每张照片传输时间,0.3s -car_move_time_factor = 2 * 50 # TODO 汽车每单位距离的移动时间,2s,加了一个放大因子 -comp_bs_factor = 5 # 机巢上每张照片计算时间 +H = params['H'] +W = params['W'] +k = params['num_cars'] -# 其他参数 -flight_energy_factor = 0.05 # 单位:分钟/张 -comp_energy_factor = 0.05 # 计算能耗需要重新估计 -trans_energy_factor = 0.0025 -battery_capacity = 10 # 无人机只进行飞行,续航为30分钟 -# bs_energy_factor = -# car_energy_factor = + +flight_time_factor = params['flight_time_factor'] +comp_time_factor = params['comp_time_factor'] +trans_time_factor = params['trans_time_factor'] +car_time_factor = params['car_time_factor'] +bs_time_factor = params['bs_time_factor'] + +flight_energy_factor = params['flight_energy_factor'] +comp_energy_factor = params['comp_energy_factor'] +trans_energy_factor = params['trans_energy_factor'] +battery_energy_capacity = params['battery_energy_capacity'] # --------------------------- # 蒙特卡洛模拟,寻找最佳方案 @@ -59,42 +60,19 @@ for iteration in range(num_iterations): c2 = col_boundaries[j + 1] d = (r2 - r1) * (c2 - c1) # 任务的照片数量(矩形面积) - # # 每个任务随机生成卸载比率 ρ ∈ [0,1] - # rho = random.random() - # # rho = 0.1 - - # # 计算各个阶段时间 - # flight_time = flight_time_factor * d - # comp_time = comp_uav_factor * rho * d - # trans_time = trans_time_factor * (1 - rho) * d - # comp_bs_time = comp_bs_factor * (1 - rho) * d - - # # 检查无人机电池约束: - # # 飞行+计算+传输能耗需不超过电池容量 - # flight_energy = flight_energy_factor * d - # comp_energy = comp_energy_factor * rho * d - # trans_energy = trans_energy_factor * (1 - rho) * d - # total_uav_energy = flight_energy + comp_energy + trans_energy - # # 无人机计算与传输时间不超过飞行时间 - # if (total_uav_energy > battery_capacity) or (comp_time + trans_time > flight_time): - # # TODO 时间约束的rho上界是个常数0.57,如果区域划分定了,rho直接取上界即可,可以数学证明 - # valid_partition = False - # break - # 求解rho rho_time_limit = (flight_time_factor - trans_time_factor) / \ - (comp_uav_factor - trans_time_factor) - rho_energy_limit = (battery_capacity - flight_energy_factor * d - trans_energy_factor * d) / \ + (comp_time_factor - trans_time_factor) + rho_energy_limit = (battery_energy_capacity - flight_energy_factor * d - trans_energy_factor * d) / \ (comp_energy_factor * d - trans_energy_factor * d) if rho_energy_limit < 0: valid_partition = False break rho = min(rho_time_limit, rho_energy_limit) - print(rho) flight_time = flight_time_factor * d - comp_time = comp_uav_factor * rho * d + comp_time = comp_time_factor * rho * d trans_time = trans_time_factor * (1 - rho) * d - comp_bs_time = comp_bs_factor * (1 - rho) * d + bs_time = bs_time_factor * (1 - rho) * d # 计算任务矩形中心,用于后续车辆移动时间计算 center_r = (r1 + r2) / 2.0 @@ -107,7 +85,7 @@ for iteration in range(num_iterations): 'flight_time': flight_time, 'comp_time': comp_time, 'trans_time': trans_time, - 'comp_bs_time': comp_bs_time, + 'bs_time': bs_time, 'center': (center_r, center_c) }) if not valid_partition: @@ -140,18 +118,18 @@ for iteration in range(num_iterations): if tasks: # 车辆从区域中心到第一个任务中心 car_time = math.hypot(tasks[0]['center'][0] - region_center[0], - tasks[0]['center'][1] - region_center[1]) * car_move_time_factor + tasks[0]['center'][1] - region_center[1]) * car_time_factor # 依次经过任务中心 for j in range(1, len(tasks)): prev_center = tasks[j - 1]['center'] curr_center = tasks[j]['center'] car_time += math.hypot(curr_center[0] - prev_center[0], - curr_center[1] - prev_center[1]) * car_move_time_factor + curr_center[1] - prev_center[1]) * car_time_factor else: car_time = 0 # 机巢的计算时间 - total_bs_time = sum(task['comp_bs_time'] for task in tasks) + total_bs_time = sum(task['bs_time'] for task in tasks) T_k = max(total_flight_time + car_time, total_bs_time) T_k_list.append(T_k) @@ -209,7 +187,7 @@ if best_solution is not None: for i, task in enumerate(tasks_sorted, 1): # 计算车辆移动时间 car_time = math.hypot(task['center'][0] - current_pos[0], - task['center'][1] - current_pos[1]) * car_move_time_factor + task['center'][1] - current_pos[1]) * car_time_factor total_car_time += car_time # 更新当前位置 @@ -249,7 +227,7 @@ if best_solution is not None: print(f" -- 飞行能耗: {task['d'] * flight_energy_factor:.2f} 分钟") print(f" -- 计算能耗: {task['d'] * comp_energy_factor:.2f} 分钟") print(f" -- 传输能耗: {task['d'] * trans_energy_factor:.2f} 分钟") - print(f" 基站计算时间: {task['comp_bs_time']:.2f} 秒") + print(f" 基站计算时间: {task['bs_time']:.2f} 秒") else: print("该系统没有分配任务") print("-" * 50) diff --git a/params.yml b/params.yml new file mode 100644 index 0000000..8233493 --- /dev/null +++ b/params.yml @@ -0,0 +1,16 @@ +H : 20 # 区域高度,网格点之间的距离为25m(单位距离) +W : 25 # 区域宽度 +num_cars : 1 # 系统数量(车-巢-机系统个数) + +# 时间系数(单位:秒,每个网格一张照片) +flight_time_factor : 3 # 每张照片对应的飞行时间,无人机飞行速度为9.5m/s,拍摄照片的时间间隔为3s +comp_time_factor : 5 # 无人机上每张照片计算时间,5s +trans_time_factor : 0.3 # 每张照片传输时间,0.3s +car_time_factor : 100 # TODO 汽车每单位距离的移动时间,2s,加了一个放大因子50 +bs_time_factor : 5 # 机巢上每张照片计算时间 + +# 其他参数 +flight_energy_factor : 0.05 # 单位:分钟/张 +comp_energy_factor : 0.05 # TODO 计算能耗需要重新估计 +trans_energy_factor : 0.0025 +battery_energy_capacity : 20 # 无人机只进行飞行,续航为30分钟 \ No newline at end of file