SBX模拟二进制交叉算子和DE差分进化算子

219 阅读1分钟

SBX(Simulated binary crossover) 模拟二进制交叉算子

关于交叉的详细信息可以在[40]中找到。实值可以用二进制符号表示,然后可以执行点交叉。SBX通过使用模拟二进制交叉的概率分布来模拟此操作。

可以通过创建交叉对象

from pymoo.operators.crossover.sbx import SBX

crossover = SBX()
  • 参数:
    • 交叉的概率
    • eta

在下面的示例中,我们演示了仅有一个变量的最佳化问题中的交叉,在两点0.2和0.8之间执行交叉,并将生成的指数分布可视化,根据eta,可以微调指数分布。 SBX的概率遵循指数分布。请注意,出于演示目的,我们设置了prob_var=1.0,这意味着每个变量都参与交叉(必要的,因为只有一个变量)。但是,建议执行两个变量的交叉,每个父变量的概率为0.5,如果没有其他定义,则默认定义。

import matplotlib.pyplot as plt
import numpy as np

from pymoo.core.individual import Individual
from pymoo.core.problem import Problem
from pymoo.operators.crossover.sbx import SBX


def show(eta_cross):
    problem = Problem(n_var=1, xl=0.0, xu=1.0)

    a, b = Individual(X=np.array([0.2])), Individual(X=np.array([0.8]))

    parents = [[a, b] for _ in range(5000)]

    off = SBX(prob=1.0, prob_var=1.0, eta=eta_cross).do(problem, parents)
    Xp = off.get("X")

    plt.hist(Xp, range=(0, 1), bins=200, density=True, color="red")
    plt.show()


show(1)

image.png

show(30)

image.png

此外,它可用于整数变量。边界略有修改,在进行交叉后,变量被舍入。

import matplotlib.pyplot as plt
import numpy as np

from pymoo.core.individual import Individual
from pymoo.core.problem import Problem
from pymoo.operators.crossover.sbx import SBX
from pymoo.operators.repair.rounding import RoundingRepair


def show(eta_cross):
    problem = Problem(n_var=1, xl=-20, xu=20)

    a, b = Individual(X=np.array([-10])), Individual(X=np.array([10]))

    parents = [[a, b] for _ in range(5000)]

    off = SBX(prob=1.0, prob_var=1.0, eta=eta_cross, repair=RoundingRepair(), vtype=float).do(problem, parents)
    Xp = off.get("X")

    plt.hist(Xp, range=(-20, 20), bins=41, density=True, color="red")
    plt.show()


show(3)

image.png

DE(differential evolution) 差分进化算子