为遗传算法分配和检索按位内存值

Posted

技术标签:

【中文标题】为遗传算法分配和检索按位内存值【英文标题】:Assigning and retrieving bit-wise memory value for Genetic Algo 【发布时间】:2012-01-07 22:05:13 【问题描述】:

我在为 GA/GP 开发一个类时遇到了这段代码,但未能理解它,因此无法调试程序。

typedef struct 
    void *dataPointer;
    int length;
 binary_data;

typedef struct 
    organism *organisms; //This must be malloc'ed
    int organismsCount;
    int (*fitnessTest)(organism org);
    int orgDnaLength;
    unsigned int desiredFitness;
    void (*progress)(unsigned int fitness);
 evolutionary_algorithm;

以上是直截了当的。然后我们尝试在测试它们的适应性等之前启动有机体......

int main(int argc, char *argv[])

    srand(time(NULL));
    int i;
    evolutionary_algorithm ea;
    ea.progress = progressDisplayer;
    ea.organismsCount = 50;
    ea.orgDnaLength = sizeof(unsigned int);

    organism *orgs =(organism *) malloc(sizeof(organism) * ea.organismsCount);
    for (i = 0; i < 50; i++)
    
        organism newOrg;
        binary_data newOrgDna;
        newOrgDna.dataPointer = malloc(sizeof(unsigned int));
        memset(newOrgDna.dataPointer, i, 1);
        newOrgDna.length = sizeof(unsigned int);
        newOrg.dna = newOrgDna;
        orgs[i] = newOrg;
    

据我了解,memset() 尝试将二进制值写入该内存位置 void 指针 (newOrgDna.dataPointer) 等等。但是我不知道如何重新组装所有这些二进制值以获得分配给 newOrg 变量“dna”的整数值,以便我检查分配给单个生物体的整数值,并最终检查整个内存位置中的整个种群被分配到“组织”。

正如您从上面猜测的那样,我对这种深层次细节的内存管理不是很熟悉,因此非常感谢您的帮助。

非常感谢

【问题讨论】:

9 个问题,0 个被接受。如果您希望人们继续回答您的问题,请接受一些答案。 当然我会尝试回答一些问题,因为我的编程技能相当有限,但会尽力而为。有没有办法找到过滤中级问题。 蝉让您确认(通过本网站的接受方式)您的问题的答案是好的。 该代码来自哪里?大多数主要的 GA 框架(我确认 ECJ 和 OpenBEAGLE)都提供了将个体的二进制值转换为 int/float 的方法(如果语言没有)。 【参考方案1】:

这段代码看起来有点奇怪。这一行:

newOrgDna.dataPointer = malloc(sizeof(unsigned int));

可能会分配 4 个字节(或 64 位机器上的 8 个字节)。奇怪的是,下面一行中的memset 只会设置第一个字节。

要获得实际价值,您可能会这样做:

char val = *((char*) newOrgDna.dataPointer);

但是,正如我所说,这段代码看起来有点不对劲。我将其重写为:

for (i = 0; i < 50; i++)

    organism newOrg;
    binary_data newOrgDna;
    unsigned int * data =  (unsigned int*) malloc(sizeof(unsigned int));
    *data = i;
    newOrgDna.length = sizeof(*data);
    newOrgDna.data = (void*) data; // I think that cast can be dropped
    newOrg.dna = newOrgDna;
    orgs[i] = newOrg;

那么你可以在任何你想从organism *获取数据的地方:

void f( organism * o )

    assert( sizeof(unsigned int) == o->dna.length );
    unsigned int data = *((unsigned int*) o->dna.data);

这也是一个 C 问题而不是 C++。

【讨论】:

非常感谢,这非常有用。再次感谢 我已经对您的建议进行了试验,并将其修改为 newOrgDna.dataPointer =malloc(sizeof(int));memset((void*)newOrgDna.dataPointer, i, sizeof(int));这似乎给出了相同的结果,但无法使用以下方法检索 dataPointer 持有的基础整数: int c=*(int*)((newOrgDna.dataPointer));我在这里做错了什么?再次感谢您的所有帮助。 读取memset 的规范(注意int 至少有几个字节,并且memset 将这些字节中的每个 设置为值i)。在这里停止使用它,因为你不需要它。

以上是关于为遗传算法分配和检索按位内存值的主要内容,如果未能解决你的问题,请参考以下文章

遗传算法:特征选择算法的适应度函数

优化调度基于matlab遗传和模拟退火算法求解码头泊位分配调度优化问题含Matlab源码 247期

优化分配基于matlab遗传算法求解医疗资源分配优化问题含Matlab源码 1419期

PSO算法、蚁群算法和遗传算法matlab求解函数最值问题,程序怎么编写?

遗传算法

路径规划遗传算法求解考虑分配次序的多无人机协同目标分配问题