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)
show(30)
此外,它可用于整数变量。边界略有修改,在进行交叉后,变量被舍入。
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)