在写自动化立体仓库库位分配遗传算法的毕设,想问问大家,在生成了初始种群后,怎样保证基因没有重复的呢
(1) 最高层:它是分析问题的预定目标或理想结果。
(2) 中间层:它包括为实现目标所涉及的中间环节,它也可以由若干个层次组成。
(3) 最低层:它是为实现目标而供选择的各种措施、决策方案。但是,每层包含的因素
个数不要超过9 个,过多的话,可考虑再分出层次来。
问题解答:
目前我对Matlab遗传算法的具体实现并不熟悉,但根据你的描述,你需要保证每个基因都是唯一的,也就是要避免矩阵中有重复行的问题。我可以提供一些可能有用的思路和方法:
直接去重法:遍历每个基因,检查是否和前面的已有的基因重复,如果有重复就进行删除,这种方法在矩阵行数较少的情况下可行,但是如果矩阵行数很多的话,效率会比较低。
hash表法:将每个基因转换为一个字符串,通过哈希函数将字符串映射到一个大小合适的哈希表中,并根据哈希表中是否有字符串来检查是否有重复的基因。这种方法效率较高,但需要实现自己的哈希函数和哈希表,考虑到你的要求,这种方法可能是最适合的。
先排序再去重法:将矩阵中的所有基因排序,然后比较相邻的两个基因,对于重复的基因直接进行删除。这种方法效率较高,但需要对每个基因进行排序,可能需要引入额外的数据结构。
根据你的情况,我建议你尝试使用hash表法。具体实现步骤如下:
将每个基因转换为一个字符串,比如可以将一个基因数组中的每一个元素拼接起来,中间加上分隔符来形成一个字符串。
实现哈希函数,将每个字符串映射到一个合适大小的哈希表中。可以使用相对简单的取模哈希或者更复杂的一些哈希算法。
遍历每个基因的字符串表示,并将它们插入到哈希表中。如果哈希表中已经存在相同的字符串,就表明这个基因是重复的,需要进行删除。
根据哈希表中的信息来生成一个新的矩阵,新矩阵中不包含重复的行。
下面是一个简单的Matlab代码示例,可能需要根据实际情况进行修改:
% 定义一个结构体来表示哈希表
hash_table = struct('key',{}, 'value', {});
% 遍历每个基因
for i = 1:size(population, 1)
% 将基因转换为一个字符串
gene_str = strjoin(string(population(i,:)), ',');
% 计算字符串的哈希值
hash_value = mod(sum(double(gene_str)), table_size);
% 查找哈希表中是否已经有相同的字符串
found = false;
for j = 1:length(hash_table)
if strcmp(hash_table(j).key, gene_str)
found = true;
break;
end
end
% 如果没有找到相同的字符串,就插入到哈希表中
if ~found
hash_table(end+1).key = gene_str;
hash_table(end).value = population(i,:);
end
end
% 将哈希表中的基因重新组成一个矩阵
new_population = [];
for i = 1:length(hash_table)
new_population(end+1,:) = hash_table(i).value;
end
希望这些信息对你有所帮助!