我想实现最大化n个整数变量x1..xn函数的遗传算法,其中每个变量属于范围[-n,n]。我正在考虑使用二进制编码来表示染色体,但我不确定如何编码负整数。我已经搜索了相当长的一段时间,但我还没有遇到二进制编码的通用公式。 对遗传算法的范围[-n,n]中的整数进行编码的最常用方法是什么? 我希望交叉和变异的复杂度较低(条件检查较少)。如果对于初始群体,它会起作用,而不是生成-n和n之间的数字,我生成0到2n的数字并将它们编码为二进制,然后在解码时每次(每隔一代)减去n?遗传算法二进制编码负整数
-1
A
回答
2
user1765444的回答很有意义......我刚刚读了sashkello的建议(使用偏移二进制将消除与GA内签名的int进行绑定)。做交叉和变异等等会很容易 - 使用shashkello's和user1765444的答案组合。问题是如果你的数据类型的宽度大于你的范围,那么交叉会产生无效的孩子。
假设一个int32具有您需要的宽度。然后int32数组[n]。你知道有32n位,所以你可以随机取一个交叉点m,其中m> = 0和m为32n。你知道位m在数组[m/n]中出现,位置m%n从msb开始(想象数组只是一个长二进制串)。
然后说你有2个父母int32 parent1 [n]和int32 parent2 [n]。像下面的伪代码一样?在这个交叉的字符串只是一个二进制字符串为交叉(即符号位被视为只是另一位)...
免责声明:对不起,以下代码是粗略的准备,未编译,所以可能包含错误... 只是一个想法!
int child1[n];
uint32 m = rand_like_func(); // random cross over point, a bit position
// in the binary string of length n*32;
uint32 arraySlotForCrossOvr = (uint32)(m/n);
uint32 bitInSlotForCrossOvr = 31 - m % n;
uint32 maskForCrossOvrP2 = (1 << bitInSlotForCrossOvr) - 1;
uint32 maskForCrossOvrP1 = ~maskForCrossOvrP2;
// crossover to create child 1
memcpy(child1, parent1, arraySlotForCrossOvr);
child1[arraySlotForCrossOvr] =
(int32)(((uint32)parent1[arraySlotForCrossOvr] & maskForCrossOverP1) |
((uint32)parent2[arraySlotForCrossOvr] & maskForCrossOvrP2))
memcpy(
child1,
parent2 + arraySlotForCrossOvr + 1,
total_num_slots - arraySlotForCrossOvr);
那么你可能检测到超出范儿,还是让范儿了刚刚进球零下一轮。也许你可以用一些智能来增加交叉,比如将无效值加上最近的有效值等等。
希望有帮助吗?
另外,我发现“如何解决这个问题:由Z. Michalewicz和d福格尔现代启发式”试图了解的问题等等:)
相关问题
- 1. 遗传算法编码
- 2. 二进制负整数
- 3. 二进制乘法 - 负数X负数
- 4. 使用二进制补码的负整数的Perl函数
- 5. 64位二进制补码形式的负整数
- 6. 以二进制补码表示格式负整数
- 7. 二进制编码+传输安全(WCF)
- 8. 的遗传算法
- 9. 遗传算法库
- 10. DEAP遗传算法
- 11. 一个二进制字符串上的突变(遗传算法)-python-3.x
- 12. 获得负数的二进制补码的十六进制
- 13. 负数十进制到二进制c代码
- 14. 将二进制编码的十进制(BCD)解码为无符号整数
- 15. 二进制补码算术
- 16. 遗传算法和细胞遗传算法有什么区别
- 17. 遗传算法的选择机制
- 18. BlobBuilder遗址二进制数据
- 19. 长整数的二进制补码
- 20. 使用遗传编程/算法改进哈希
- 21. java将二维数组作为遗传算法中的对象
- 22. 遗传算法的概率分布编码
- 23. JSON的二进制编码?
- 24. Matlab二进制编码
- 25. JSON二进制编码
- 26. 如何将一个负整数转换为二进制补码二进制形式? (Java)
- 27. 使用波纹管算法将二进制整数转换为十进制
- 28. 仅使用唯一整数的Matlab遗传算法(GA)
- 29. 要使用遗传算法
- 30. 遗传算法问题
不知道这会有所帮助,但你可以存储编码时真的很有帮助二进制补码形式的数字 – jg943 2013-04-22 22:45:39
编码[-n,n]和[0,2n]之间的区别是什么?我想这不应该是...... – sashkello 2013-04-22 22:53:00
C会为你做字节编码,我期望。 – flup 2013-04-22 23:11:38