1.内点法概述

内点法是求解线性规划的一个方法,是求解不等式约束最优化问题的一种十分有效的方法,但不能处理等式约束。内点法在大规模线性优化,二次优化,非线性规划方面都有比较好的表现,内点法是多项式算法,随着问题规模的增大,计算的复杂度却不会急剧增大。

本文主要介绍使用障碍函数思想的内点法,该思想的内点法的主要思想是在可行域的边界筑起一道很高的"围墙",当迭代点靠近边界时,目标函数陡然增大,以示惩罚,阻止迭代点穿越边界,这样就可以将最优解挡在可行域的范围之内了。此类内点法的求解思路同拉格朗日松弛法类似,将约束问题转化为无约束问题,通过无约束函数的梯度下降进行迭代直至得到最优解。

2.内点法过程

内点法第一步便是将约束问题转换为非约束问题,对于一个最小化线性规划问题,如下图所示

借鉴拉格朗么松弛法的思路,这个线性规划问题可以表示成如下函数 。

其中m是约束方程的个数,I是指示函数,一般定义如下:

通过指示函数可以将约束方程直接写到目标函数中,然后对目标函数求极小值。但是这个指示函数I(u)是不可导的,通常用如下的函数替代:

由于指数函数I_(u)是凸函数,所以新的目标函数也是凸函数,因此可以用凸优化中的方法来求解该函数的最小值,下文将使用经典的牛顿法讲解如何求函数最小化问题

目标函数f(x)在x0做二阶泰勒公式展开得到

针对上述等式继续进行运算, 上面等式两边同时对(x-x0)求导,并令导数为0,得到如下结果

继续对上述等式进行变换,可以得到

这样就得到了下一点的位置,,从x0走到x1。重复这个过程,直到到达导数为0的点,由此可以得到达牛顿法的迭代公式如下

其中H^-1表示二阶导数矩阵(海塞矩阵)的逆,所以如果使用牛顿法求解目标函数的最优值,需要知道目标函数的一阶导数和二阶导数。

以单纯形法的例子进行演示如下:

在问题中目标函数一阶导数和二阶导数分别如下:

3.内点法代码

可以使用python符号计算库sympy计算目标函数的一阶导数和二阶导数,计算出相应的表达式,其结果如代码中所示。

"""
内点法
python库sympy中集成了许多用于计算一阶导数和二阶导数的函数
"""
from sympy import diff,symbols,exp,log# 定义变量
x1,x2,t = symbols('x1 x2 t')# 定义目标函数
func = t*(-70*x1-30*x2)-log(-3*x1-9*x2+540)-log(-5*x1-5*x2+450)-log(-9*x1-3*x2+720)-log(x1)-log(x2)# 求导
de_x1 = diff(func,x1,1) # 对x1求一阶导
de_x2 = diff(func,x2,1) # 对x2求一阶导
de_x1_x1 = diff(func,x1,x1) # 对x1和x1求二阶导
de_x1_x2 = diff(func,x1,x2) # 对x1和x2求二阶导
de_x2_x1 = diff(func,x2,x1) # 对x2和x1求二阶导
de_x2_x2 = diff(func,x2,x2) # 对x2和x2求二阶导"""
得到的结果:
de_x1 =  -70*t + 3/(-3*x1 - 9*x2 + 540) + 5/(-5*x1 - 5*x2 + 450) + 9/(-9*x1 - 3*x2 + 720) - 1/x1
de_x2 =  -30*t + 9/(-3*x1 - 9*x2 + 540) + 5/(-5*x1 - 5*x2 + 450) + 3/(-9*x1 - 3*x2 + 720) - 1/x2
de_x1_x1 =  9/(3*x1 + x2 - 240)**2 + (x1 + 3*x2 - 180)**(-2) + (x1 + x2 - 90)**(-2) + x1**(-2)
de_x1_x2 =  3/(3*x1 + x2 - 240)**2 + 3/(x1 + 3*x2 - 180)**2 + (x1 + x2 - 90)**(-2)
de_x2_x1 =  3/(3*x1 + x2 - 240)**2 + 3/(x1 + 3*x2 - 180)**2 + (x1 + x2 - 90)**(-2)
de_x2_x2 =  (3*x1 + x2 - 240)**(-2) + 9/(x1 + 3*x2 - 180)**2 + (x1 + x2 - 90)**(-2) + x2**(-2)"""

牛顿迭代过程代码

"""
内点法实现代码
"""
import numpy as np# 计算目标函数在x处的一阶导数
def gradient(x1, x2, t):j1 = -70*t + 3/(-3*x1 - 9*x2 + 540) + 5/(-5*x1 - 5*x2 + 450) + 9/(-9*x1 - 3*x2 + 720) - 1/x1j2 = -30*t + 9/(-3*x1 - 9*x2 + 540) + 5/(-5*x1 - 5*x2 + 450) + 3/(-9*x1 - 3*x2 + 720) - 1/x2return np.asmatrix([j1, j2]).T# 求二阶导数矩阵(海塞矩阵)的逆矩阵
def inv_hessian(x1, x2):x1, x2 = float(x1), float(x2)h11 = 9/(3*x1 + x2 - 240)**2 + (x1 + 3*x2 - 180)**(-2) + (x1 + x2 - 90)**(-2) + x1**(-2)h12 = 3/(3*x1 + x2 - 240)**2 + 3/(x1 + 3*x2 - 180)**2 + (x1 + x2 - 90)**(-2)h21 = 3/(3*x1 + x2 - 240)**2 + 3/(x1 + 3*x2 - 180)**2 + (x1 + x2 - 90)**(-2)h22 = (3*x1 + x2 - 240)**(-2) + 9/(x1 + 3*x2 - 180)**2 + (x1 + x2 - 90)**(-2) + x2**(-2)H = np.asmatrix([[h11,h12],[h21,h22]])H_1 = np.linalg.inv(H)return H_1# 明确目标函数
x = np.array([[10], [10]])  # x是牛顿法的初始迭代值
t = 0.00001  # t是值函数中的t# 迭代停止的控制条件
eps = 0.01  # 迭代停止的误差
iter_cnt = 0  # 记录迭代的次数while iter_cnt < 20:iter_cnt += 1J = gradient(x[0,0], x[1,0], t)H_1 = inv_hessian(x[0,0], x[1,0])x_new = x - H_1*J  # 牛顿法公式error = np.linalg.norm(x_new - x) # 求二范数,判断迭代效果print('迭代次数是:%d, x1=%.2f, x2=%.2f, 误差是:%.2f'%(iter_cnt,x_new[0,0],x_new[1,0],error))x = x_newif error < eps:break# 输出最终结果
print("目标函数的值是:%.2f"%float(70*x[0,0]+30*x[1,0]))"""
最终的运行结果:
迭代次数是:1, x1=15.91, x2=15.34, 误差是:7.96
迭代次数是:2, x1=20.13, x2=18.19, 误差是:5.09
迭代次数是:3, x1=21.00, x2=18.33, 误差是:0.88
迭代次数是:4, x1=21.02, x2=18.32, 误差是:0.03
迭代次数是:5, x1=21.02, x2=18.32, 误差是:0.00
目标函数的值是:2021.17
"""

4.总结

内点法和单纯形法的结果(上一篇博客中最终的结果为5700,而内点法只有2021.27)相差较大,这是因为内点法的搜索路径在可行域的内部,而不可能在可行域的边上,这也是内点法的局限性。

python最优化算法实战---线性规划之内点法相关推荐

  1. Python最优化算法学习笔记(Gurobi)

    微信公众号:数学建模与人工智能 github地址:https://github.com/QInzhengk/Math-Model-and-Machine-Learning Python最优化算法学习笔 ...

  2. python 最优化算法库_哈工大硕士生用?Python 实现了 11 种经典数据降维算法,源代码库已开放...

    雷锋网 AI 开发者按:网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA. ...

  3. c4.5算法python实现_算法:用Python实现—最优化算法

    今天给大家分享一下算法,用python来实现最优化算法.废话不多说,直接上代码: 一.二分法 函数详见rres,此代码使该算法运行了两次 def asdf(x): rres=8*x**3-2*x**2 ...

  4. 莫烦python教程_python实现各种最优化算法

    python视频教程栏目介绍各种最优化算法 二分法 函数详见rres,此代码使该算法运行了两次def asdf(x): rres=8*x**3-2*x**2-7*x+3 return rres i=2 ...

  5. 【重磅干货】Python、机器学习、深度学习算法实战和应用必备书籍

    [导读]首先祝大家中秋佳节快乐,乘此良辰美景,今天就给大家发一波福利干货!本文给大家分享机器学习.深度学习算法实战和应用必备的4本"宝藏"书.具体书籍展示如下:(文末提供下载方式! ...

  6. 最优化算法python实现篇(4)——无约束多维极值(梯度下降法)

    最优化算法python实现篇(4)--无约束多维极值(梯度下降法) 摘要 算法简介 注意事项 算法适用性 python实现 实例运行结果 算法过程可视化 摘要 本文介绍了多维无约束极值优化算法中的梯度 ...

  7. 最优化算法python实现篇(3)——无约束一维极值(黄金分割法)

    最优化算法python实现篇(3)--无约束一维极值(黄金分割法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 ...

  8. 最优化算法python实现篇(2)—无约束一维极值(二分法)

    最优化算法python实现篇(2)--无约束一维极值(二分法) 算法适用问题 python实现 示例运行结果 算法适用问题 搜索给定单峰区间的极值问题,一般对凸优化问题比较适用. python实现 # ...

  9. python自然语言处理实战 | NLP中用到的机器学习算法学习笔记

    这是对涂铭等老师撰写的<Python自然语言处理实战:核心技术与算法>中第9章NLP中用到的机器学习算法 的学习笔记. 这里写目录标题 文本分类:中文垃圾邮件分类 文本聚类实战:用K-me ...

最新文章

  1. Nginx负载均衡的详细配置及使用案例
  2. 大咖来信|浪潮刘军:AI计算将成为“新基建”核心支撑之一
  3. php访问获取全部网站状态码,php打开其他网站获取状态码
  4. mongodb 开启身份认证_Yum安装mongodb及开启用户认证远程登录
  5. C#编写Windows服务程序图文教程
  6. Fedora20下安装编译环境
  7. LINQPad学习与验证工具
  8. 一种利用ADO连接池操作MySQL的解决方案(VC++)
  9. ITK:使用均方执行二维平移配准
  10. [python交互]Excel催化剂与python交互原理剖析,py开发者按此规范可自行扩展功能...
  11. 怎样编写测试类测试分支_编写干净的测试-被认为有害的新内容
  12. JAX-RS 2.x与Spring MVC:返回对象列表的XML表示
  13. dedecms ---m站功能基础详解
  14. 如何在矩池云上查看cudnn版本
  15. 腾讯“立知”被指抄袭“即刻” APP,目前已被下线
  16. 在老ASP中使用对象的对象生存期问题
  17. JSP的自定义标签(四)之定义函数
  18. 2022英伟达显卡排名天梯图
  19. 树莓派教程 : 树莓派各版本引脚定义
  20. 给惠普735g5 装Win10+Ubuntu 16.04双系统

热门文章

  1. RDKit|一站式搞定分子读取、输出、可视化
  2. python的科学计算库有哪些_python科学计算:带你初探scipy库的常量模块和函数模块...
  3. libIEC61850学习记录
  4. Scroller源码详解
  5. mysql 什么是幻读_何为幻读?MySQL又是如何解决幻读的?
  6. 计算机bios英文翻译,bios中英文对照表
  7. ffmpeg推流+NGINX(RTMP)+VLC-QT拉流(Win7)
  8. 修改EBS R12界面LOGO
  9. 计算机专业英语试题2,计算机专业英语试题2
  10. Mac 安装 Xcode工具软件