概念引入
单纯形: 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):=(x1−3)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: