优化算法学习笔记(一)之线搜索

线搜索

线搜索是一个一元优化问题,为了引导搜索,可以使用线搜索目标的导数,即x+ad处沿d的方向导数。线搜索的算法为如下:

线搜索的一般步骤:

  1. 选择一个初始点x_{0}和一个搜索方向 d
  2. 通过尝试不同的步长t来最小化目标函数f(x_{0}+td)

使用SciPy中的minimize函数,该函数可以用于多维优化问题。

考虑以下目标函数:

f(x) = (x_{1}-3)^{2} + (x_{2}-2)^{2}

这是一个二维的凸函数,最小值在x_{1} = 3 , x_{2} = 2处。

以下是相应的 Python 代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
import matplotlib

# 设置matplotlib正常显示中文和负号
matplotlib.rcParams['font.sans-serif']=['SimHei'] # 用黑体显示中文
matplotlib.rcParams['axes.unicode_minus']=False # 正常显示负号

# 定义目标函数
def objective_function(x):
    return (x[0] - 3)**2 + (x[1] - 2)**2

# 初始点
initial_point = np.array([0.0, 0.0])

# 执行线搜索
result = minimize(objective_function, x0=initial_point, method='BFGS')

# 输出结果
print("最小值所在的位置:", result.x)
print("最小值:", result.fun)

# 绘制迭代图像
x1_vals = np.linspace(-1, 5, 100)
x2_vals = np.linspace(-1, 5, 100)
X1, X2 = np.meshgrid(x1_vals, x2_vals)
Z = (X1 - 3)**2 + (X2 - 2)**2

plt.contour(X1, X2, Z, levels=20, cmap='viridis')
plt.scatter(result.x[0], result.x[1], color='red', marker='x', label='最小值')
plt.title('目标函数和迭代过程')
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend()
plt.show()

运行结果:

最小值所在的位置: [2.99999999 1.99999999]
最小值: 1.84598775337616e-16

迭代过程中,我们通过绘制等高线图可视化了目标函数,并在图中标记出了每次迭代的位置。最终,我们用红色的 "x" 标记了找到的最小值所在的位置。

  • 13
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值