获得Pareto前沿的方法有什么?NSGA-Ⅱ怎么获得Pareto非支配解集 + 支配解集?怎么获得Pareto前沿?/非支配解集代码实现

获得Pareto前沿的方法有什么?

获得Pareto前沿的方法有很多,下面列举了一些常用的方法:

  1. 权重法(Weighted Sum Method):为每个目标函数分配一个权重,并将多目标优化问题转化为单目标优化问题。通过改变不同的权重组合来获得Pareto前沿。

  2. 约束法(ε-constraint Method):将其中一个目标设为主要目标,其他目标通过约束来控制,然后对主要目标进行优化。

  3. 非支配排序遗传算法(NSGA-II):这是一个基于遗传算法的多目标优化方法,它使用非支配排序策略和拥挤距离来保持种群的多样性。

  4. 多目标粒子群优化算法(MOPSO):它是基于粒子群优化的多目标优化方法,通常结合存档策略来维护Pareto前沿。

  5. 多目标模拟退火算法:基于模拟退火的策略进行多目标优化。

  6. 多目标蚁群算法:模仿自然界蚂蚁的行为,对多目标问题进行优化。

  7. RVEA(Reference Vector Guided Evolutionary Algorithm):是一种最新的进化算法,利用参考向量技术来引导搜索。

  8. 多目标深度学习方法:近年来,随着深度学习的发展,也有一些方法开始尝试结合深度学习技术来解决多目标优化问题。


NSGA-Ⅱ怎么获得Pareto非支配解集? + 代码实现

例子:以下列数据为例,其中第二行与第三行的数据都是越小越好

其中可以说解D支配解B,因为D在成本上小于B,且最糟反馈上不比B差。

1)求解支配解集代码:

import numpy as np
import pandas as pd

d = {
    'A': [20, 2.2],
    'B': [60, 4.4],
    'C': [65, 3.5],
    'D': [15, 4.4],
    'E': [55, 4.5],
    'F': [50, 1.8],
    'G': [80, 4.0],
    'H': [25, 4.6]
}
df = pd.DataFrame(data=d).T
data_labels = list(df.index)
data_array = np.array(df).T

# 指定解决的索引
sol_index = 1
sol = data_array[:, sol_index]
obj1_not_worse = np.where(sol[0] >= data_array[0, :])[0]
obj2_not_worse = np.where(sol[1] >= data_array[1, :])[0]
not_worse_candidates = set.intersection(set(obj1_not_worse), set(obj2_not_worse))

obj1_better = np.where(sol[0] > data_array[0, :])[0]
obj2_better = np.where(sol[1] > data_array[1, :])[0]
better_candidates = set.intersection(set(obj1_better), set(obj2_better))

dominating_solution = list(set.intersection(not_worse_candidates, better_candidates))

if len(dominating_solution) == 0:
    print("No solution dominates solution", data_labels[sol_index], ".")
else:
    print("Labels of one or more solutions dominating this solution :", end="")
    for k in dominating_solution:
        print(data_labels[k], end=',')

2)求解非支配解集代码:

import numpy as np
import pandas as pd

d = {
    'A': [20, 2.2],
    'B': [60, 4.4],
    'C': [65, 3.5],
    'D': [15, 4.4],
    'E': [55, 4.5],
    'F': [50, 1.8],
    'G': [80, 4.0],
    'H': [25, 4.6]
}
df = pd.DataFrame(data=d).T
data_labels = list(df.index)
data_array = np.array(df).T


def solve(sol_index):
    sol = data_array[:, sol_index]
    obj1_not_worse = np.where(sol[0] >= data_array[0, :])[0]
    obj2_not_worse = np.where(sol[1] >= data_array[1, :])[0]
    not_worse_candidates = set.intersection(set(obj1_not_worse), set(obj2_not_worse))

    obj1_better = np.where(sol[0] > data_array[0, :])[0]
    obj2_better = np.where(sol[1] > data_array[1, :])[0]
    better_candidates = set.intersection(set(obj1_better), set(obj2_better))

    dominating_solution = list(set.intersection(not_worse_candidates, better_candidates))
    if len(dominating_solution) == 0:
        return True
    else:
        return False


dominating_set = []
for k in range(data_array.shape[1]):
    if solve(k):
        dominating_set.append(data_labels[k])
print(dominating_set)

3)别的实现方法

看:【精选】多目标pareto最优解集构造方法_多目标遗传算法如何增加帕累托解集_打呼噜的星.的博客-CSDN博客

非支配集求解(python)_非支配解_SoulMartyr的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pengsen Ma

太谢谢了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值