坐标轮换法(算法分析+python代码解释)

目录

基本原理:

算法步骤:

例题分析:

算法代码:

分析:


基本原理:

min f(x),x\in R^{n},f:R^{n}\rightarrow R

给定 x_{0}\in R^{n} ,先从点 x_{0} 出发沿第一个坐标轴方向 e_{1}=(1,0,...,0)^{T} 作一维搜索。求出 \lambda _{0} 和 x_{1} 使得:

f(x_{0}+\lambda _{0}e_{1})=\min_{\lambda }f(x_{1}+\lambda e_{1})x_{1}=x_{0}+\lambda _{0}e_{1}

再从 x_{1} 出发,沿第二个坐标轴方向 e_{2}=(0,1,...,0)^{T} 作一维搜索。求出 \lambda _{1} 和 x_{2} 使得:

f(x_{1}+\lambda _{1}e_{2})=\min_{\lambda }f(x_{1}+\lambda e_{2})x_{2}=x_{1}+\lambda _{1}e_{2}

重复上述步骤,最后从点 x_{n-1} 出发,沿着第 n 个坐标轴方向 e_{n}=(0,0,...,1)^{T} 作一维搜索,求出 \lambda _{n-1} 和 x_{n} 使得:

f(x_{n-1}+\lambda _{n-1}e_{n})=\min_{\lambda }f(x_{n-1}+\lambda e_{n})x_{n}=x_{n-1}+\lambda _{n-1}e_{n}

显然,f(x_{j})\leq f(x_{j-1}),j=1,2,...,n

设给定允许误差 ε>0,如果 \left | \left | x_{n}-x_{0} \right | \right |< \varepsilon,停止,x_{0} 为近似最优解;否则,重复上述步骤。

(注:在实际问题中,可以按照各因素(变量)对实验结果影响大小,依次自前往后排列坐标轴方向。)


算法步骤:

步骤1:选取初始点 x_{0} ,给定允许误差 ε>0,k=1;

步骤2:从点 x_{k-1} 出发,沿着第 k 个坐标轴方向作一维搜索,求出 \lambda _{k-1} 和 x_{k} 使得:

f(x_{k-1}+\lambda _{k-1}e_{k})=\min_{\lambda }f(x_{k-1}+\lambda e_{k})x_{k}=x_{k-1}+\lambda _{k-1}e_{k}

步骤3:如果 k=n,转步骤4;否则,令 k=k+1,返回步骤2

步骤4:如果 \left | \left | x_{n}-x_{0} \right | \right |< \varepsilon,停止,x_{0} 为近似最优解;否则,令 x_{0}=x_{n},k=1,返回步骤2。


例题分析:

下面我们来用一个简单的例题来解释计算流程:

例题:用坐标轮换法求解 minf(x)=x_{1}^{2}+x_{2}^2-3x_{1}-x_{1}x_{2} ,其中 x_{0}=(0,0)^{T},\varepsilon =0.1

解:从 x_{0} 出发,沿 e_{1}=(1,0)^{T} 作一维搜索,x_{0}+\lambda _{0}e_{1}=(\lambda ,0)^{T}

\phi (\lambda )=\lambda ^{2}-3\lambda

\phi '(\lambda )=0\Rightarrow \lambda _{0}=\frac{3}{2},x_{1}=x_{0}+\lambda _{0}e_{1}=(\frac{3}{2} ,0)^{T}

从 x_{1} 出发,沿 e_{2}=(0,1)^{T} 作一维搜索,x_{1}+\lambda _{1}e_{2}=(\frac{3}{2},\lambda )^{T}

\phi (\lambda )=\lambda ^{2}-\frac{3}{2}\lambda-\frac{9}{4}

\phi '(\lambda )=0\Rightarrow \lambda _{1}=\frac{3}{4},x_{2}=x_{1}+\lambda _{1}e_{2}=(\frac{3}{2} ,\frac{3}{4})^{T}

\because \left | \left | x_{2}-x_{0} \right | \right |> \varepsilon,令 x_{2}=x_{0} ,继续搜索;

从 x_{0} 出发,沿 e_{1}=(1,0)^{T} 作一维搜索,x_{0}+\lambda _{0}e_{1}=(\frac{3}{2}+\lambda ,\frac{3}{4})^{T}

\phi (\lambda )=(\frac{3}{2}+\lambda )^{2}+(\frac{3}{4})^{2}-3(\frac{3}{2}+\lambda )-(\frac{3}{2}+\lambda )\frac{3}{4}

\phi '(\lambda )=0\Rightarrow \lambda _{0}=\frac{3}{8},x_{1}=x_{0}+\lambda _{0}e_{1}=(\frac{15}{8} ,\frac{3}{4})^{T}

从 x_{1} 出发,沿 e_{2}=(0,1)^{T} 作一维搜索,x_{1}+\lambda _{1}e_{2}=(\frac{15}{8},\frac{3}{4}+\lambda )^{T}

\phi (\lambda )=(\frac{15}{8}+\lambda )^{2}+(\frac{3}{4}+\lambda )^{2}-3(\frac{15}{8})-(\frac{15}{8})(\frac{3}{4}+\lambda )

\phi '(\lambda )=0\Rightarrow \lambda _{1}=\frac{3}{16},x_{2}=x_{1}+\lambda _{1}e_{2}=(\frac{15}{8} ,\frac{15}{16})^{T}

\because \left | \left | x_{2}-x_{0} \right | \right |> \varepsilon,令 x_{2}=x_{0} ,继续搜索;

从 x_{0} 出发,沿 e_{1}=(1,0)^{T} 作一维搜索,\Rightarrow \lambda _{0}=\frac{3}{32},x_{1}=x_{0}+\lambda _{0}e_{1}=(\frac{63}{32} ,\frac{15}{16})^{T}

从 x_{1} 出发,沿 e_{2}=(0,1)^{T} 作一维搜索,\Rightarrow \lambda _{1}=\frac{3}{64},x_{2}=x_{1}+\lambda _{1}e_{2}=(\frac{63}{32} ,\frac{63}{64})^{T}

\because \left | \left | x_{2}-x_{0} \right | \right |> \varepsilon,令 x_{2}=x_{0} ,继续搜索;

从 x_{0} 出发,沿 e_{1}=(1,0)^{T} 作一维搜索,\Rightarrow \lambda _{0}=\frac{3}{128},x_{1}=x_{0}+\lambda _{0}e_{1}=(\frac{255}{128} ,\frac{63}{64})^{T}

从 x_{1} 出发,沿 e_{2}=(0,1)^{T} 作一维搜索,\Rightarrow \lambda _{1}=\frac{3}{256},x_{2}=x_{1}+\lambda _{1}e_{2}=(\frac{255}{128} ,\frac{255}{256})^{T}

\because \left | \left | x_{2}-x_{0} \right | \right |< \varepsilon,停止,最优解为:x_{2}=(\frac{255}{128} ,\frac{255}{256})^{T}


算法代码:

'''
坐标轮换法
2023.11.18
'''
import numpy as np
from sympy import symbols, diff, solve

x1 = symbols("x1")
x2 = symbols("x2")
λ = symbols("λ")
f = x1**2 + x2**2 - 3 * x1 - x1 * x2

def run(x1_init , x2_init , ε):

    y0 = [x1_init, x2_init]
    e1 = [1, 0]
    e2 = [0, 1]
    while True:
        y1 = [y0[0] + λ * e1[0], y0[1] + λ * e1[1]]
        f_new = f.subs({x1: y1[0], x2: y1[1]})
        grad = diff(f_new, λ)
        λ_value = solve(grad, λ)[0]
        y1 = [y1[0].subs(λ, λ_value), y1[1].subs(λ, λ_value)]

        y1 = np.array([y1[0] + λ * e2[0], y1[1] + λ * e2[1]])
        f_new = f.subs({x1: y1[0], x2: y1[1]})
        grad = diff(f_new, λ)
        λ_value = solve(grad, λ)[0]
        y1 = np.array([y1[0].subs(λ, λ_value), y1[1].subs(λ, λ_value)])

        Deta = y1 - y0
        norm_result = (Deta[0] ** 2 + Deta[1] ** 2) ** 0.5
        if norm_result <= ε:
            print("算法停止,该精度下的最优解是[%f,%f]" % (y1[0], y1[1]))
            return y1
        y0 = y1
run(0,0,0.1)

该代码所运算的结果为:

算法停止,该精度下的最优解是[1.992188,0.996094]

分析:

坐标轮换法有以下两个特点:

(1)算法结构简单,易于实现;

(2)计算效率低,对于维度比较高的优化问题尤为突出,适用于低维优化问题。

(行文中若有纰漏,希望大家指正)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

背对人潮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值