java 將方法作為傳參--多態(tài)的實(shí)例
在前段時(shí)研究智能算法時(shí),發(fā)現(xiàn)如果使用java進(jìn)行實(shí)現(xiàn)的話,往往具體實(shí)現(xiàn)過程差不多,但是適應(yīng)值函數(shù)卻根據(jù)
研究對(duì)象的不同發(fā)生很大的改變,這樣對(duì)代碼的維護(hù)產(chǎn)生很大的阻礙,于是產(chǎn)生的一個(gè)疑問:可不可以將適應(yīng)值函數(shù)
作為參數(shù)傳入到方法中,根據(jù)C/C++的習(xí)慣的話,由于指針的存在,可以將函數(shù)作為指針傳入,由于指針使用的復(fù)雜
性以及難維護(hù)性,效果一般。如果換一種面向?qū)ο蟮乃枷?,可以想設(shè)計(jì)一個(gè)接口I,這個(gè)接口只提供一個(gè)方法,那么相
當(dāng)于可以將接口作為參數(shù)傳入到方法中,調(diào)用時(shí)只需要將設(shè)計(jì)一個(gè)類,實(shí)現(xiàn)接口I,那么就可以將函數(shù)傳入到方法中了。
下面以0.618黃金搜索法為例,由于目標(biāo)函數(shù)的不同,滿足上面所敘述的,注意這種搜索只能時(shí)單峰的函數(shù)才可行,
算法如下圖所示:

1.首先創(chuàng)建一個(gè)接口,這個(gè)接口只有一個(gè)適應(yīng)值的方法:
public interface Fitness {
public double getFitness(double X);
}
2.創(chuàng)建一個(gè)類,簡單實(shí)現(xiàn)上面0.618搜索的方法:
public class stationUtils{/***
* 黃金分割搜索法,尋找最小值的函數(shù)
* @param min 搜索上限
* @param max 搜索下限
* @param fitness 函數(shù)值
* @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.在創(chuàng)建一個(gè)類,用來實(shí)現(xiàn)Fitness接口,也就是將自己目標(biāo)函數(shù)寫進(jìn)去,這里以一元二次函數(shù)為例:
public class Func implements Fitness{
@Override
public double getFitness(double X) {
return X*X- 3 * X + 1;
}
}
4.簡單調(diào)用一下:
@Test
public void run1(){
Func func=new Func();
double result=stationUtils.goldenSearch(-2.00,4.00,func);
System.out.println(result);
}
總結(jié),加入傳入的參數(shù)比較多,可以將值傳入到接口實(shí)現(xiàn)類中,那么getFitness這個(gè)方法就可以訪問這個(gè)參數(shù)了。
以上這篇java 將方法作為傳參--多態(tài)的實(shí)例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解在Java程序中運(yùn)用Redis緩存對(duì)象的方法
這篇文章主要介紹了在Java程序中運(yùn)用Redis緩存對(duì)象的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證
本篇文章主要介紹了詳解使用Spring Security進(jìn)行自動(dòng)登錄驗(yàn)證,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09
java自動(dòng)根據(jù)文件內(nèi)容的編碼來讀取避免亂碼
這篇文章主要介紹了java自動(dòng)根據(jù)文件內(nèi)容的編碼來讀取避免亂碼,需要的朋友可以參考下2014-02-02
IDEA中Maven依賴包無法下載或?qū)氲慕鉀Q方案(系統(tǒng)缺失文件導(dǎo)致)
在配置Maven環(huán)境時(shí),可能會(huì)遇到各種報(bào)錯(cuò)問題,首先確保Maven路徑配置正確,例如使用apache-maven-3.5.0版本,則需要在系統(tǒng)環(huán)境變量的Path中添加其bin目錄路徑,并上移優(yōu)先級(jí),接下來,在Maven的conf目錄下修改settings.xml文件,將鏡像源改為阿里云2024-09-09
IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項(xiàng)目的示例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼
本篇文章主要介紹了SSH框架實(shí)現(xiàn)表單上傳圖片實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09
mybatis Example Criteria like 模糊查詢問題
這篇文章主要介紹了mybatis Example Criteria like 模糊查詢問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Spring Boot 集成Shiro的多realm配置過程
這篇文章主要介紹了Spring Boot 集成Shiro的多realm配置,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10

