添加yaml文件

This commit is contained in:
weixin_46229132 2025-03-11 16:40:20 +08:00
parent 1058f37be6
commit 4474a33cba
2 changed files with 45 additions and 51 deletions

View File

@ -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)

16
params.yml Normal file
View File

@ -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分钟