用python解决线性规划问题,
Scipy是Python算法库和数学工具包,包括优化、线性代数、积分、插值、特殊函数、傅立叶变换等模块。Scipy.optimize模块提供了几种非线性规划问题的方法,适用于不同类型的问题。本文将用它来解决经济调度问题,有兴趣的可以看看。
00-1010 1、概述2、scipy.optimize.minimize参数3、简单案例推导(1)Scipy.optimize实现(2)遗传算法包实现(—sko。GAsko.DE)4、3354经济调度在电力系统中的应用(1)案例(2)科学优化实施(2)
目录
今天重点介绍scipy.optimize.minize库在非线性规划中的应用。Scipy是Python算法库和数学工具包,包括最优化、线性代数、积分、插值、特殊函数、傅立叶变换、信号与图像处理、常微分方程求解等模块。
Scipy.optimize模块提供了几种非线性规划问题的方法,适用于不同类型的问题。
Brent():单变量无约束优化问题,混合牛顿法/二分法。
Fmin():多变量无约束最优化问题。使用simple方法,只需要函数值,不需要函数的导数或二阶导数。
Leatsq():非线性最小二乘问题,用于解决非线性最小二乘拟合问题。
Minimize():约束优化问题,用拉格朗日乘子法转化为无约束优化问题。
1、概述
scipy.optimize.minimize(fun,x0,args=(),method=None,jac=None,hessp=None,hessp=None,bounds=None,constraints=(),tol=None,callback=None,options=None)
解释:
Fun:求目标函数x0:变量的初始猜测值的最小值。如果有多个变量,需要给每个变量一个初始猜测值。Minimize是局部最优解,所以args:是一个常数值,后面的demo会解释。fun里没有数字,都是用变量的形式表示。对于常数项,这里需要给value method:一个求其极值的方法。有很多官方文件。使用常规默认值。我理解每种方法都是计算误差,只是反向传播的方式不同。这一块有很多理论研究空间constraints:用来限制fun中的参数。
2、scipy.optimize.minimize参数
3、简单案例引出
将numpy作为np导入
来自scipy.optimize导入最小化
#目标函数
def fun(args1):
a,b,c,d=args1
r=x :(a * x[0]* x[0]b * x[1]* x[1]c * x[2]* x[2]d)
返回r
定义控制(参数2):
x0min,x1min,x2min=args2
cons=({type:eq , fun : lambda x :-x[0]-x[1]* * 2 2 },
{type:eq , fun : lambda x : x[1]2 * x[2]* * 2-3 },
{type:ineq , fun : lambda x : x[0]* * 2-x[1]x[2]* * 2 },
{type: ineq , fun : lambda x :-(x[0]x[1]* * 2 x[2]* * 2-20)},
{type:ineq , fun : lambda x : x[0]-x0min },
{type:ineq , fun : lambda x : x[1]-x1min },
{type:ineq,fun:lambda x:x[2]+x2min})
return cons
def main():
args1=(1,2,3,8)
args2=(0,0,0)
cons=con(args2)
x0=np.array((1,2,3)) #初值
res=minimize(fun(args1),x0,method=SLSQP,constraints=cons)
print(minf(x):,res.fun)
print(res.success)
print(x:,[np.around(i) for i in res.x])
print(x1:,res.x[0])
print(x2:,res.x[1])
print(x3:,res.x[2])
#另一种表述
print("optimization problem(res):{}".format(res.x))
print("Xopt={}".format(res.x))
print("minf(x)={:.4f}".format(res.fun))
if __name__ == "__main__":
main()
输出结果
minf(x): 13.878994794551044
True
x: [1.0, 1.0, 1.0]
x1: 0.6743061260520056
x2: 1.1513878035150682
x3: 0.961408393062538
optimization problem(res):[0.67430613 1.1513878 0.96140839]
Xopt=[0.67430613 1.1513878 0.96140839]
minf(x)=13.8790
Process finished with exit code 0
(2)遗传算法包实现(—sko.GA&sko.DE)
#from sko.DE import DE #差分进化法from sko.GA import GA #遗传算法
def obj_func(p):
x1, x2, x3 = p
return x1 ** 2 + 2*x2 ** 2 + 3*x3 ** 2+8
constraint_eq = [
lambda x: -x[0]-x[1]**2+2,
lambda x: x[1]+2*x[2]**2-3
]
constraint_ueq = [
lambda x: -x[0]**2+x[1]-x[2]**2,
lambda x: x[0]+x[1]**2+x[2]**2-20
]
#de = DE(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0],constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)
ga = GA(func=obj_func, n_dim=3, size_pop=50, max_iter=800, lb=[0, 0, 0],
constraint_eq=constraint_eq, constraint_ueq=constraint_ueq)
#best_x, best_y = de.run()
best_x, best_y = ga.run()
print(best_x:, best_x, \n, best_y:, best_y)
输出结果
best_x: [1. 1. 1.]
best_y: [14.]
Process finished with exit code 0
4、电力系统中应用——经济调度
(1)案例
(2)Scipy.optimize实现
import numpy as npfrom scipy.optimize import minimize
#目标函数(FG1+FG2+FG3)
def fun(args1):
a0,a1,a2,b0,b1,b2,c0,c1,c2=args1
v=lambda x:(a0+a1*x[0]+a2*x[0]*x[0]
+b0+b1*x[1]+b2*x[1]*x[1]
+c0+c1*x[2]+c2*x[2]*x[2])
return v
def con(args2):
D,x0min,x0max,x1min,x1max,x2min,x2max=args2
cons=({type:eq,fun:lambda x:D-x[0]-x[1]-x[2]},
{type:ineq,fun:lambda x:x[0]-x0min},
{type:ineq,fun:lambda x:-x[0]+x0max},
{type:ineq,fun:lambda x:x[1]-x1min},
{type:ineq,fun:lambda x:-x[1]+x1max},
{type:ineq,fun:lambda x:x[2]-x2min},
{type:ineq,fun:lambda x:-x[2]+x2max})
return cons
def main():
args1=(4,0.3,0.0007,3,0.32,0.0004,3.5,0.3,0.00045)
args2=(700,100,200,120,250,150,300)
cons=con(args2)
x0=np.array((150,250,200)) #初值
res=minimize(fun(args1),x0,method=SLSQP,constraints=cons)
print(FGi-代价:,res.fun)
print(res.success)
print(PGi—解:,[np.around(i) for i in res.x])
print(PG1:,res.x[0])
print(PG2:,res.x[1])
print(PG3:,res.x[2])
if __name__ == "__main__":
main()
输出结果
FGi-代价: 305.9673913046252
True
PGi—解: [176.0, 250.0, 274.0]
PG1: 176.0874477123534
PG2: 250.0
PG3: 273.9125522876465
Process finished with exit code 0
(3)粒子群包实现(pyswarm)
pyswarm是一个支持带约束的粒子群优化包,sko.PSO中的pso仅支持带上下限的约束,不支持等式和不等式约束,所以不太喜欢。
from pyswarm import psodef 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)
输出结果
Stopping search: Swarm best objective change less than 1e-08
[179.34039956 250. 270.65960045]
305.97956393103044
Process finished with exit code 0
以上就是Python解决非线性规划中经济调度问题的详细内容,更多关于Python 非线性规划的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。