2012年8月23日 星期四

PSO粒子群演算法的問題設定


原本的程式預設是找最小值,程式碼如下(PBmain.java)
  //判定改變pgbest
    void check(double now_answer, double pbest_answer, double gbest_answer, int now_bird, int bird_var_num, double[][] bird_x, double[] bird_temp_now, double[][] pbest, double[] bird_temp_pbest, double[] gbest, double[] bird_temp_gbest) {
   
        int i = now_bird, j;
       
        //結果較好就轉存pbest
        if ( now_answer< pbest_answer ) {
            for (j=0; j< bird_var_num; j++ ) {
            //維度變化
                
                pbest[i][j] = bird_temp_now[j];
            } //end for
               
            //結果較好就轉存gbest
            if  ( now_answer< gbest_answer ) {
                for (j=0; j< bird_var_num; j++ ) gbest[j] = bird_temp_now[j];
            } //end if
        } end if
    } //end check()

將小於符號改成>大於符號應該就是找最大值了
此外,該PSO演算法程式可以自訂問題q1v2.txt,問題的定義如下


//問題定義開始 user_function
package myPackage.javaclass;public class user_function{
    public static int v=2; //變數的個數
    //function 開始
    public double function(double[] x){
        //z為目標值
        double z = 35*x[0]+25*x[1];
       
       //輸入限制式,符合限制式條件者才傳會目標值z,否則傳回一個大值
 if ((0.32*x[0] + 0.22*x[1] >= 8) & (0.11*x[0] + 0.09*x[1] >= 3) & (0.15*x[0]+0.10*x[1] >= 4))
 {
         return z;
 }else
 {
  z = 1.79769E+308;
  return z;
 }// end of if else
 }// end of public double function 問題定義結束
}//end of user_function

沒有留言:

張貼留言