function newPop = selection(pop, fit, crowd) nPop = size(pop, 1); nParent = round(nPop / 2); [~, idx] = sort(fit); parent = idx(1:nParent); [~, idx] = sort(crowd); parent = intersect(parent, idx(1:nParent)); newPop = pop(parent,:); end 假设pop为100,如何让返回的值也为100的矩阵
时间: 2023-06-12 13:04:11 浏览: 150
在这个函数中,返回的矩阵大小取决于选择的父代数量,即nParent。在这里,nParent被设置为nPop / 2,因此返回的矩阵大小将为nPop / 2。要返回一个大小为100的矩阵,可以将nParent设置为50,如下所示:
```
function newPop = selection(pop, fit, crowd)
nPop = size(pop, 1);
nParent = 50;
[~, idx] = sort(fit);
parent = idx(1:nParent);
[~, idx] = sort(crowd);
parent = intersect(parent, idx(1:nParent));
newPop = pop(parent,:);
end
```
在这个修改后的函数中,我们将nParent设置为50,这样函数将返回一个大小为100的矩阵。
相关问题
pop为100×36的矩阵,npop数值是100;function newPop = crossover(pop, nPop, pCross) newPop = pop; for i = 1:2:nPop if rand < pCross i1 = randi(nPop); i2 = randi(nPop); c = randi(size(pop,2)-1)+1; newPop(i,:) = [pop(i1,1:c), pop(i2,c:end)]; newPop(i+1,:) = [pop(i2,1:c), pop(i1,c:end)]; end end end这个代码哪里错了,怎么修改
这个代码有几个错误:
1. 在定义变量 `c` 时,`1` 应该是 `+`,表示将 c 后面的部分连接在 i1 的前面,即 `c+1`。
2. 在交叉时,应该是 `i+1` 而非 `i 1`,即将第二个子代索引改为 `i+1`。
下面是修改后的代码:
```
function newPop = crossover(pop, nPop, pCross)
newPop = pop;
for i = 1:2:nPop
if rand < pCross
i1 = randi(nPop);
i2 = randi(nPop);
c = randi(size(pop,2)-1) + 1;
newPop(i,:) = [pop(i1,1:c), pop(i2,c:end)];
newPop(i+1,:) = [pop(i2,1:c), pop(i1,c:end)];
end
end
end
```
pop为100×36的矩阵,npop数值是100,pCross数值是0.8;function newPop = crossover(pop, nPop, pCross) newPop = pop; for i = 1:2:nPop if rand < pCross i1 = randi(nPop); i2 = randi(nPop); c = randi(size(pop,2)-1)+1; newPop(i,:) = [pop(i1,1:c), pop(i2,c:end)]; newPop(i+1,:) = [pop(i2,1:c), pop(i1,c:end)]; end end end 系统报错说newPop(i,:) = [pop(i1,1:c), pop(i2,c:end)];的左侧索引与右侧的大小不兼容
这个错误是因为左侧的索引 `[i, :]` 所指定的大小与右侧的大小不兼容。具体来说,可能是由于 `pop(i1, 1:c)` 或 `pop(i2, c:end)` 的大小与 `pop(i, :)` 的大小不一致导致的。
你可以在运行代码时,打印出相应变量的大小,以便于调试。同时,你也可以尝试修改赋值语句,使得左右两侧的大小一致。
阅读全文