无约束最优化问题之单纯形搜索法

本文介绍了单纯形搜索法在无约束优化问题中的应用,详细阐述了算法的目的、特点和步骤,并通过两个具体例题展示了如何运用该方法求解极小值问题,与解析法对比了结果。
摘要由CSDN通过智能技术生成

无约束最优化问题之单纯形搜索法

概念引入

  单纯形: n n n维空间 R n \mathbb{R}^n Rn中具有 n + 1 n+1 n+1个顶点的凸多面体,比如一维空间中的线段,二维空间中的三角形,三维空间中的四面体等。

算法目的

  求解无约束优化问题的极小值(最小值)。

算法特点

  算法步骤中不需要计算目标函数的导数。

算法步骤

在这里插入图片描述

例题1

  用单纯形搜索法求解下列问题: min ⁡ f ( x ) : = ( x 1 − 3 ) 2 + 2 ( x 2 + 2 ) 2 . \min f(x):=(x_1-3)^2+2(x_2+2)^2. minf(x):=(x13)2+2(x2+2)2.
解:取初始单纯形顶点 x ( 1 ) = ( 0 , 0 ) T , x ( 2 ) = ( 1 , 0 ) T , x ( 3 ) = ( 0 , 1 ) T x^{(1)}=(0,0)^T,x^{(2)}=(1,0)^T,x^{(3)}=(0,1)^T x(1)=(0,0)T,x(2)=(1,0)T,x(3)=(0,1)T,反射系数 α = 1 \alpha=1 α=1,扩展系数 γ = 2 \gamma=2 γ=2,压缩系数 β = 0.5 \beta=0.5 β=0.5,允许误差 ϵ = 2 \epsilon=2 ϵ=2
  代码:

import numpy as np
import sys


def function(x):
    return (x[0] - 3) ** 2 + 2 * (x[1] + 2) ** 2


# 给定n维初始单纯形的n+1个顶点, 反射系数alpha>0, 扩展系数yita>1, 压缩系数beta(0<beta<1), 允许误差epsilon>0
x, alpha, yita, beta, epsilon = np.array([[0., 0], [1, 0], [0, 1]]), 1., 2., 0.5, 2.

# 初始化迭代次数, 计算顶点数
k = 1
dim = x.shape[0]

# 生成“(函数值,索引)”列表
func_list = [function(x[i, :]) for i in range(dim)]
func_list = [[func_list[i], i] for i in range(dim)]

# 算法迭代主体
while 1:
    print('进行第', k, '次迭代')
    print('  顶点与函数值:')
    for i in range(dim):
        print('  第', i + 1, '个顶点:', x[func_list[i][1]], '函数值:', func_list[i][0])

    func_list.sort()

    # 确定最高点x_h, 次高点x_g, 最低点x_l和对应的函数值
    x_h, f_h = x[func_list[-1][1]], func_list[-1][0]
    x_g, f_g = x[func_list[-2][1]], func_list[-2][0]
    x_l, f_l = x[func_list[0][1]], func_list[0][0]
    print('  最高点:', x_h, '函数值:', f_h)
    print('  次高点:', x_g, '函数值:', f_g)
    print('  最低点:', x_l, '函数值:', f_l)

    # 计算除x_h外的n个点的形心x_bar
    # x_bar = np.sum(x - x_h, axis=0) / (dim - 1)  # 公式一:来源于原算法,但不使用,可能会陷入死循环。
    x_bar = (np.sum(x, axis=0) - x_h) / (dim - 1)  # 公式二:重心公式
    print('  最高点外顶点的形心:', x_bar)

    # 进行反射
    x_nj2 = x_bar + alpha * (x_bar - x_h)
    f_nj2 = function(x_nj2)
    print('  反射点:', x_nj2, '函数值:', f_nj2)

    # 分类讨论:
    ## f_nj2的值小于最低点函数值f_l
    if f_nj2 < f_l:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

此账号已停更

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

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

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

打赏作者

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

抵扣说明:

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

余额充值