首頁  >  文章  >  Java  >  Java將方法作為傳參之多態的實例

Java將方法作為傳參之多態的實例

黄舟
黄舟原創
2017-09-26 09:15:451981瀏覽

下面小編就為大家帶來一篇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將方法作為傳參之多態的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn