目录
基本原理:
给定 ,先从点
出发沿第一个坐标轴方向
作一维搜索。求出
和
使得:
,
再从 出发,沿第二个坐标轴方向
作一维搜索。求出
和
使得:
,
重复上述步骤,最后从点 出发,沿着第 n 个坐标轴方向
作一维搜索,求出
和
使得:
,
显然,
设给定允许误差 ε>0,如果 ,停止,
为近似最优解;否则,重复上述步骤。
(注:在实际问题中,可以按照各因素(变量)对实验结果影响大小,依次自前往后排列坐标轴方向。)
算法步骤:
步骤1:选取初始点 ,给定允许误差 ε>0,k=1;
步骤2:从点 出发,沿着第 k 个坐标轴方向作一维搜索,求出
和
使得:
,
步骤3:如果 k=n,转步骤4;否则,令 k=k+1,返回步骤2
步骤4:如果 ,停止,
为近似最优解;否则,令
,k=1,返回步骤2。
例题分析:
下面我们来用一个简单的例题来解释计算流程:
例题:用坐标轮换法求解 ,其中
解:从 出发,沿
作一维搜索,
令
从 出发,沿
作一维搜索,
令
,令
,继续搜索;
从 出发,沿
作一维搜索,
令
从 出发,沿
作一维搜索,
令
,令
,继续搜索;
从 出发,沿
作一维搜索,
从 出发,沿
作一维搜索,
,令
,继续搜索;
从 出发,沿
作一维搜索,
从 出发,沿
作一维搜索,
,停止,最优解为:
。
算法代码:
'''
坐标轮换法
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)计算效率低,对于维度比较高的优化问题尤为突出,适用于低维优化问题。
(行文中若有纰漏,希望大家指正)