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


             在前段时研究智能算法时,发现如果使用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这个方法就可以访问这个参数了

  • 相关阅读:
    杂记
    实战:PSP上运行Windows 95
    [英语阅读笔记] CodeSnip: Uploading Multiple Files At Once
    整理网上的一些关于sharepoint编码方面的最佳实践 Virus
    ASP.NET、SharePoint中另存文件的长文件名被截断的原因及解决办法 Virus
    一个由Erlang引发的故事,关于语言和工资的故事 Virus
    ASP.NET统计图表控件 Virus
    关于验证码的思考 Virus
    Design Pattern 设计模式【观察者】 Virus
    moss开发实施过程中遇到的问题总结:项目层面 Virus
  • 原文地址:https://www.cnblogs.com/bufferflies/p/7593866.html
Copyright © 2020-2023  润新知