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,可以根据问题进行调整),并将其添加到目标函数中。