手机版
你好,游客 登录 注册
背景:
阅读新闻

Java 如何将方法作为传参--多态

[日期:2017-09-26] 来源:Linux社区  作者:bufferflies [字体: ]

在前段时研究智能算法时,发现如果使用Java进行实现的话,往往具体实现过程差不多,但是适应值函数却根据研究对象的不同发生很大的改变,这样对代码的维护产生很大的阻碍,于是产生的一个疑问:可不可以将适应值函数作为参数传入到方法中,根据C/C++的习惯的话,由于指针的存在,可以将函数作为指针传入,由于指针使用的复杂性以及难维护性,效果一般。如果换一种面向对象的思想,可以想设计一个接口I,这个接口只提供一个方法,那么相当于可以将接口作为参数传入到方法中,调用时只需要将设计一个类,实现接口I,那么就可以将函数传入到方法中了。

下面以0.618黄金搜索法为例,由于目标函数的不同,满足上面所叙述的,注意这种搜索只能时单峰的函数才可行,算法如下图所示:

1.首先创建一个接口,这个接口只有一个适应值的方法:

public interface Fitness {
    public double getFitness(double X);
}

2.创建一个类,简单实现上面0.618搜索的方法:

public class stationUtils{

/***
    * 黄金分割搜索法,寻找最小值的函数
    * @param min 搜索上限
    * @param max 搜索下限
    * @param fitness 函数值
    * @return
    */
  public double goldenSearch(double min,double max,Fitness fitness){
      /*double X1=min+0.382*(max-min);*/
      double a=doubleOperation.substract(max,min);
      double X1=doubleOperation.add(min,doubleOperation.multiply(0.382,a));
      /*double X2=min+0.618*(max-min);*/
      double X2=doubleOperation.add(min,doubleOperation.multiply(0.618,a));
      double F1=fitness.getFitness(X1);
      double F2=fitness.getFitness(X2);
      while(Math.abs(doubleOperation.substract(X1,X2))>delt){
        if(F1<F2){
            max=X2;
            X2=X1;
            F2=F1;
            X1=min+0.382*(max-min);
            F1=fitness.getFitness(X1);
        }else{
          min=X1;
          X1=X2;
          F1=F2;
          X2=min+0.618*(max-min);
          F2=fitness.getFitness(X2);
        }
      }
      return doubleOperation.divide(doubleOperation.add(max,min),2);

  }
}

3.在创建一个类,用来实现Fitness接口,也就是将自己目标函数写进去,这里以一元二次函数为例:

 public class Func implements Fitness{
        @Override
        public double getFitness(double X) {
            return X*X- 3 * X + 1;
        }
    }

4.简单调用一下:

 @Test
    public void run1(){
        Func func=new Func();
        double result=stationUtils.goldenSearch(-2.00,4.00,func);
        System.out.println(result);
    }

总结,加入传入的参数比较多,可以将值传入到接口实现类中,那么getFitness这个方法就可以访问这个参数了

本文永久更新链接地址http://www.linuxidc.com/Linux/2017-09/147089.htm

linux
相关资讯       Java多态  Java方法  Java传参 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款