在前段時(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)值的方法:
1
2
3
|
public interface Fitness { public double getFitness(double X); } |
2.創(chuàng)建一個(gè)類,簡(jiǎn)單實(shí)現(xiàn)上面0.618搜索的方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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ù)為例:
1
2
3
4
5
6
|
public class Func implements Fitness{ @Override public double getFitness(double X) { return X*X- 3 * X + 1; } } |
4.簡(jiǎn)單調(diào)用一下:
1
2
3
4
5
6
|
@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í)例就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/bufferflies/archive/2017/09/25/7593866.html