运筹系列31:内点法python代码

本文深入探讨了内点法解决线性规划问题的多种方法,包括Logarithmic Barrier法、Affine Scaling法、Projective法等,详细介绍了每种方法的原理、算法步骤及代码实现。

1. 简介

用内点法求解线性规划问题理论上的计算复杂度为 O ( n 3.5 L 2 ) O(n^{3.5}L^2) O(n3.5L2),其中n是变量的维数,L是输入长度。而单纯形法本质上还是个搜索问题,其计算复杂度是 O ( 2 n ) O(2^n) O(2n)
内点法总结起来有两大类,如下:
(1)使用拉格朗日法将不等式去除,然后使用KKT条件将原问题转为方程组,然后用牛顿法求解。
(2)类似信赖域方法,每次在一定范围(比如使用尺度变换生成一个球)内移动到最优位置,迭代进行。
基本概念可以参见:https://blog.csdn.net/WASEFADG/article/details/90376051
在这里插入图片描述
本文依次介绍Logarithmic barrier method,Affine scaling method,Projective method。

2. 经典的Barrier法

详细的介绍可以参考 https://zhuanlan.zhihu.com/p/32685234,对应的代码https://github.com/PrimerLi/linear-programming/tree/master/src
下面两张图是原理:
在这里插入图片描述
在这里插入图片描述
为了能够找到一个初始可行解,添加一个barrier函数:
在这里插入图片描述
一般选用Logarithmic barrier method,如下。其中 ϕ ( x ) = − Σ i ln ⁡ ( x i ) \phi(x)=-\Sigma_i \ln(x_i) ϕ(x)=Σiln(xi)称为barrier函数。至于为什么用这个函数做barrier,可以参考这里
在这里插入图片描述
使用KKT条件进行转化,将最优化问题转换为求解方程。
在这里插入图片描述
使用牛顿法求解,不同 μ \mu μ下的最优解构成的集合称为central path。
这里我们假设问题为线性:
min ⁡ c T x \min c^Tx mincTx,s.t. A x ≤ b Ax\le b Axb
barrier函数设置为 I t ( x ) = − l o g ( − u ) / t I_t(x)=-log(-u)/t It(x)=log(u)/t,目标函数为 t c x − Σ log ⁡ ( − A x + b ) tcx-\Sigma\log(-Ax+b) tcxΣlog(Ax+b),并且有:
在这里插入图片描述
在这里插入图片描述
内点法是选取一个比较小的初始参数 t 0 t_0 t0,求出这个参数对应的解 x t 0 x_{t_0} xt0,逐步迭代从小 t 0 t_0 t0 到大 t t t可以得到一系列的解,最后得到的解 x t x_t xt称作是淬火解。这个解应该可以满足我们的精度需求。

def newton(t, A, b, c, x0):
    maxIterationNumber = 50
    eps = 1.0e-8
    for count in range(maxIterationNumber):
        slack = 1.0/(A.dot(x0) - b)
        gradient = t*c - A.transpose().dot(slack) # 梯度
        H = A.transpose().dot(np.diag(np.square(slack))).dot(A) 
        delta = np.linalg.inv(H).dot(gradient)
        x0 = x0 - delta
        error = np.linalg.norm(delta)
        if (-error < eps):
            break
    return x0,error

def solver(t0, A, b, c, x0, factor):
    upperBound = 1000*t0
    t = [t0]
    solutions = [x0]
    eps = 1.0e-10
    while(t0 < upperBound):
        x0,error = newton(t0, A, b, c, x0)
        solutions.append(x0)
        print (x0)
        t0 = factor*t0
        t.append(t0)
        if (error < eps):
            break
    return x0

下面是个例子:
min ⁡ x + y \min x+y minx+y
s.t.
0.81 x + 0.4 y ≥ 1 0.81x+0.4y\ge1 0.81x

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值