Python解決非線性規(guī)劃中經(jīng)濟(jì)調(diào)度問題
1、概述
今天重點(diǎn)講非線性規(guī)劃中scipy.optimize.minize庫在非線性規(guī)劃中的應(yīng)用。Scipy 是 Python 算法庫和數(shù)學(xué)工具包,包括最優(yōu)化、線性代數(shù)、積分、插值、特殊函數(shù)、傅里葉變換、信號和圖像處理、常微分方程求解等模塊。
scipy.optimize 模塊中提供了多個用于非線性規(guī)劃問題的方法,適用于不同類型的問題。
brent():單變量無約束優(yōu)化問題,混合使用牛頓法/二分法。
fmin():多變量無約束優(yōu)化問題,使用單純性法,只需要利用函數(shù)值,不需要函數(shù)的導(dǎo)數(shù)或二階導(dǎo)數(shù)。
leatsq():非線性最小二乘問題,用于求解非線性最小二乘擬合問題。
minimize():約束優(yōu)化問題,使用拉格朗日乘子法將約束優(yōu)化轉(zhuǎn)化為無約束優(yōu)化問題。
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)
解釋:
- fun: 求最小值的目標(biāo)函數(shù)
- x0:變量的初始猜測值,如果有多個變量,需要給每個變量一個初始猜測值。minimize是局部最優(yōu)的解法,所以
- args:常數(shù)值,后面demo會講解,fun中沒有數(shù)字,都以變量的形式表示,對于常數(shù)項(xiàng),需要在這里給值
- method:求極值的方法,官方文檔給了很多種。一般使用默認(rèn)。每種方法我理解是計(jì)算誤差,反向傳播的方式不同而已,這塊有很大理論研究空間
- constraints:約束條件,針對fun中為參數(shù)的部分進(jìn)行約束限制
3、簡單案例引出
(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-代價:',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-代價: 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是一個支持帶約束的粒子群優(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
以上就是Python解決非線性規(guī)劃中經(jīng)濟(jì)調(diào)度問題的詳細(xì)內(nèi)容,更多關(guān)于Python 非線性規(guī)劃的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)微信好友的數(shù)據(jù)分析
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)微信好友的數(shù)據(jù)分析,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-12-12Python中輸入和輸出(打?。?shù)據(jù)實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于Python中輸入和輸出(打?。?shù)據(jù)實(shí)例方法以及相關(guān)知識點(diǎn),有需要的朋友們參考下。2019-10-10Python Opencv任意形狀目標(biāo)檢測并繪制框圖
這篇文章主要為大家詳細(xì)介紹了Python Opencv任意形狀目標(biāo)檢測,并繪制框圖,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-07-07python人工智能tensorflow構(gòu)建卷積神經(jīng)網(wǎng)絡(luò)CNN
學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)已經(jīng)有一段時間,從普通的BP神經(jīng)網(wǎng)絡(luò)到LSTM長短期記憶網(wǎng)絡(luò)都有一定的了解,但是從未系統(tǒng)的把整個神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)記錄下來,我相信這些小記錄可以幫助我更加深刻的理解神經(jīng)網(wǎng)絡(luò)2022-05-05Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作示例
這篇文章主要介紹了Python使用sqlalchemy模塊連接數(shù)據(jù)庫操作,結(jié)合實(shí)例形式分析了sqlalchemy模塊的安裝及連接、調(diào)用數(shù)據(jù)庫相關(guān)操作技巧,需要的朋友可以參考下2019-03-03Python如何讀取MySQL數(shù)據(jù)庫表數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了Python如何讀取MySQL數(shù)據(jù)庫表數(shù)據(jù),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-03-03