当优化问题的目标函数为两个或两个以上时,该优化问题就是多目标优化。不同于单目标优化问题,多目标问题没有单独的解能够同时优化所有目标,也就是目标函数之间存在着冲突关系,其最优解通常是一系列解。多目标优化问题的解决办法有两类:一种是通过加权因子等方法将多目标转换成单目标优化问题,这种方法缺点明显;现在更多地是采用基于Pareto最优解的方法。
2. Pareto最优解
Pareto最优解是指:一个解的多目标中,其中任何一个目标都无法在改进同时保证不会使其他目标函数恶化。假设一个多目标目标表示为如下:
支配关系:和属于上述问题的可行解,如果满足以下关系:
此时我们就称支配。结合上述支配关系,重新理解Pareto最优解,即:当一个解不被其他任何解支配时,就称其为Pareto最优解。可行解中的所有Pareto最优解一起组成了Pareto前沿。而基于Pareto最优解的方法就是找到这个Pareto前沿。
3. NSGA-Ⅱ
NSGA-Ⅱ是基于遗传算法,引入快速非支配排序方法、拥挤度计算和精英策略的多目标优化计算方法。主要流程图:
快速非支配排序:计算每个个体的非支配等级(Pareto等级),在种群P中,当前Pareto最优解的个体的非支配等级为1,然后除去这些等级为1的个体,组成的新种群P’,在新种群P’中最优解的非支配等级为2,以此类推计算出种群P中的所有个体的非支配等级。伪代码如下:
拥挤度计算:拥挤度计算是用于表现同一非支配等级个体之间的距离,在算法中使用是为了保证种群个体的多样性,避免陷入局部最优解。具体伪代码如下:
选择策略:模拟生物进化过程中优胜劣汰,采用的二进制竞标赛选择策略,首先随机选择两个个体进行比较,胜的留下来。比较规则是:首先比较非支配等级,等级小的胜即留下来,其次如果非支配等级相同,比较拥挤度,拥挤度大的留下来,如果拥挤度也相同,随机留下一个。伪代码:
交叉和变异:交叉和变异是模拟生物产生新子代个体的过程。交叉是两个父代按照一定公式利用父代个体每一个元素生成新的子代,而变异是个体是否自己发生一些变化,即产生变异。本次交叉采用的二进制交叉策略,变异采用多项式变异策略。
二进制交叉策略公式:
精英保留策略:是将父代种群和生成子代种群一起进行比较,比较策略与选择策略时相同,从而将最优的个体保留到子代种群中去,可以加快优化算法的迭代,避免陷入局部最优解。
4. 应用案例
标准测试函数ZDT1:
代码语言:javascript复制clear;clc;
pop_num = 50;
i_max = 200;
pc = 1;
pm = 0.1;
eta1 = 20;
eta2 = 20;
v = 30;
min_range = zeros(1,v);
max_range = ones(1,v);
func = @ZDT1;
pop = initialize_variables(pop_num,min_range,max_range);
best_fitness = [];
best_pop = [];
fitness = compute_fitness(pop,func);
rank = non_domination_sort(fitness);
chromo = crowding_distance(rank,fitness);
for i = 1:i_max
tour = 2;
parent_pop = tournament_selection(pop,fitness,tour);
offspring_pop = cross_mutation(parent_pop,func,pc,pm,min_range,max_range,eta1,eta2);
pop = elitism(parent_pop,offspring_pop,func);
fitness = compute_fitness(pop,func);
rank = non_domination_sort(fitness);
chromo = crowding_distance(rank,fitness);
end
plot(fitness(:,1),fitness(:,2),'*');
求解得到的Pareto前沿如下图所示:
参考资料:
DebK, Agrawal S, Pratap A, et al. A Fast Elitist Non-dominated Sorting Genetic Algorithm for Multi-objective Optimisation: NSGA-II[C]// InternationalConference on Parallel Problem Solving From Nature. Springer-Verlag,2000:849-858.
以下为完整代码: