下面小编就为大家带来一篇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.pide(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将方法作为传参之多态的实例的详细内容。