多目标(Nsga-Ⅱ、BRO)特征选择与单目标(GA、SA、PSO)特征选择算法对比
NSGA-II(非支配排序遗传算法 II)
NSGA-II,全称为非支配排序的遗传算法第二版,是一种用于解决多目标优化问题的算法。它通过非支配排序和拥挤距离比较来维持种群的多样性,有效地在多目标优化问题中找到一组好的解,这组解尽可能地接近真实的帕累托前沿并且分布均匀。
BRO(大逃杀优化)
BRO,即大逃杀优化,是受流行的大逃杀游戏模式启发的一种新颖元启发式优化算法。在这种算法中,每个解都被视为一名士兵/玩家,目标是通过策略性地移动向最优解靠拢,同时避免被淘汰,以求在“游戏”结束时存活下来,从而找到问题的最优解。
GA(遗传算法)
遗传算法是受自然选择和遗传学原理启发的搜索和优化算法。它使用了遗传机制中的交叉、变异和选择等操作。解通过代表染色体的字符串来表示,算法通过模拟自然进化过程逐步改进解的质量。GA非常适合于大规模搜索空间的问题,并能有效找到全局最优解或其近似解。
SA(模拟退火算法)
模拟退火算法是一种以物理退火过程为灵感的优化算法,用于寻找在给定时间内的全局最优解。它允许在搜索过程中以一定的概率接受比当前解差的解,以避免算法过早陷入局部最优。随着“温度”参数的降低,算法逐渐减少接受差解的概率,以稳步找到最优解。
PSO(粒子群优化)
粒子群优化算法是一种基于群体协作的优化算法,灵感来源于鸟群觅食行为。在PSO中,每个解被视为搜索空间中的一个“粒子”,粒子通过跟踪个体和群体的经验最优位置来更新自己的位置。这种算法特别适合于连续函数优化问题,并且易于实现和并行化。
完整代码私信我获取
# ***********************************************绘图***************************************************
fitness_history = []
# 修改eaMuPlusLambda调用,加入循环以手动控制每一代的进化,并调用collect_fitness函数
for gen in range(num_generations):
# 生成后代
offspring = algorithms.varAnd(population, toolbox, cxpb=0.5, mutpb=0.2)
# 评估个体(仅新个体)
invalid_ind = [ind for ind in offspring if not ind.fitness.valid]
fitnesses = map(toolbox.evaluate, invalid_ind)
for ind, fit in zip(invalid_ind, fitnesses):
ind.fitness.values = fit
# 更新种群
population = toolbox.select(offspring + population, population_size)
# 收集并记录适应度数据
collect_fitness(population, gen, fitness_history)
# 绘制帕累托前沿
pareto_front = tools.sortNondominated(population, len(population), first_front_only=True)[0]
pareto_fitnesses = [ind.fitness.values for ind in pareto_front]
plt.scatter(*zip(*pareto_fitnesses))
plt.title("帕累托前言")
plt.xlabel("准确率")
plt.ylabel("特征数")
plt.show()
# 计算每一代的准确率适应度平均值
average_accuracy_over_generations = [sum(individual[0] for individual in generation) / len(generation) for generation in fitness_history]
plt.figure(figsize=(10, 6)) # 设置图形的大小
plt.plot(average_accuracy_over_generations, label='准确率', color='blue', linewidth=2, linestyle='--') # 改变线条颜色、线宽和样式
plt.scatter(range(len(average_accuracy_over_generations)), average_accuracy_over_generations, color='red', s=50, label='数据点') # 在每个数据点位置绘制红色圆圈,s控制圆圈大小
plt.xlabel('迭代次数', fontsize=14) # 增大字体大小
plt.ylabel('准确率适应度值', fontsize=14) # 增大字体大小
plt.title('NSGA-II 适应度值变化图', fontsize=16) # 增大标题字体大小
plt.tight_layout() # 自动调整子图参数, 使之填充整个图像区域
plt.show()