【CUPK小学期】笔记4:局部最优搜索-多元函数极值求解

问题介绍

对于多元函数的极值求解,可以使用局部最优搜索来逐步逼近最优解。

下面是一种基本的局部最优搜索算法的实现:

  1. 定义初始解:选择一个初始解作为搜索的起点。
  2. 定义邻域:根据问题的特点,定义一个邻域函数,用于生成当前解的邻域解。邻域解是在当前解的基础上进行微小的变动得到的。
  3. 评估解的质量:对于每个邻域解,计算其函数值,并与当前解进行比较,确定是否更新当前解。
  4. 更新解:如果邻域解的函数值更好(更小或更大,具体取决于问题类型),则将当前解更新为邻域解。
  5. 判断停止条件:根据问题的特点,设置停止搜索的条件,例如达到一定的迭代次数、函数值变化小于某个阈值等。
  6. 迭代搜索:重复步骤2-5,直到满足停止条件。

需要注意的是,由于局部最优搜索只能找到局部最优解,而不能保证找到全局最优解。因此,在应用中需要根据问题的特点和需求来选择合适的搜索算法和参数。

求解思路

多元多峰值函数,二元三峰函数

 y=3(1-x_{1})^{2}e^{-x_{1}^{2}-(x_{2}+1)^{2}}-10(\frac{x_{1}}{5}-x_{1}^{3}-x_{2}^{5})e^{-x_{1}^{2}-x_{2}^{2}}-\frac{1}{3}e^{-(x_{1}+1)^{2}}-x_{2}^{2}

我们将使用局部最优搜索算法来找到函数的极小值。局部最优搜索算法是一种迭代算法,它从一个初始解开始,并通过对解进行局部搜索,直到找到满足停止条件的最优解。

我们可以将局部最优搜索算法分为以下几个步骤:

  1. 初始化

    • 初始化搜索起点,可以是随机选择或者根据问题的特性选择一个合适的初始点。
    • 设置搜索步长,用于控制搜索的精度和效率。
  2. 迭代搜索

    • 在每一次迭代中,根据当前解和搜索步长,计算目标函数在解的邻域内的函数值。
    • 检查邻域内的函数值是否比当前解更优。如果是,则更新当前解。
    • 根据停止条件判断是否终止搜索。常见的停止条件包括达到最大迭代次数、函数值的收敛、解的变化较小等。
  3. 返回结果

    • 返回最终的解作为函数的极小值。

代码展示

#include <stdio.h>
#include <math.h>

// 定义目标函数
double objectiveFunc(double x1, double x2) {
    return 3 * pow(1 - x1, 2) * exp(-pow(x1, 2) - pow(x2 + 1, 2)) - 10 * (x1 / 5 - pow(x1, 3) - pow(x2, 5)) * exp(-pow(x1, 2) - pow(x2, 2)) - 1.0 / 3 * exp(-pow(x1 + 1, 2)) - pow(x2, 2);
}

// 局部最优搜索算法
void localOptimalSearch() {
    double x1 = 0.0;  // 初始化搜索起点
    double x2 = 0.0;
    double stepSize = 0.1;  // 设置搜索步长
    double minObjective = objectiveFunc(x1, x2);  // 当前解的目标函数值

    int maxIterations = 1000;  // 最大迭代次数
    int iteration = 0;  // 当前迭代次数

    while (iteration < maxIterations) {
        double leftObjective = objectiveFunc(x1 - stepSize, x2);  // 左邻域的目标函数值
        double rightObjective = objectiveFunc(x1 + stepSize, x2);  // 右邻域的目标函数值
        double upObjective = objectiveFunc(x1, x2 + stepSize);  // 上邻域的目标函数值
        double downObjective = objectiveFunc(x1, x2 - stepSize);  // 下邻域的目标函数值

        double minObjectiveNeighbor = fmin(fmin(fmin(leftObjective, rightObjective), upObjective), downObjective);  // 邻域内的最小目标函数值

        if (minObjectiveNeighbor < minObjective) {
            if (minObjectiveNeighbor == leftObjective) {
                x1 -= stepSize;
            } else if (minObjectiveNeighbor == rightObjective) {
                x1 += stepSize;
            } else if (minObjectiveNeighbor == upObjective) {
                x2 += stepSize;
            } else {
                x2 -= stepSize;
            }

            minObjective = minObjectiveNeighbor;
        } else {
            break;  // 达到停止条件,终止搜索
        }

        iteration++;
    }

    printf("Minimum objective value: %.4f\n", minObjective);
    printf("Optimal solution: x1 = %.4f, x2 = %.4f\n", x1, x2);
}

int main() {
    localOptimalSearch();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值