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这个方法就可以访问这个参数了

时间: 2024-08-01 20:22:40

java 如何将方法作为传参--多态的相关文章

多态 模拟 移动硬盘 插入电脑 读写,方法1传参,方法2属性赋值

//多态 模拟 移动硬盘 插入电脑 读写,方法1传参,方法2属性赋值 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { //多态 模拟 移动硬盘 插入电脑

(1)构造方法和方法重载 (2)this关键字 (3)方法的传参和递归调用

1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1.1 构造方法(重中之重)(1)语法格式 class 类名{ 类名(形参列表){ 构造方法体; } }如: class Person{ Person(){ } } (2)使用方式 a.构造方法的名称与类名完全相同,并且没有返回值类型,连void都不许有: b.当创建新对象时会自动调用构造方法来进行该对

php调用java写的WebService不能传参问题解决

前言:  刚刚做了一个事,php调java的soap接口,但是并没有什么文档,只有看以前写的java调用用来写.所以java是可以正常调用的,出现的问题是php能调到接口,但是接收不了参数. 开始没看懂那个java调用,设置targetNamespace是什么鬼,翻遍了php手册,吧英文翻译过来看了才知道,SoapVar对应了soap数据的封装. 网上收了,发现他们都在乱答.浪费我时间,还不如自己看手册. 问题出在:命名空间 java soapClient:  /**  * saleOrderI

Java自学-类和对象 传参

Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 public class Hero { String name; //姓名 float hp; //血量 float armor; //护甲 int moveSpeed; //移动速度 public Hero(){ } //回血 public void huixue(int xp){ hp = hp + xp

java:打印菱形图案(传参打印的自定义字符和行数)

打印菱形图案: 代码实现: public class Hello { public static void main(String args[]) { LingXingPrint("#", 7); } public static void LingXingPrint(String i, int num) { /** * 打印菱形,传参:i 为打印的字符,num为行数 . * 思路:将菱形分为上三角和下三角,上三角:每一行空格打印数为总行数-行号:每一行字符打印个数为2*行号-1;下三角

Java 注解入门实例 &amp;&amp; 注解传参

参考 概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法 JDK内置系统注解: @Override 用于修饰此方法覆盖了父类的方法; @Deprecated 用于修饰已经过时的方法; @Suppvisewarnings 用于通知java编译器禁止特定的编译警告. 注解按照运行机制划分 源码注解:注解只在源码中存在,编译成.class文件就不存在了: 编译时注解:注解在源码和.class文件中都存在(例:JDK自带注解): 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑

多重影分身——C#中多线程的使用三(调用方法和传参)

对Thread: 1.使用ThreadStart static void Main(string[] args) { Thread th1=new Thread(new ThreadStart(SayHello)); th1.Start(); Console.ReadKey(); } static void SayHello() { Console.WriteLine("Hello!"); } 这种形式只能是无参的空类型函数,如果需要传参数,就得用ParameterizedThread

弹出新界面,在新界面执行方法后传参给调用界面,再执行调用界面的方法

需求:收费界面如果按照客户名称来检索,且有重名的话,能弹出多个客户来选择 思路:利用jquery和第三方的js库lhgdialog.min.js(我这里是为了快速.方便.美观.不用考虑兼容性),当点击查询时,调用弹出窗体,弹出窗体引用了一个单独的aspx页面,这个aspx页面将列出查询到的数据列表,然后根据选择不通的数据行,将唯一标识再传给调用页面(主页面),最后执行调用页面(主页面)的方法. 界面效果如下: aspx页面: <script src="JS/jquery-1.10.2.mi

ajax调用WebServices服务方法和传参调用WebServices注意事项

先演示下ajax是如何调用WebServices中的方法    1.新建一个页面default.aspx,一个Web服务    在页面中引用jQuery文件. <script src="../Scripts/jquery-1.4.1.js" type="text/javascript"></script> web服务里给Helloworld方法里加个参数 using System; using System.Collections.Gener