用python解决线性规划问题,

  用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 np

  from 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 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)

  输出结果

  

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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: