极值存在区间搜索(c#实现)

参考书目:机械最优设计技术,孟兆明 常德功

人工智能的学习里头,我们经常会去找极值,很多都是和步长相关的,我们慢慢接近他,前面bpnet中步长全部使用0.5,为什么?先熟悉吧!熟悉了,就知道了,先看介绍:

这一节主题:极值存在区间搜索,里边有了步长最基础的印象

 

c#代码实现:

 // min f(X)
  //f(x)=x^2-10*x+8;

我们尝试找上面函数存在极值的区间

 第一,声明全局变量

  PointF glob = new PointF();//ji`lu`jie'guo*

 float x0 = -10;//chu-shi*zhi'
 float step = 1;//bu`chang'

  第二,搞定

private void 找极值区间(object sender, EventArgs e)
        {
            float a = x0;
            float b = x0 + step;//默认b大于a

            float FX0 = func(x0);
            float FB = func(b);
            if (FX0 == FB) { a = x0; b = x0 + step; return; }
            if (FX0 < FB)
            {
                //1,x0,b互换
                huhuanhanshu(ref x0, ref b);
                //2,fx0,fb互换
                huhuanhanshu(ref FX0, ref FB);
                //3,h=-h;
                step = -step;
            }

            //只有这一条路向下走
            迭代goto(ref FX0, ref FB, ref  b);
            a = glob.X;//fan*hui'qu*jian-jie'guo*(a,b)
            b = glob.Y;         

        }

  float func(float X)
        {
            return X*X - 10 * X + 8; 
        }
        void huhuanhanshu(ref float a,ref float b)
        {
            float temp = 0;
            temp = a;
            a = b;
            b = temp;
        }

 void 迭代goto(ref float fx0, ref float fb, ref float 位置b)
        {//方向正确

            //x0 = b;
            x0 = 位置b;
            fx0 = fb; step = 2 * step;
            //b = x0 + step;
            位置b = x0 + step;

            //fb = func(b);
            fb = func(位置b);

            if (fx0 <= fb)//终止条件
            {

                if (fx0 == fb)
                    glob = new PointF(x0, 位置b);
                else
                    glob = new PointF(x0 - step / 2f, 位置b);
            }
            else
            {
                迭代goto(ref fx0, ref fb, ref 位置b);

            }

        }

看到原书有basic代码,goto语句跳来跳去的,c#实现后,发现这个迭代goto函数很像goto语句。

里边的步长很容易理解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值