这里有新鲜出炉的 Java 设计模式,程序狗速度看过来!
Java 程序设计语言
java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称.
下面小编就为大家带来一篇 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 将方法作为传参 -- 多态的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持 PHPERZ.
来源: http://www.phperz.com/article/18/0120/353289.html