方法1 非线性规划 scipy.optimize.minimize
非线性规划原理就不讲解啦
针对算例1
求取一个函数的最小值。函数的参数可以是多个,但函数值只能是标量。
参数
返回值
res:优化结果。
优化结果是OptimizeResult对象,重要属性如下:
fun 是最优值
x 是最优解
success 表示求解器是否成功退出。
message 描述了求解器退出的原因
from scipy.optimize import minimize
import numpy as np
#目标函数即min(FG1+FG2+FG3)
def fun(x):
return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])
def con():
# 约束条件 分为eq 和ineq
#eq表示 函数结果等于0 ; ineq 表示 表达式大于等于0
cons = ({
'type': 'eq', 'fun': lambda x: x[0]+x[1]+x[2]-700})
#{'type': 'ineq', 'fun': lambda x: -x[2] + x2max}#如果有不等式约束
#cons= ([con1, con2, con3, con4, con5, con6, con7, con8]) #如果有多个约束,则最后返回结果是这个
return cons
#上下限约束
b1=(100,200)#
b2=(120,250)#
b3=(150,300)#
bnds = (b1,b2,b3)#边界约束
if __name__ == "__main__":
cons=con()#约束
# 设置x初始猜测值
x0 = np.array((150, 250, 20))
res = minimize(fun, x0, method='SLSQP', constraints=cons,bounds=bnds)
print('代价',res.fun)
print(res.success)
print('解',res.x)
方法2 粒子群pyswarm.pso
粒子群PSO优化算法学习笔记 及其python实现(附讲解如何使用python语言sko.PSO工具包)
pyswarm是一个支持带约束的粒子群优化包
sko.PSO中的pso仅支持带上下限的约束,不支持等式和不等式约束。
参数详解
pso(func, lb, ub, ieqcons=[], f_ieqcons=None, args=(), kwargs={},
swarmsize=100, omega=0.5, phip=0.5, phig=0.5, maxiter=100,
minstep=1e-8, minfunc=1e-8, debug=False)
返回值
from pyswarm import pso
def object_func(x):
return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])
#不等式约束
def cons1(x):
return [x[0]+x[1]+x[2]-700]
lb = [100, 120, 150]#
ub = [200, 250, 300]
xopt, fopt = pso(object_func,lb,ub,ieqcons=[cons1], maxiter=100,swarmsize=1000)
print(xopt)
print(fopt)
例子2
from pyswarm import pso
def object_func(x):
x1 = x[0]
x2 = x[1]
return x1**4 - 2*x2*x1**2 + x2**2 + x1**2 - 2*x1 + 5 # 求解最小值
def cons(x):
x1 = x[0]
x2 = x[1]
con1 = -(x1 + 0.25)**2 + 0.75*x2 # con1>=0
con2 = -x1+0.2 # con2>=0
return [-(x1 + 0.25)**2 + 0.75*x2,-x1+0.2]
lb = [-3, -1] # -3
ub = [2, 6]
xopt, fopt = pso(object_func, lb, ub, f_ieqcons=cons)
print(xopt)
print(fopt)
方法3 遗传算法
遗传算法原理及其python实现
使用工具from sko.GA import GA
参数详解
func, n_dim,size_pop=50, max_iter=200,prob_mut=0.001,
lb=-1, ub=1,constraint_eq=tuple(), constraint_ueq=tuple(),precision=1e-7
func : function .The func you want to do optimal
n_dim : int . number of variables of func
lb : array_like The lower bound of every variables of func
ub : array_like The upper bound of every vaiiables of func
constraint_eq : list .equal constraint
constraint_ueq : list . unequal constraint
precision : array_like. The precision of every vaiiables of func
size_pop : int .Size of population
max_iter : int. Max of iter
prob_mut : float .between 0 and Probability of mutation
Attributes
----------------------
Lind : array_like
The num of genes of every variable of func(segments)
generation_best_X : array_like. Size is max_iter.
Best X of every generation
generation_best_ranking : array_like. Size if max_iter.
Best ranking of every generation
def object_func(x):
return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])
#等式约束
def cons1(x):
return [x[0]+x[1]+x[2]-700]
cons=cons1
#导入包
from sko.GA import GA
ga = GA(func=object_func, n_dim=3, size_pop=200, max_iter=800, lb=[100, 120, 150], ub=[200, 250, 300],constraint_eq=[cons])
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
方法4 差分进化算法
'''
min f(x1, x2, x3) = x1^2 + x2^2 + x3^2
s.t.
x1*x2 >= 1
x1*x2 <= 5
x2 + x3 = 1
0 <= x1, x2, x3 <= 5
'''
def obj_func(p):
x1, x2, x3 = p
return x1 ** 2 + x2 ** 2 + x3 ** 2
constraint_eq = [
lambda x: 1 - x[1] - x[2]
]
constraint_ueq = [
lambda x: 1 - x[0] * x[1],
lambda x: x[0] * x[1] - 5
]
from sko.DE import DE
de = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0], ub=[5, 5, 5],
constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)
best_x, best_y = de.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
方法1:遗传算法做整数规划**
在多维优化时,想让哪个变量限制为整数,就设定 precision 为 1即可。
例如,我想让我的自定义函数object_func 的第一个变量限制为整数,那么就设定 precision 的第一个数为1,例子如下
def object_func(x):
return (4+0.3*x[0]+0.0007*x[0]*x[0]+3+0.32*x[1]+0.0004*x[1]*x[1]+3.5+0.3*x[2]+0.00045*x[2]*x[2])
#等式约束
def cons1(x):
return [x[0]+x[1]+x[2]-700]
cons=cons1
#导入包
from sko.GA import GA
ga = GA(func=object_func, n_dim=3, size_pop=200, max_iter=800, lb=[100, 120, 150], ub=[200, 250, 300],constraint_eq=[cons], precision=[1, 1e-7, 1e-7])
best_x, best_y = ga.run()
print('best_x:', best_x, '\n', 'best_y:', best_y)
作者:电气-余登武。写作不容易,请点个赞再走。