线性与非线性规划:可行方向法


前言

本系列涉及线性与非线性规划中的几种规划算法

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 = 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值