C-TAEA算法源代码复现

论文:《Two-Archive Evolutionary Algorithm for Constrained Multiobjective Optimization》

双档案进化的约束多目标优化算法

1、摘要

在求解约束多目标优化问题时,如何同时兼顾收敛性、多样性和可行性是一个重要问题。为了解决这一问题,本文提出了一种无参数约束处理技术——双档案进化算法,用于约束多目标优化。它同时保持着两种协作性档案:一种称为趋同导向档案(CA),是推动人口走向帕累托前沿的驱动力;另一种是多样性导向档案(DA),主要倾向于维持种群多样性。特别是,为了补充CA的行为,提供尽可能多的多样化信息,DA旨在探索CA未开发的区域,包括不可行的区域。为了利用这两种基因的互补效应,我们开发了一种限制性交配选择机制,根据它们的进化状态自适应地选择合适的交配亲本。在一系列基准问题上的综合实验和一个真实世界的案例研究充分证明了我们提出的算法的竞争力,与五种最先进的受限进化多目标优化器相比。

2、模型及数学问题

本文所考虑的约束多目标优化问题定义为:

 其中X=(x_1,...x_n)^T是一个候选解,Ω定义搜索(或决策变量)空间

 其中是一个足够小的容忍项(例如 = 10−6),用于将等式约束放松为不等式约束。α如果α≥0则返回0,否则返回α的负数。x的约束违背值计算为;

3、本文创新   


        近二十年来,人们致力于发展进化多目标优化算法,如精英非支配排序遗传算法(NSGA-II)[2]、基于指标的遗传算法[3]和基于分解[4]的多目标遗传算法。然而,尽管大多数(如果不是全部的话)现实优化场景都有各种性质的约束。一般来说,收敛性、多样性和可行性是cops的三个基本问题。大多数(如果不是全部的话)现有的约束处理技术首先倾向于将种群尽可能地推向可行区域,而不考虑可行区域内收敛和多样性的平衡。这可能会导致种群陷入某些局部最优或局部可行区域,特别是当可行区域较窄且/或在搜索空间中分布不均匀时。
具体来说,我们同时维护两个协作和互补的档案:一个被称为趋同导向档案(convergence-oriented archive, CA);而另一个被标记为面向多样性的归档(DA)。C-TAEA的主要特征如下:1)顾名思义,CA是保持进化过程收敛性和可行性的驱动力。2)在不考虑可行性的情况下,动态进化算法主要倾向于保持进化过程的收敛性和多样性。特别是,DA探索了CA尚未利用的区域。这不仅提高了CA在当前调查可行区域内的种群多样性,而且有助于跳过局部最优或局部可行区域。3)为了利用这两种协作档案的互补效应和精英信息,我们建立了一种限制性交配选择机制,根据进化状态分别从CA和DA中选择合适的交配亲本。在EMO中使用两个档案的想法自2006年以来一直存在。例如,[6][8]开发了几个两种存档EMO算法,使用两个概念上互补的种群来实现进化过程的收敛性和多样性之间的平衡。Li等人[9]开发了一种双种群范式,结合了基于分解和帕累托选择机制的优势。


具体来说,我们同时维护两个协作和互补的档案:一个被称为趋同导向档案(convergence-oriented archive, CA);而另一个被标记为面向多样性的归档(DA)。C-TAEA的主要特征如下:1)顾名思义,CA是保持进化过程收敛性和可行性的驱动力。2)在不考虑可行性的情况下,动态进化算法主要倾向于保持进化过程的收敛性和多样性。特别是,DA探索了CA尚未利用的区域。这不仅提高了CA在当前调查可行区域内的种群多样性,而且有助于跳过局部最优或局部可行区域。3)为了利用这两种协作档案的互补效应和精英信息,我们建立了一种限制性交配选择机制,根据进化状态分别从CA和DA中选择合适的交配亲本。
例如,[6][8]开发了几个两种存档EMO算法,使用两个概念上互补的种群来实现进化过程的收敛性和多样性之间的平衡。Li等人[9]开发了一种双种群范式,结合了基于分解和帕累托选择机制的优势。在本文中,我们想要,第一次,探索双档案策略的潜在优势。本文的其余部分组织如下。第二节简要概述了为cops开发的最先进的进化方法,然后引出我们的动机。第三节逐步介绍了所提算法的技术细节。随后,在第四节和第五节中,对所提算法的有效性和竞争力进行了实证研究,并与五种最新的约束EMO算法在各种基准问题上进行了比较。最后,第六部分对全文进行了总结,并对未来的发展方向提出了设想。

4、核心代码:

import math
import matplotlib.pyplot as plt
import numpy as np
from ctaea import constrained_two_archive_evolutionary_algorithm


# Target Function 1: Kursawe 1
def kursawe_f1(variables_values=[0, 0]):
    f1 = 0
    if (len(variables_values) == 1):
        f1 = f1 - 10 * math.exp(-0.2 * math.sqrt(variables_values[0] ** 2 + variables_values[0] ** 2))
    else:
        for i in range(0, len(variables_values) - 1):
            f1 = f1 - 10 * math.exp(-0.2 * math.sqrt(variables_values[i] ** 2 + variables_values[i + 1] ** 2))
    return f1


# Target Function 2: Kursawe 2
def kursawe_f2(variables_values=[0, 0]):
    f2 = 0
    for i in range(0, len(variables_values)):
        f2 = f2 + abs(variables_values[i]) ** 0.8 + 5 * math.sin(variables_values[i] ** 3)
    return f2


# CTAEA - Parameters
size = 25
m_r = 0.10
minv = [-5, -5]
maxv = [5, 5]
lof = [kursawe_f1, kursawe_f2]
gen = 500
mu = 1
eta = 1
k = 2  # Population = k*(Total Number of Points in the Reference Hyperplane)
# Calling CTAEA Function
ctaea_kursawe = constrained_two_archive_evolutionary_algorithm(references=size, mutation_rate=m_r, min_values=minv,
                                                               max_values=maxv, list_of_functions=lof, generations=gen,
                                                               mu=mu, eta=eta, k=k)

# Kursawe Pareto Front
x = np.arange(-5, 5, 0.1)
kursawe = np.zeros((x.shape[0] ** 2, 4))
count = 0
for j in range(0, x.shape[0]):
    for k in range(0, x.shape[0]):
        kursawe[count, 0] = x[j]
        kursawe[count, 1] = x[k]
        count = count + 1
for i in range(0, kursawe.shape[0]):
    kursawe[i, 2] = kursawe_f1(variables_values=[kursawe[i, 0], kursawe[i, 1]])
    kursawe[i, 3] = kursawe_f2(variables_values=[kursawe[i, 0], kursawe[i, 1]])
kursawe_1 = kursawe[:, 2]
kursawe_2 = kursawe[:, 3]

# Graph Pareto Front Solutions
plt.style.use('bmh')
plt.figure(figsize=(25, 15))
plt.xlabel('Function 1', fontsize=12)
plt.ylabel('Function 2', fontsize=12)
plt.scatter(ctaea_kursawe[:, -2], ctaea_kursawe[:, -1], c='r', s=45, marker='o', label='CTAEA')
plt.scatter(kursawe_1, kursawe_2, c='k', s=2, marker='.', label='Solutions')
plt.legend(loc='upper right')
plt.show()

算法运行结果:

 

python源代码下载链接:

🍞正在为您运送作品详情

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

智能优化_数据分析_AI算法

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值