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

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

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

    1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...

  2. axios 的 get 方法 params 传参 400 的问题

    axios 的 get 方法 params 传参,在输入框中输入某些特殊字符 例如中括号,请求时会直接报 400 错误,Bad Request. 原因:axios 的 get 方法,在使用 param ...

  3. Java自学-类和对象 传参

    Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 publi ...

  4. vue中计算属性computed方法内传参

    vue中computed计算属性无法直接进行传参 如果有传参数的需求比如说做数据筛选功能可以使用闭包函数(也叫匿名函数)实现 例如: 在上篇博客vue安装使用最后的成绩表练习中的过滤功能的实现: &l ...

  5. .NET CORE控制器里的方法取传参的坑

    把以前的ASP.NET MVC的项目改成用.NET CORE来写,写好了部署上去了,结果问题一大堆,今天慢慢检查了一下,发现一个大坑: 写控制器里的方法接收参数数都是直接写在控制器的方法参数里的,如: ...

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

    打印菱形图案: 代码实现: public class Hello { public static void main(String args[]) { LingXingPrint("#&qu ...

  7. Java学习----你可以告诉对象该怎么做(方法中传参)

    对象根据参数传递来的条件执行相应的功能. package org.demo.app2; public class App2 { public void print(String msg, int nu ...

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

    对Thread: 1.使用ThreadStart static void Main(string[] args) { Thread th1=new Thread(new ThreadStart(Say ...

  9. 微信小程序返回上一页的方法并传参

    这个有点像子-->父传值 第一步,在子页面点击上一步或者保存数据请求成功以后添加如下代码. var pages = getCurrentPages(); var prevPage = pages ...

随机推荐

  1. 学习CSS记录:CSS文件引入到HTML中

    1.直接写在标签元素中,通常称为行间样式.(优先级较高,有悖于结构与表现的分离,建议不使用) 例:<body style="background:red;"></ ...

  2. iphone 4s页面引用jssdk无效

    今天在做项目的时候,发现了一个bug,用户在iphone 4s上使用该项目打开网页时,调用上传图片的接口没反应. 无语啊.找了半天也没找到是什么问题.

  3. Ubuntu14.04下搭建VPN服务 -pptp

    在Ubantu下采用PPTP搭建VPN,优点是配置简单快捷.本教程亲自测试,熟练了在新机器上5分钟搞定VPN. - - - - - - - - - - - - - - - - - - - - - - ...

  4. JS中的DOM操作和事件

    [DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点:可以使用getElement系列方法, ...

  5. Linux安装解压缩版jdk

    #解压到指定目录 tar zxvf ./jdk-7-Linux-i586.tar.gz  -C /usr/lib/jvm 配置环境变量 #vi  /etc/profile 编辑文件,在最后添加: ex ...

  6. [2017-2018上Java助教]个人信息收集

    在本学期的Java课程中,我们要收集的信息如下 1.学号 .码云地址 3.博客园地址 请各位同学自行创建,并按照如下的格式评论在这篇博客下方 学号+https://git.oschina.net/as ...

  7. 【JavaScript基础系列】决定你的人生能走多远的,是基础。

    前言 javaScript门槛非常低,一点语法,一个dom,一个bom就可以使用它开发大部分js应用,再加上现在层出不穷的框架极大的简化抽象了javaScript的使用方式,但是我们始终不能忘记的一点 ...

  8. grunt之watch续

    上一回没有说完,我就是这样,做之前心中波澜壮阔,锦绣山河,等画完小草开始烦躁,完成鲜花出现动摇,然后心神涣散,最后虎头蛇尾. 现在弥补下之前遗漏的问题. watch(V0.6.1)的tasks和opt ...

  9. 团队作业8——Beta 阶段冲刺7th day

    一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 完善支付功能 (2)今天计划完成的工作(具体如下) 测试与正式发布 (3) 工作中遇到的困难(在表格中) 成员 昨天已完成 ...

  10. C语言数据在内存分配

    一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放 ...