✅博主简介:本人擅长数据处理、建模仿真、论文写作与指导,科研项目与课题交流。项目合作可私信或扫描文章底部二维码。
import random# 虚拟机数量和任务数量num_vms = 5num_tasks = 10vm_performances = [random.randint(50, 200) for _ in range(num_vms)]# 蚁群算法相关参数alpha = 1.0 # 信息素重要程度因子beta = 2.0 # 启发式因子重要程度rho = 0.5 # 信息素挥发系数q = 100 # 信息素增强系数num_ants = 10 # 蚂蚁数量# 信息素矩阵初始化pheromone_matrix = [[1.0 for _ in range(num_vms)] for _ in range(num_tasks)]# 蚁群算法的任务分配函数def ant_colony_allocation(): task_assignments = [] for ant in range(num_ants): assignment = [] for task in range(num_tasks): # 计算选择每个虚拟机的概率 probabilities = [] for vm in range(num_vms): pheromone = pheromone_matrix[task][vm] heuristic = 1.0 / task_execution_times[task][vm] probability = (pheromone ** alpha) * (heuristic ** beta) probabilities.append(probability) total_probability = sum(probabilities) probabilities = [p / total_probability for p in probabilities] # 根据概率选择虚拟机 selected_vm = random.choices(range(num_vms), weights=probabilities)[0] assignment.append(selected_vm) task_assignments.append(assignment) return task_assignments# 计算完工时间def calculate_makespan(assignments): vm_loads = [0 for _ in range(num_vms)] for task, vm in enumerate(assignments): vm_loads[vm] += task_execution_times[task][vm] return max(vm_loads)# 信息素更新函数def update_pheromones(assignments, makespan): for task, vm in enumerate(assignments): pheromone_matrix[task][vm] = (1 - rho) * pheromone_matrix[task][vm] + q / makespan# 模拟退火算法相关参数(假设值)initial_temperature = 1000.0cooling_rate = 0.95min_temperature = 1.0# 模拟退火算法的接受概率函数def acceptance_probability(old_makespan, new_makespan, temperature): if new_makespan < old_makespan: return 1.0 else: return math.exp(-(new_makespan - old_makespan) / temperature)# 免疫 - 蚁群优化算法(IMACO)def immune_ant_colony_optimization(): # 初始化免疫算法的种群(这里简单假设随机生成) immune_population = [[random.randint(0, num_vms - 1) for _ in range(num_tasks)] for _ in range(20)] # 评估免疫算法的种群 immune_fitnesses = [calculate_makespan(population) for population in immune_population] # 选择最优的个体作为蚁群算法的初始信息素分布 best_immune_individual = immune_population[immune_fitnesses.index(min(immune_fitnesses))] for task in range(num_tasks): for vm in range(num_vms): pheromone_matrix[task][vm] = 1.0 + (best_immune_individual[task] == vm) * 10.0 # 执行蚁群算法 while True: # 蚂蚁分配任务 ant_assignments = ant_colony_allocation() # 计算完工时间 ant_makespans = [calculate_makespan(assignment) for assignment in ant_assignments] # 找到最佳的蚂蚁分配 best_ant_index = ant_makespans.index(min(ant_makespans)) best_ant_assignment = ant_assignments[best_ant_index] best_ant_makespan = ant_makespans[best_ant_index] # 更新信息素 update_pheromones(best_ant_assignment, best_ant_makespan) # 检查终止条件(这里简单假设达到一定的迭代次数) if iteration >= max_iterations: break iteration += 1 return best_ant_assignment, best_ant_makespan# 改进白鲸优化算法(IBWO)相关参数(假设值)a = 2.0b = 1.0l = random.uniform(-1, 1)# 白鲸位置表示任务分配(假设)whale_positions = [[random.randint(0, num_vms - 1) for _ in range(num_tasks)] for _ in range(20)]# 改进白鲸优化算法(IBWO)def improved_beluga_whale_optimization(): while True: # 包围猎物阶段 for i in range(len(whale_positions)): for j in range(num_tasks): r1 = random.random() r2 = random.random() A = 2 * a * r1 - a C = 2 * r2 if abs(A) < 1: # 选择当前最优解 D = abs(C * best_whale_position[j] - whale_positions[i][j]) whale_positions[i][j] = best_whale_position[j] - A * D else: # 选择随机解 random_index = random.randint(0, len(whale_positions) - 1) random_whale_position = whale_positions[random_index] D = abs(C * random_whale_position[j] - whale_positions[i][j]) whale_positions[i][j] = random_whale_position[j] - A * D # 泡泡网攻击阶段(这里简单假设与包围猎物阶段类似的更新方式) for i in range(len(whale_positions)): for j in range(num_tasks): r3 = random.random() r4 = random.random() A = 2 * a * r3 - a C = 2 * r4 if abs(A) < 1: # 选择当前最优解 D = abs(C * best_whale_position[j] - whale_positions[i][j]) whale_positions[i][j] = best_whale_position[j] - A * D else: # 选择随机解 random_index = random.randint(0, len(whale_positions) - 1) random_whale_position = whale_positions[random_index] D = abs(C * random_whale_position[j] - whale_positions[i][j]) whale_positions[i][j] = random_whale_position[j] - A * D # 鲸落阶段 for i in range(len(whale_positions)): # 生成准反向解 quasi_opposite_positions = [] for j in range(num_tasks): qo = (num_vms - 1) - whale_positions[i][j] + random.uniform(-1, 1) quasi_opposite_positions.append(int(max(0, min(num_vms - 1, qo)))) # 评估原解和准反向解 original_fitness = calculate_makespan(whale_positions[i]) quasi_opposite_fitness = calculate_makespan(quasi_opposite_positions) # 选择更好的解 if quasi_opposite_fitness < original_fitness: whale_positions[i] = quasi_opposite_positions # 更新最优解 for whale_position in whale_positions: fitness = calculate_makespan(whale_position) if fitness < best_whale_fitness: best_whale_position = whale_position best_whale_fitness = fitness # 模拟退火操作 temperature = initial_temperature while temperature > min_temperature: new_whale_positions = [[whale_position[j] + random.uniform(-l, l) for j in range(num_tasks)] for whale_position in best_whale_position] new_fitness = calculate_makespan(new_whale_positions) if new_fitness < best_whale_fitness or random.random() < acceptance_probability(best_whale_fitness, new_fitness, temperature): best_whale_position = new_whale_positions best_whale_fitness = new_fitness temperature *= cooling_rate # 检查终止条件(这里简单假设达到一定的迭代次数) if iteration >= max_iterations: break iteration += 1 return best_whale_position, best_whale_fitness# 主函数def main():