標籤:訪問 str min inter ima size 對象 需要 函數
在前段時研究智能演算法時,發現如果使用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 如何將方法作為傳參--多態