網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Python解決非線性規(guī)劃中經(jīng)濟(jì)調(diào)度問(wèn)題_python
作者:電力系統(tǒng)與算法之美 ? 更新時(shí)間: 2022-06-29 編程語(yǔ)言1、概述
今天重點(diǎn)講非線性規(guī)劃中scipy.optimize.minize庫(kù)在非線性規(guī)劃中的應(yīng)用。Scipy 是 Python 算法庫(kù)和數(shù)學(xué)工具包,包括最優(yōu)化、線性代數(shù)、積分、插值、特殊函數(shù)、傅里葉變換、信號(hào)和圖像處理、常微分方程求解等模塊。?
scipy.optimize 模塊中提供了多個(gè)用于非線性規(guī)劃問(wèn)題的方法,適用于不同類(lèi)型的問(wèn)題。
brent():?jiǎn)巫兞繜o(wú)約束優(yōu)化問(wèn)題,混合使用牛頓法/二分法。
fmin():多變量無(wú)約束優(yōu)化問(wèn)題,使用單純性法,只需要利用函數(shù)值,不需要函數(shù)的導(dǎo)數(shù)或二階導(dǎo)數(shù)。
leatsq():非線性最小二乘問(wèn)題,用于求解非線性最小二乘擬合問(wèn)題。
minimize():約束優(yōu)化問(wèn)題,使用拉格朗日乘子法將約束優(yōu)化轉(zhuǎn)化為無(wú)約束優(yōu)化問(wèn)題。
2、scipy.optimize.minimize參數(shù)
scipy.optimize.minimize(fun, x0, args=(), method=None, jac=None, hess=None, hessp=None, bounds=None, constraints=(), tol=None, callback=None, options=None)
解釋?zhuān)?/p>
- fun: 求最小值的目標(biāo)函數(shù)
- x0:變量的初始猜測(cè)值,如果有多個(gè)變量,需要給每個(gè)變量一個(gè)初始猜測(cè)值。minimize是局部最優(yōu)的解法,所以
- args:常數(shù)值,后面demo會(huì)講解,fun中沒(méi)有數(shù)字,都以變量的形式表示,對(duì)于常數(shù)項(xiàng),需要在這里給值
- method:求極值的方法,官方文檔給了很多種。一般使用默認(rèn)。每種方法我理解是計(jì)算誤差,反向傳播的方式不同而已,這塊有很大理論研究空間
- constraints:約束條件,針對(duì)fun中為參數(shù)的部分進(jìn)行約束限制
3、簡(jiǎn)單案例引出
(1)Scipy.optimize實(shí)現(xiàn)
import numpy as np
from scipy.optimize import minimize
#目標(biāo)函數(shù)
def fun(args1):
a,b,c,d=args1
r=lambda x:(a*x[0]*x[0]+b*x[1]*x[1]+c*x[2]*x[2]+d)
return r
def con(args2):
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()
輸出結(jié)果
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)遺傳算法包實(shí)現(xiàn)?(—sko.GA&sko.DE)
#from sko.DE import DE #差分進(jìn)化法
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)
輸出結(jié)果
best_x: [1. 1. 1.]?
?best_y: [14.]
?
Process finished with exit code 0
4、電力系統(tǒng)中應(yīng)用——經(jīng)濟(jì)調(diào)度
(1)案例
(2)Scipy.optimize實(shí)現(xiàn)?
import numpy as np
from scipy.optimize import minimize
#目標(biāo)函數(shù)(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-代價(jià):',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()
輸出結(jié)果
FGi-代價(jià): 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)粒子群包實(shí)現(xiàn)(pyswarm)
pyswarm是一個(gè)支持帶約束的粒子群優(yōu)化包,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)
輸出結(jié)果
Stopping search: Swarm best objective change less than 1e-08
[179.34039956 250. ? ? ? ? 270.65960045]
305.97956393103044
?
Process finished with exit code 0
原文鏈接:https://blog.csdn.net/weixin_46039719/article/details/121880540
相關(guān)推薦
- 2022-10-10 React?組件的常用生命周期函數(shù)匯總_Redis
- 2022-05-04 python中使用多線程改進(jìn)flask案例_python
- 2022-02-23 fatal error: mpi.h: No such file or directory // f
- 2022-11-14 Asp.net?Core項(xiàng)目配置HTTPS支持_實(shí)用技巧
- 2022-04-07 C#實(shí)現(xiàn)單例模式的多種方式_C#教程
- 2022-09-29 python繪制柱狀圖的方法_python
- 2022-11-11 Python實(shí)現(xiàn)讀取文件夾按數(shù)字排序功能_python
- 2023-02-10 Docker不同網(wǎng)段下的容器互聯(lián)的實(shí)現(xiàn)_docker
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支