首页 > 解决方案 > 如何在二进制字符串中执行遗传算法的利用?

问题描述

我有一个 32 位的二进制向量。这个向量代表我的解决方案空间中的一个整数。现在我想在这个向量中执行利用以在搜索空间中搜索。我了解到我必须在二进制字符串中的 LSB 周围翻转更多位才能执行利用。所以,我想生成一个指数分布和 mutate(flip )根据它的位。这将是一个可行的解决方案。?

此外,如果有人可以帮助编写代码,那将是一个很大的帮助。我很难编写这个逻辑。我试图做这样的事情:

double exploit_probs[32]={2.1760605535605863e-14,5.915145860370273e-14,1.6079033504929256e-13,4.3707344595633353e-13,1.1880888058450779e-12,3.229560211524282e-12,8.778854836900806e-12,2.3863401577827254e-11,6.486745087422874e-11,1.763280129698758e-10,4.793092335043042e-10,1.3028975796473835e-09,3.5416428150987542e-09,9.627183307175482e-09,2.6169397443139367e-08,7.113579753140834e-08,1.933671457825691e-07,5.256263986017488e-07,1.4288006878775044e-06,3.883882946347204e-06,1.0557488436917582e-05,2.869822897223955e-05,7.800987432419569e-05,0.00021205282381583498,0.0005764193376520116,0.001566870211111862,0.004259194822419162,0.011577691889648859,0.031471429479130154,0.08554821486874982,0.23254415793483257,0.6321205588285657};
int i=0;
for(int k=0;k<32;k++){
    if( (rand()/RAND_MAX) < exploit_probs[i++]){
        if(key[k]==0){  //key is the binary array.
            key[k]=1;
        }
        else{
            key[k]=0;
        }
    }
}

但是,我觉得上面的代码会有偏差,因为 rand()/RAND_MAX 会生成 0-1 之间的值。但是我的概率分布范围从 2.1760605535605863e-14 到 0.6321205588285657。所以我的位被翻转的可能性很小.最后一位有 63% 的机会被翻转。

标签: cprobabilitygenetic-algorithmprobability-distribution

解决方案


首先,您说您有字符串,但您正在为其分配一个整数。它应该像

if( (rand()/RAND_MAX) < exploit_probs[i++])
{
    if(key[k]==0){  //key is the binary array.
        key[k]= '1';
    }
    else{
        key[k]= '0';
    }
}

此外,突变在通用算法中很少见。实际变化来自交叉。所以他们有那么一点变异的机会是可以的。


推荐阅读