PSO算法求解(下)-罚函数方法

在上一篇博客“PSO算法求解(上)-基本PSO”中,回顾了基本粒子群算法求解无约束问题的流程,那么,有约束的问题该如何求解?
一种方法是将约束作为边界,对产生的粒子除边界检验以外,再考虑粒子是否满足约束式,如博客https://blog.csdn.net/weixin_37980595/article/details/104467199;然而,这种方法的求解过程非常缓慢,且操作较繁琐。
另一种方法是将约束问题转化为无约束问题,求解较快,且操作简洁。这种转化方法很多,如罚函数法,拉格朗日乘子法等等。
此外,其他方法不再说明。

在这里,使用罚函数方法求解数学规划问题。

以下图片文字来源于:
[1]甘敏,彭辉.一种新的自适应惩罚函数算法求解约束优化问题[J].信息与控制,2009,38(01):24-28.
PSO算法求解(下)-罚函数方法_第1张图片
PSO算法求解(下)-罚函数方法_第2张图片
上述是罚函数的相关内容,在这里,也是用该文献的方法和数值案例进行求解:
PSO算法求解(下)-罚函数方法_第3张图片
与基本粒子群的主要差别是适应函数的不同:

//适应度函数
double Fitness(double x_pos[person_number][dimension], int pers) {//输入粒子位置矩阵、粒子编号
	double fit = 0.00;
	double pen_fun = 0.00;
	for (int j = 0; j < 4;j++) {
		fit += 5 * (x_pos[pers][j] - pow(x_pos[pers][j], 2));
	}
	for (int j = 4; j < dimension;j++) {
		fit -= x_pos[pers][j];
	}
	
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, 2 * x_pos[pers][0] + 2 * x_pos[pers][1] + x_pos[pers][9] + x_pos[pers][10] - 10);//约束1
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, 2 * x_pos[pers][0] + 2 * x_pos[pers][2] + x_pos[pers][9] + x_pos[pers][11] - 10);//约束2
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, 2 * x_pos[pers][1] + 2 * x_pos[pers][2] + x_pos[pers][10] + x_pos[pers][11] - 10);//约束3
	
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, -8 * x_pos[pers][0] + x_pos[pers][9]);//约束4
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, -8 * x_pos[pers][1] + x_pos[pers][10]);//约束5
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, -8 * x_pos[pers][2] + x_pos[pers][11]);//约束6
	
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, -2 * x_pos[pers][3] - x_pos[pers][4] + x_pos[pers][9]);//约束7
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, -2 * x_pos[pers][5] - x_pos[pers][6] + x_pos[pers][10]);//约束8
	pen_fun += pow(10, alpha*(1-rho))*max(0.0, -2 * x_pos[pers][7] - x_pos[pers][8] + x_pos[pers][11]);//约束9
	
	fit += pen_fun;
	return fit;
}

100个粒子,4000次迭代结果为-14.9,虽然与案例结果不同,但是只需要增加迭代次数,应该能够趋近于-15。
当然,也需要对基本粒子群进行改进,才能更快,更准确的得到答案。

那么,通过这样的罚函数方法,将约束问题转化为无约束问题,这样子就与基本粒子群方法一样了。
也可以使用这种方法求解其他数学规划问题。
备注:罚函数的参数以及罚函数形式影响着求解结果的灵敏度,合适的罚函数选择也是一项重要的工作。

你可能感兴趣的:(智能算法学习)