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 将方法作为传参--多态的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
浅谈java String.split丢失结尾空字符串的问题
下面小编就为大家带来一篇浅谈java String.split丢失结尾空字符串的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-02-02SpringCloud之Config配置中心与Redis分布式锁详解
这篇文章主要给大家介绍了SpringCloud Alibaba中Config配置中心,Redis分布式锁,文中有详细的代码示例供大家参考,需要的朋友可以参考阅读2023-05-05Mybatis-Plus实体类注解方法与mapper层和service层的CRUD方法
CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。主要被用在描述软件系统中DataBase或者持久层的基本操作功能,下面让我们一起看看吧2022-03-03SpringBoot2.x版本中,使用SpringSession踩的坑及解决
这篇文章主要介绍了SpringBoot2.x版本中,使用SpringSession踩的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07
最新评论