最优化算法python实现篇(1)——进退法

最优化算法python实现篇(1)——进退法

算法简介

进退法的用途是为一维极值优化问题寻找到一个包含极值的单峰区间,即从一点出发,试图搜索到使函数呈现“高-低-高”的三点,从而得到一个近似的单峰区间。

算法适用问题

凸优化问题,即目标函数为凸函数,若不是凸函数,则搜索到的单峰区间依赖初始值的选择,一般只能找到包含极值的单峰区间,而找不到包含最值的区间,即只能搜索到局部最优,而非全局最优。

python实现

import matplotlib.pyplot as plt
plt.figure()
class advance_retreat_method(object):
    """
    obj_func 为需要寻找单峰区间的目标函数
    x0为给定的初始点
    h0搜寻步长
    """
    def __init__(self,obj_func,x0 = 0,h0 = 0.1):
        self.h = h0
        self.obj_func = obj_func
        self.x1 = x0
        self.x2 = x0 + h0
        self.x3 = 0
        self.y1 = 0
        self.y2 = 0
        self.y3 = 0
    # 1、计算函数值
    def func_value(self):
        self.y1 = self.obj_func(self.x1)
        self.y2 = self.obj_func(self.x2)
        plt.plot([self.x1,self.x2],[self.y1,self.y2],marker = "*",color = "red",markersize = 15)
    # 2、比较函数值大小
    def compare_value(self):
        if self.y1 < self.y2:
            self.h = -self.h
            a = self.x1
            b = self.y1
            self.x1 = self.x2
            self.y1 = self.y2
            self.x2 = a
            self.y2 = b
        else :
            self.h = self.h
    
    # 3、计算y3
    def cal_y3(self):
        self.x3 = self.x2+self.h
        self.y3 = self.obj_func(self.x2+self.h)
        plt.plot([self.x2,self.x3],[self.y2,self.y3],marker = "o",color = "blue")
    
    # 4、比较y3与y2后判断是否输出单峰区间
    def get_interval(self):
        if self.y3 > self.y2:
            if self.x1 < self.x3:
                return [self.x1,self.x3]
            else:
                return [self.x3,self.x1]
        else:
            self.x1 = self.x2
            self.y1 = self.y2
            self.x2 = self.x3
            self.y2 = self.y3
            self.cal_y3()
            return self.get_interval()
    
    # 5、统筹运行
    def run(self):
        # 1、计算y1和y2
        self.func_value()
        # 2、比较函数值大小
        self.compare_value()
        # 3、计算y3
        self.cal_y3()
        # 4 比较y3与y2后判断是否输出单峰区间
        result = self.get_interval()
        return result
    
if __name__ == "__main__":
    sample = lambda x:x**2
    a = advance_retreat_method(sample,x0 = 0.5).run()
    print(a)

示例运行结果

在这里插入图片描述
by CyrusMay 2020 04 28

晒伤的脱皮 意外的雪景
与你相依的四季
苍狗又白云 身旁有了你
匆匆轮回又有何惧

——————五月天(如果我们不曾相遇)——————

  • 14
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值