hooke jeeves算法(模式搜索法)

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import numpy as np
import matplotlib.pyplot as plt

# -----------define HJ agolrathiem para
delta = 0.5 # step size
alfa = 1    # speed rate
beta = 0.5  # decrease rate
epsilon = 0.002 # min stepsize
iniPO = np.array([6,1])     # initial point
G = 10  # 探测次数

# -----------define function
# min f(x):=(1−x1​)^2+5(x2​−x1^​2)^2
def fun(A):
    ff = (1 - A[0]) ** 2 + 5 * (A[1] - A[0] ** 2) ** 2
    return ff

iniPO_ff = np.array([fun(iniPO)])
X = iniPO
X_ff = iniPO_ff
Y = X
Y_ff =X_ff
x = iniPO
y = iniPO

# -----------explore step
dim = iniPO.shape[0] # dimation
e = [1]*dim
E = np.diag(e)
k=0
while delta > epsilon:    
    for i in range(0,dim):
       y_new_plus = y + delta * E[i,:]
       ff = fun(y)
       ff_new = np.array([fun(y_new_plus)])
       temp = Y
       temp_ff = Y_ff
       Y = np.vstack((temp,y_new_plus))
       Y_ff = np.vstack((temp_ff,ff_new))
       plt.plot([Y_ff.shape[0]-1,Y_ff.shape[0]], Y_ff[-2:,:], c='b', marker='*')
       #plt.show()
       if ff_new < ff:
           y = y_new_plus   
       else:
           y_new_minus = y - delta * E[i,:]
           ff = fun(y)
           ff_new = np.array([fun(y_new_minus)])
           temp = Y
           temp_ff = Y_ff
           Y = np.vstack((temp,y_new_minus))
           Y_ff = np.vstack((temp_ff,ff_new))
           plt.plot([Y_ff.shape[0]-1,Y_ff.shape[0]], Y_ff[-2:,:], c='b', marker='*')
           #plt.show()
           if ff_new < ff:
               y = y_new_minus                 
    # get all points
    Y_Data = np.hstack((Y,Y_ff))
    # get new base point
    x =  y
    # get all base points
    temp_x = X
    X = np.vstack((temp_x,x))
    temp_x_ff = X_ff
    X_ff = np.vstack((temp_x_ff,fun(x)))
    X_Data = np.hstack((X,X_ff))
 
# -----------Move step  
    
    if ff_new < ff:
        print()
        y = X[-1,:] + alfa* (X[-1,:]-X[-2,:])
        ff = fun(y)
        temp = Y
        Y = np.vstack((temp,y))
        temp_ff = Y_ff
        Y_ff = np.vstack((Y_ff,ff))
        plt.plot([Y_ff.shape[0]-1,Y_ff.shape[0]], Y_ff[-2:,:], c='b', marker='*')
        Y_Data = np.hstack((Y,Y_ff))  
    else:
        #temp = Y
        #Y = np.vstack((temp,y))
        #temp_ff = Y_ff
        #Y_ff = np.vstack((Y_ff,ff))
        #plt.plot([Y_ff.shape[0]-1,Y_ff.shape[0]], Y_ff[-2:,:], c='b', marker='*')
        #Y_Data = np.hstack((Y,Y_ff))
        delta = beta * delta
    print('k',k)
    print('')
#-----------wheather stop
    if k >= G:     # 当k大于等于G跳出循环
        break
    k = k+1
    
print('--------')
print('Y_Data',Y_Data)
print('X_Data',X_Data)
print('delta',delta)
print('--------')

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: hooke-jeeves方是一种数值优化算法,用于寻找非约束优化问题的最小值。在MATLAB中,可以使用fminsearch函数来实现hooke-jeeves方,该函数可以接受函数句柄和初始点作为输入,并返回找到的最优解和最小值。 ### 回答2: Hooke-Jeeves是一种用于非线性优化问题的迭代算法,该算法用于寻找一个函数的局部极小值。在MATLAB中,可以使用数值优化工具箱中的fminsearch函数来实现Hooke-Jeeves。 fminsearch函数的基本用是:[x, fval] = fminsearch(fun, x0)。其中,fun为要最小化的目标函数的句柄,x0为初始猜测值。该函数返回最小化目标函数时的变量值x和函数值fval。 例如,假设我们要最小化一个二维目标函数f(x) = (x1-1)^2 + (x2-2)^2,初始猜测值为x0 = [0, 0]。可以按如下方式使用Hooke-Jeeves: ```matlab % 定义目标函数 fun = @(x) (x(1)-1)^2 + (x(2)-2)^2; % 初始猜测值 x0 = [0, 0]; % Hooke-Jeeves求解 [x, fval] = fminsearch(fun, x0); ``` 在上述代码中,我们首先定义了目标函数fun,即f(x) = (x1-1)^2 + (x2-2)^2。然后指定了初始猜测值x0为[0, 0]。最后,使用fminsearch函数进行求解,得到最小化目标函数时的变量值x和函数值fval。 需要注意的是,Hooke-Jeeves是一种局部搜索算法,它只能找到局部极小值而非全局极小值。因此,算法的成功与否取决于初始猜测值的选择。如果要找到全局极小值,可能需要使用其他的优化算法,如遗传算法或粒子群优化算法。 ### 回答3: Hooke-Jeeves是一种数值优化算法,在Matlab中有多种函数库可以实现。该算法的主要思想是通过在搜索空间中进行局部搜索,并根据搜索结果进行调整,最终找到函数的最优解。 在Matlab中,可以使用fminsearch函数来实现Hooke-Jeeves。这个函数接受一个目标函数和一个初始解的向量作为输入,然后通过不断调整解向量来寻找最优解。算法的原理是根据当前解向量的搜索方向,在搜索空间中进行探索,并根据搜索结果更新解向量。搜索过程会不断迭代,直到满足终止条件。 使用fminsearch函数时,需要定义目标函数,在函数中输入待优化的变量,并返回目标函数值。初始解向量可以根据问题的特性来设置,然后可以选择合适的搜索步长和终止条件进行调试。 下面是一个简单的示例代码: ```matlab % 定义目标函数 function fval = targetFunction(x) % 待优化的目标函数 fval = x(1)^2 + x(2)^2; end % 定义初始解向量 initialSolution = [0, 0]; % 使用Hooke-Jeeves进行优化 optimalSolution = fminsearch(@targetFunction, initialSolution); % 输出最优解 disp('最优解:'); disp(optimalSolution); % 输出最优解对应的目标函数值 disp('最优解的目标函数值:'); disp(targetFunction(optimalSolution)); ``` 在这个例子中,我们定义了一个简单的目标函数,并设置了初始解向量。然后通过调用fminsearch函数,传入目标函数和初始解向量,进行最优化计算。最后输出最优解和最优解对应的目标函数值。 总之,Hooke-Jeeves是一种常用的数值优化算法,在Matlab中可以通过fminsearch函数来实现。通过定义目标函数和初始解向量,可以使用这一算法来寻找函数的最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值