geatpy里遗传算法的等式约束条件该怎么写啊?

    def aimFunc(self, pop): # 目标函数
        x1 = pop.Phen[:, [0]] # 获取表现型矩阵的第一列,得到所有个体的x1的值
        x2 = pop.Phen[:, [1]]
        x3 = pop.Phen[:, [2]]
        f = 4*x1 + 2*x2 + x3
        exIdx1 = np.where(2*x1 + x2 - 1 > 0)[0] # 因为约束条件之一是x1不能为10,这里把x1等于10的个体找到
        exIdx2 = np.where(x1 + 2*x3 - 2 > 0)[0]
        Idx3 = np.where(x1 + x2 + x3 -1 == 0)[0]
        f[exIdx1]=1
        f[exIdx2]=1
        f[Idx3]=0
        pop.ObjV = f # 计算目标函数值,赋值给pop种群对象的ObjV属性

这是我写的遗传算法目标函数和约束条件,运行结果为

评价次数:25000
时间已过 0.6162989139556885 秒
最优的目标函数值为:3.0
最优的控制变量值为:
0.0
1.0
0.9999999999999998

感觉等式约束没有起作用,该如何修改啊?

在 Geatpy 中,处理等式约束的方法通常是将等式约束转换为接近于零的目标函数。尝试一下使用罚函数方法,将等式约束加入到目标函数中,通过增加一个较大的惩罚系数来实现。

def aimFunc(self, pop):  # 目标函数
    x1 = pop.Phen[:, [0]]  # 获取表现型矩阵的第一列,得到所有个体的x1的值
    x2 = pop.Phen[:, [1]]
    x3 = pop.Phen[:, [2]]
    f = 4 * x1 + 2 * x2 + x3
    
    # 不等式约束
    exIdx1 = np.where(2 * x1 + x2 - 1 > 0)[0]
    exIdx2 = np.where(x1 + 2 * x3 - 2 > 0)[0]
    
    # 等式约束
    eq_constr = np.abs(x1 + x2 + x3 - 1)  # 等式约束转为接近0的目标函数
    penalty_factor = 1e6  # 惩罚系数,需要根据问题调整
    penalty = penalty_factor * eq_constr
    
    f[exIdx1] = 1
    f[exIdx2] = 1
    pop.ObjV = f + penalty  # 计算目标函数值,加上惩罚项,赋值给pop种群对象的ObjV属性

将等式约束 x1 + x2 + x3 - 1 == 0 转换为 eq_constr = np.abs(x1 + x2 + x3 - 1)。然后,我们为等式约束设定一个较大的惩罚系数(在这里为 1e6,可以根据问题进行调整),并将其添加到目标函数中。