2

我目前正在编写遗传算法来解决一个可能被认为类似于背包问题的问题,但区别因素是我将物品存储在多辆“卡车”上,它们的价值/重要性基于 1 = 最重要, 3 = 最不重要。

我如何做到这一点是使用二进制整数数组,0 = 不在卡车上,1 = 在卡车上。

在大多数情况下,该程序似乎正在做它需要做的事情。除非我比较染色体以找到每一代最好的三个单独的染色体。个体是没有染色体可以包含相同的项目,因为该项目一次只能在一辆卡车上。

这是我用来比较染色体的函数:

    private int[] getBestSolution(int count)
    {
        int[] Genes = new int[3];
        int min1 = Global.p.population[0].fitness;
        int min2 = Global.p.population[0].fitness;
        int min3 = Global.p.population[0].fitness;
        int ref1 = 0;
        int ref2 = 0;
        int ref3 = 0;
        bool areSame = true;

        //searches for the first "Fittest" chromosome and stores to ref1
        for (int i = 0; i < Global.population; i++)
        {
                if (min1 > Global.p.population[i].fitness)
                {
                    min1 = Global.p.population[i].fitness;
                    ref1 = i;
                }
        }

        //searches for 2nd fittest, while also checking they are different
        for (int i = 0; i < Global.population; i++)
        {
            areSame = arrayCompare(Global.p.population[ref1].chromosome, Global.p.population[i].chromosome);
            if(areSame == true)
            {
                continue;
            }
            if (min2 > Global.p.population[i].fitness)
            {
                min2 = Global.p.population[i].fitness;
                ref2 = i;
            }
        }

        //Searches for 3rd fittest while checking that it is different from the first two
        for (int i = 0; i < Global.population; i++)
        {
            areSame = arrayCompare(Global.p.population[ref1].chromosome, Global.p.population[i].chromosome);
            if (areSame == true)
            {
                continue;
            }
            areSame = arrayCompare(Global.p.population[ref2].chromosome, Global.p.population[i].chromosome);
            if(areSame == true)
            {
                continue;
            }
            if (min3 > Global.p.population[i].fitness)
            {
                min3 = Global.p.population[i].fitness;
                ref3 = i;
            }
        }
        //stores the reference of each chromosome and return
        Genes[0] = ref1;
        Genes[1] = ref2;
        Genes[2] = ref3;
        return Genes;
    }

这是我用来将染色体与先前选择的染色体进行比较的函数,以确保它们不包含相同的值。

    public bool arrayCompare(int[] a, int[] b)
    {
        for (int i = 0; i < a.Length; i++)
        {
            if ((a[i] == 1) && b[i] == 1)
            {
                return true;
            }
        }
        return false;
    }

我通过在代码的不同点使用断点并检查值与预期值将其缩小到导致问题的这两个函数。

最后,到问题本身。getBestSolution() 完美地产生了第一个“最适合”的值。第二个和第三个值保持为它们被初始化为“population[0].fitness”的值并显示出来。

我试图改变育种结构,即育种的选择标准,因为我相信如果没有包含不同值的染色体,它将保持初始化状态。出于同样的原因,我还使用更大的人群进行了测试,所以我相信他们一定是我的代码有问题。

任何帮助深表感谢。

4

1 回答 1

0

1. 关于您的代码的注释。

min1您应该将,min2和,初始化min3为一个高于适应度最大值的值,因为在这种情况下Global.p.population[0].fitness是群体中最好的适应度,您永远不会找到第二和第三最好的值,因为在这种情况下,没有人会拥有适合度低于Global.p.population[0].fitness.

2. 关于你正在使用的基因的概率。

我可能错了,但这是我对您描述的问题的理论。

在随机分布中,对于 1 个基因,两个个体的基因值总共有 4 种可能的组合。在这 4 种组合中,有 3 种两个个体没有共同点,该基因设置为1

               Individual 1    Individual 2   Match criterion    Probability
Combination 1:      0               0               Yes            25% | 
Combination 2:      0               1               Yes            25% | 75%
Combination 3:      1               0               Yes            25% |
Combination 4:      1               1               No             25%

这意味着对于只有一个基因的个体,您有 75% 的机会找到符合标准的两个个体。换句话说,如果你比较 100 个个体的基因,你会发现平均有 75 对符合标准的个体。但是会有一些你找不到他们的人群,以及你会找到他们的大部分人群。

随着基因数量的增加,百分比下降。每次向染色体添加 1 个基因时,您必须将匹配标准的个体百分比乘以 75/100。每次添加 2 个基因时,必须将百分比乘以 56,25/100。

Number of genes         percentage of individuals matching the criterion
      1                                75,00%
      2                                56,25% = 75,00 * 75,00 / 100

      4                                31,64% = 56,25 * 56,25 / 100

      6                                17,79% = 31,64 * 56,25 / 100

      8                                10,01% = 17,79 * 56,25 / 100

    [...]

     16                                 1%

这意味着对于 16 个基因的染色体和 100 个人口,您将平均找到 1 对符合标准的个体。如果您想要 3 个符合条件的人,则该百分比甚至更小。对于 6 个基因,找到这 3 个个体的概率应该在 1.5% 左右。

所以问题是,在一个群体中,没有足够多的个体对符合标准。

3. 设计算法的另一种方式。

在您的算法中,您似乎将个人视为卡车。我会以另一种方式设计算法。

我会考虑一个基因作为一个项目的卡车号码,如果需要,0表明该项目没有指定的卡车:

gene[0] = 1 (item 0 is in truck 1)
gene[1] = 0 (item 1 is not in any truck) 
gene[2] = 3 (item 2 is in truck 3)
gene[3] = 2 (item 3 is in truck 2)
gene[4] = 1 (item 4 is in truck 1)

通过这种信息编码,第二和第三好的个人可以比最好的人在同一辆卡车上拥有一件物品。例如:

first best individual:
----------------------
truck1: item1 item2
truck2: item3 item4
truck3: item5 item6 item7
not in any truck: item0

second best individual:
-----------------------
truck1: item1 item3
truck2: item2 item5
truck3: item4 item6
not in any truck: item0 item7

在此示例中,item1 始终位于卡车 1 中,而 item6 始终位于卡车 3 中。

所以可以不用比较基因,只检查适应度,就可以选出第二和第三好的个体。

于 2016-11-05T07:19:25.593 回答