【学习笔记】powell法的python实现
學習最優化理論算法時用到了《優化設計》和《最優理論與方法》兩本書。
根據的《優化設計》第55頁的流程圖,實現了流程圖前半部分的代碼設計(尚未添加Powell判斷條件),給自己也給正在學習的朋友們留下學習筆記。
代碼如下:
import numpy as np
from sympy import symbols,solve,diff
import time
e = 0.01 ?#精度
n = int(input('請輸入n的值:'))
count = 0 # 迭代次數計數器
maxtimes = int(input('請輸入最大迭代次數:')) ?# 最大迭代次數
time_s = time.time()
# 定義初始點
X0 = []
for i in range(1,n+3):
? ? if i % 3 == 0:
? ? ? ? X0.append(0.5)
? ? elif i % 3 == 1:
? ? ? ? X0.append(0.5)
? ? elif i % 3 == 2:
? ? ? ? X0.append(1)
# 初始方向
d = np.identity(n+2,dtype = int)
# 定義目標函數
def objfun(n,x):
? ? f = 0
? ? for i in range(1,n+1):
? ? ? ? item = (-x[i-1] + x[i] + x[i+1])**2 + (x[i-1] - x[i] + x[i+1])**2 + (x[i-1] + x[i] - x[i+1])**2
? ? ? ? f += item ? ?
? ? return f
# 定義步長符號
alpha = symbols('alpha')
# 循環開始
while count < maxtimes:
? ? count = count + 1
? ? x = [X0]
? ? F = [objfun(n,X0)]
? ? delta_list = []
? ? # 定義迭代公式
? ? def X(i,alpha):
? ? ? ? if i <= 1:
? ? ? ? ? ? return list(np.array(X0)+alpha*d[:,i-1])
? ? ? ? else:
? ? ? ? ? ? return list(np.array(x[i-1]) + alpha*d[:,i-1])
? ? # 求X1,X2,...,X(n+2)
? ? for i in range(1,n+3):
? ? ? ? res = objfun(n,X(i,alpha))
? ? ? ? b = solve(diff(res,alpha)) ?# 寫入需要解的方程體
? ? ? ? a1 = complex(b[0]).real ?# 取出復數的實部
? ? ? ? a1 = round(a1,4)
? ? ? ? x.append(X(i,a1))
? ? ? ? F.append(objfun(n,x[i]))
? ? ? ? delta = abs(F[i]-F[i-1])
? ? ? ? # 取沿搜索方向增量的最大者
? ? ? ? delta_list.append(delta)
? ? ? ? d_delta = max(delta_list)
? ? ? ? m = delta_list.index(d_delta)
? ? if abs((F[n+2]-F[n-1])/F[n+2]) <= e:
? ? ? ? X_bestpoint = x[n+2]
? ? ? ? F_bestpoint = F[n+2]
? ? ? ? print('-------經過{}次迭代后,求得最優-------'.format(count))
? ? ? ? print('迭代時間為:{}秒'.format(time.time()-time_s))
? ? ? ? print('最優解為:',X_bestpoint)
? ? ? ? print('最優函數值為:',F_bestpoint)
? ? ? ? break
? ? else:
? ? ? ? d_n = np.array(x[n+2])-np.array(x[0])
? ? ? ? d = np.delete(d,m,1)
? ? ? ? d = np.column_stack((d,d_n))
? ? ? ? X0 = x[-1]
總結
以上是生活随笔為你收集整理的【学习笔记】powell法的python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: htc816t Android go,移
- 下一篇: 能源行业的作业成本法管理