前言
本系列涉及线性与非线性规划中的几种规划算法
1.本节介绍可行方向法(Rosen方法)
2.参考:陈宝林-最优化理论与算法
3.采用python编程实现,已测试,代码可行
一、可行方向法
可行方向法是用来解决约束最优化问题的一类算法,其典型策略是从可行点出发,沿着下降的可行方向进行搜索,求出使目标函数值下降的新的可行点,主要步骤包括选择搜索方向和确定沿此方向移动的步长,搜索方向的选择方式不同就形成不同的可行方向法。
比如:Zoutendijkf方法、Rosen梯度投影法、既约梯度法、Frank-wolfe方法等。
本篇是Rosen方法,详细介绍见陈宝林先生的书。
二、代码示例
1.代码
代码如下(示例):
#按照陈宝林《最优化理论与算法》中的Rosen梯度投影法编写代码。采用一维搜索的最优准则求解最优步长
#问题的标准形式minF,st:Ax>=b,Ex=e,A为n列的矩阵,x为n维向量
import numpy as np
from sympy import *
class Feasible_direction:
#A B E e Xi自变量 F目标函数 i自变量个数
def __init__(self,A,b,E,e,Xi,F,i):
self.A = np.array(A)
self.b = np.array(b)
self.E = E
self.e = np.array(e)
self.F = F
self.Xi = np.array(Xi)
self.i = i
# 生成自变量字典
def x_dict(self,X,Xi):
x = {
}
for index,item in enumerate(Xi):
x[item] = X[index]
#self.X_dict = x
return x
#计算目标函数值
def f_value(self,X,Xi):
fX = self.F.subs(self.x_dict(X,Xi))
#self.fX = np.array(self.f.subs(self.X_dict))
return fX
#求目标函数的梯度
def d_function(self):#如何直接求解出矩阵排列的形式
df = []
for i in self.Xi:
df.append(diff(self.F,i))
self.dF = np.array(df)
#print(f'一阶偏导为{self.dF}')
#对于迭代点Xk,来划分等式约束和不等式约束
def condition2A1_A2(self,Xk):
xk = self.x_dict(Xk,self.Xi)
A1 = []
A2 =