问题标题 遗传算法计算味源位置代码(java语言) 期望金额500金币 已托管0金币 提问人:尹*华 提问时间:2019-05-07
问题详情 基于机器嗅觉,利用遗传算法,计算出气味源大概位置,代码最好用java写
特别要求
其他设置 期望完成时间:2019-05-14
管理员补充 收藏 我来回答
以下部分为回答内容,共1个回答
1楼

3)轮盘选择

基本思想:个体被选中的概率与其适应度值成正比,即按由个体适应度值所决定的某个规则选择将进入下一代的个体。(详细解析

Java实现代码:

?

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

35

36

37

38

39

40

41

42

/**

 * 轮盘选择

 * 计算群体上每个个体的适应度值;

 * 按由个体适应度值所决定的某个规则选择将进入下一代的个体;

 */

private void select() {

    double evals[] = new double[ChrNum]; // 所有染色体适应值

    double p[] = new double[ChrNum]; // 各染色体选择概率

    double q[] = new double[ChrNum]; // 累计概率

    double F = 0; // 累计适应值总和

    for (int i = 0; i < ChrNum; i++) {

        evals[i]   = calculatefitnessvalue(ipop[i])[2];

        if (evals[i] < bestfitness){  // 记录下种群中的最小值,即最优解

            bestfitness   = evals[i];

            bestgenerations   = generation;

            beststr   = ipop[i];

        }

 

        F   = F + evals[i]; // 所有染色体适应值总和

    }

 

    for (int i = 0; i < ChrNum; 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 < ChrNum; i++) {

        double r = Math.random();

        if (r <= q[0]) {

            ipop[i]   = ipop[0];

        }   else {

            for (int j = 1; j < ChrNum; j++) {

                if (r < q[j]) {

                    ipop[i]   = ipop[j];

                }

            }

        }

    }

}

4)组合交叉(杂交)

单点杂交:设定杂交概率与杂交个体,按照断裂点进行染色体杂交

示例:
  杂交前:a=<0101|0000>, b=<0111|1111>
  杂交后:a=<0101|1111>, b=<0111|0000>

Java实现代码:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

/**

 * 交叉操作 交叉率为60%,平均为60%的染色体进行交叉

 */

private void cross() {

    String   temp1, temp2;

    for (int i = 0; i < ChrNum; i++) {

        if (Math.random() < 0.60) {

            int pos = (int)(Math.random()*GENE)+1;     //pos位点前后二进制串交叉

            temp1   = ipop[i].substring(0, pos) + ipop[(i + 1) % ChrNum].substring(pos);

            temp2   = ipop[(i + 1) % ChrNum].substring(0, pos) + ipop[i].substring(pos);

            ipop[i]   = temp1;

            ipop[(i   + 1) / ChrNum] = temp2;

        }

    }

}


...展开更多
......此处隐藏剩余部分14字,需支付500金币方可查看...... 购买回答