waysun一路陽光

          不輕易服輸,不輕言放棄.--心是夢的舞臺,心有多大,舞臺有多大。踏踏實實做事,認認真真做人。

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
            167 隨筆 :: 1 文章 :: 64 評論 :: 0 Trackbacks
          http://hi.baidu.com/litertiger/blog/item/3798546625f86224aa184c30.html

          書上給的的一個算法,實現(xiàn)了一下

          無約束條件 max f(x1,x2)=21.5+x1*sin(4*pi*x1)+x2sin(20*pi*x2)

          -3.0<x1<12.1

          4.1<x2<5.8

          1%的變異

          25%交叉

          旋轉轉輪選擇

          /**
           * 實現(xiàn)Michalewicz
           * 
           * @author not attributable
           * @version 1.0
           */

           
          public class JGA {
           
           bestindival bd = null;
           
           String[] ipop = new String[10];
           
           int gernation = 0;
           
           public JGA() {
            this.ipop = inialPops();
           }
           
           double calculatefitnessvalue(String str) { // str為染色體,前面18個為x1表示部分,后面15個為x2表示部分
            String str1 = str.substring(0, 18);
            // System.out.println(str1);
            String str2 = str.substring(18);
            // System.out.println(str2);
            int b1 = Integer.parseInt(str1, 2);
            // System.out.println(b1);
            int b2 = Integer.parseInt(str2, 2);
            // System.out.println(b2);
            double x1 = -3.0 + b1 * (12.1 - (-3.0)) / (Math.pow(2, 18) - 1);
            // System.out.println(x1);
            double x2 = 4.1 + b2 * (5.8 - 4.1) / (Math.pow(2, 15) - 1);
            // System.out.println(x2);
            double fitness = 21.5 + x1 * Math.sin(4 * 3.1415926 * x1) + x2
              * Math.sin(20 * 3.1415926 * x2);
            //System.out.println("eval=f(" + x1 + "," + x2 + ")=" + fitness);
            return fitness;
           }
           
           String inialPop() { // 初始化10個字符串
            String res = "";
            for (int i = 0; i < 33; i++) {
             if (Math.random() > 0.5) {
              res += "0";
             } else {
              res += "1";
             }
           
            }
            return res;
           }
           
           String[] inialPops() {
            String[] ipop = new String[10];
            for (int i = 0; i < 10; i++) {
             ipop[i] = inialPop();
            }
            return ipop;
           
           }
           
           void select() {
            double evals[] = new double[10];// 所有染色體適應值
            double p[] = new double[10];// 各染色體選擇概率
            double q[] = new double[10];// 累計概率
            double F = 0;
            for (int i = 0; i < 10; i++) {
             evals[i] = calculatefitnessvalue(ipop[i]);
             if (bd == null) {
              bd = new bestindival();
              bd.fitness = evals[i];
              bd.generations = 0;
              bd.str = ipop[i];
             } else {
              if (evals[i] > bd.fitness)// 最好的記錄下來
              {
               bd.fitness = evals[i];
               bd.generations = gernation;
               bd.str = ipop[i];
              }
           
             }
             F = F + evals[i];// 所有染色體適應值總和
           
            }
            for (int i = 0; i < 10; i++) {
             p[i] = evals[i] / F;
             if (i == 0)
              q[i] = p[i];
             else {
              q[i] = q[i - 1] + p[i];
             }
            }
            for (int i = 0; i < 10; i++) {
           
             double r = Math.random();
             if (r <= q[0]) {
              ipop[i] = ipop[0];
           
             } else {
              for (int j = 1; j < 10; j++) {
               if (r < q[j]) {
                ipop[i] = ipop[j];
                break;
               }
              }
             }
            }
           
           }
           
           void cross() { // 交叉率為25%,平均為25%的染色體進行交叉
            String temp1, temp2;
            for (int i = 0; i < 10; i++) {
             if (Math.random() < 0.25) {
              double r = Math.random();
              int pos = (int) (Math.round(r * 1000)) % 33;
              if (pos == 0) {
               pos = 1;
              }
              temp1 = ipop[i].substring(0, pos)
                + ipop[(i + 1) % 10].substring(pos);
              temp2 = ipop[(i + 1) % 10].substring(0, pos)
                + ipop[i].substring(pos);
              ipop[i] = temp1;
              ipop[(i + 1) / 10] = temp2;
           
             }
           
            }
           }
           
           void mutation() {
            // 1%基因變異m*pop_size 共330個基因,為了使每個基因都相投機會發(fā)生變異,需要產(chǎn)生[1--330]上均勻分布的
            for (int i = 0; i < 4; i++) {
             int num = (int) (Math.random() * 330 + 1);
             int chromosomeNum = (int) (num / 33) + 1; // 染色體號
             int mutationNum = num - (chromosomeNum - 1) * 33; // 基因號
             if (mutationNum == 0)
              mutationNum = 1;
             //System.out.println(num + "," + chromosomeNum + "," + mutationNum);
             chromosomeNum = chromosomeNum - 1;
             if(chromosomeNum>=10)
              chromosomeNum=9;
             //System.out.println("變異前" + ipop[chromosomeNum]);
             String temp;
             if (ipop[chromosomeNum].charAt(mutationNum - 1) == '0') {
              if (mutationNum == 1) {
               temp = "1" + ipop[chromosomeNum].substring(mutationNum);
              } else {
               if (mutationNum != 33) {
                temp = ipop[chromosomeNum]
                  .substring(0, mutationNum - 1)
                  + "1"
                  + ipop[chromosomeNum].substring(mutationNum);
               } else {
                temp = ipop[chromosomeNum]
                  .substring(0, mutationNum - 1)
                  + "1";
               }
              }
             } else {
              if (mutationNum == 1) {
               temp = "0" + ipop[chromosomeNum].substring(mutationNum);
              } else {
               if (mutationNum != 33) {
                temp = ipop[chromosomeNum]
                  .substring(0, mutationNum - 1)
                  + "0"
                  + ipop[chromosomeNum].substring(mutationNum);
               } else {
                temp = ipop[chromosomeNum]
                  .substring(0, mutationNum - 1)
                  + "1";
               }
              }
           
             }
             ipop[chromosomeNum] = temp;
             //System.out.println("變異后" + ipop[chromosomeNum]);
           
            }
           
           }
           
           void process()
           {
            for(int i=0;i<1000000;i++)
            {
             select();
             cross();
             mutation();
             gernation=i;
             
            }
            System.out.println("最優(yōu)值"+bd.fitness+",代數(shù)"+bd.generations);
           }
           
           public static void main(String args[]) {
            JGA j = new JGA();
            // System.out.println(j.calculatefitnessvalue("000001010100101001101111011111110"));
            j.process();
           
           }
          }
           
          class bestindival { // 存儲最佳的
           public int generations;
           
           public String str;
           
           public double fitness;
           
          }
           

          litertiger
          2006-12-09
          posted on 2009-04-15 23:19 weesun一米陽光 閱讀(282) 評論(0)  編輯  收藏 所屬分類: JAVA源碼總結備用
          主站蜘蛛池模板: 华亭县| 诸暨市| 绥宁县| 丹棱县| 抚顺市| 滨海县| 上林县| 清远市| 邹城市| 长葛市| 南昌县| 江山市| 昆山市| 卢湾区| 呼玛县| 温宿县| 连平县| 乌兰察布市| 新津县| 日喀则市| 长岛县| 临西县| 湖南省| 积石山| 寿光市| 合江县| 凤山市| 集安市| 湖南省| 广汉市| 尉犁县| 天镇县| 石家庄市| 五华县| 万宁市| 金川县| 桃源县| 石首市| 舒城县| 余江县| 东至县|