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这个方法就可以访问这个参数了
java 如何将方法作为传参--多态的更多相关文章
- (1)构造方法和方法重载 (2)this关键字 (3)方法的传参和递归调用
1.构造方法和方法重载如: Person p = new Person(); - 声明Person类型的引用p指向Person类型的对象 p.show(); - 调用名字为show()的成员方法 1. ...
- axios 的 get 方法 params 传参 400 的问题
axios 的 get 方法 params 传参,在输入框中输入某些特殊字符 例如中括号,请求时会直接报 400 错误,Bad Request. 原因:axios 的 get 方法,在使用 param ...
- Java自学-类和对象 传参
Java中的传参 变量有两种类型 基本类型 和类类型 参数也是变量,所以传参分为 基本类型传参 类类型传参 步骤 1 : 基本类型传参 基本类型传参 在方法内,无法修改方法外的基本类型参数 publi ...
- vue中计算属性computed方法内传参
vue中computed计算属性无法直接进行传参 如果有传参数的需求比如说做数据筛选功能可以使用闭包函数(也叫匿名函数)实现 例如: 在上篇博客vue安装使用最后的成绩表练习中的过滤功能的实现: &l ...
- .NET CORE控制器里的方法取传参的坑
把以前的ASP.NET MVC的项目改成用.NET CORE来写,写好了部署上去了,结果问题一大堆,今天慢慢检查了一下,发现一个大坑: 写控制器里的方法接收参数数都是直接写在控制器的方法参数里的,如: ...
- java:打印菱形图案(传参打印的自定义字符和行数)
打印菱形图案: 代码实现: public class Hello { public static void main(String args[]) { LingXingPrint("#&qu ...
- Java学习----你可以告诉对象该怎么做(方法中传参)
对象根据参数传递来的条件执行相应的功能. package org.demo.app2; public class App2 { public void print(String msg, int nu ...
- 多重影分身——C#中多线程的使用三(调用方法和传参)
对Thread: 1.使用ThreadStart static void Main(string[] args) { Thread th1=new Thread(new ThreadStart(Say ...
- 微信小程序返回上一页的方法并传参
这个有点像子-->父传值 第一步,在子页面点击上一步或者保存数据请求成功以后添加如下代码. var pages = getCurrentPages(); var prevPage = pages ...
随机推荐
- 学习CSS记录:CSS文件引入到HTML中
1.直接写在标签元素中,通常称为行间样式.(优先级较高,有悖于结构与表现的分离,建议不使用) 例:<body style="background:red;"></ ...
- iphone 4s页面引用jssdk无效
今天在做项目的时候,发现了一个bug,用户在iphone 4s上使用该项目打开网页时,调用上传图片的接口没反应. 无语啊.找了半天也没找到是什么问题.
- Ubuntu14.04下搭建VPN服务 -pptp
在Ubantu下采用PPTP搭建VPN,优点是配置简单快捷.本教程亲自测试,熟练了在新机器上5分钟搞定VPN. - - - - - - - - - - - - - - - - - - - - - - ...
- JS中的DOM操作和事件
[DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点:可以使用getElement系列方法, ...
- Linux安装解压缩版jdk
#解压到指定目录 tar zxvf ./jdk-7-Linux-i586.tar.gz -C /usr/lib/jvm 配置环境变量 #vi /etc/profile 编辑文件,在最后添加: ex ...
- [2017-2018上Java助教]个人信息收集
在本学期的Java课程中,我们要收集的信息如下 1.学号 .码云地址 3.博客园地址 请各位同学自行创建,并按照如下的格式评论在这篇博客下方 学号+https://git.oschina.net/as ...
- 【JavaScript基础系列】决定你的人生能走多远的,是基础。
前言 javaScript门槛非常低,一点语法,一个dom,一个bom就可以使用它开发大部分js应用,再加上现在层出不穷的框架极大的简化抽象了javaScript的使用方式,但是我们始终不能忘记的一点 ...
- grunt之watch续
上一回没有说完,我就是这样,做之前心中波澜壮阔,锦绣山河,等画完小草开始烦躁,完成鲜花出现动摇,然后心神涣散,最后虎头蛇尾. 现在弥补下之前遗漏的问题. watch(V0.6.1)的tasks和opt ...
- 团队作业8——Beta 阶段冲刺7th day
一.当天站立式会议 二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 完善支付功能 (2)今天计划完成的工作(具体如下) 测试与正式发布 (3) 工作中遇到的困难(在表格中) 成员 昨天已完成 ...
- C语言数据在内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放 ...