_Formerly 2021-11-08 22:25 采纳率: 0%
浏览 1870

MATLAB里报错:‘位置 1 处的索引超出数组边界(不能超出 1)。'怎么解决啊

img


这是遗传算法中的代码,报错部分已经用图片展示了,感谢。


figure(1);
fplot('x+8*sin(5*x)+5*cos(4*x)',[0,10]);

clear all;clc;
NP=50;
L=20

Pc=0.7;
Pm=0.2;
G=100;
Xs=10;
Xx=0;
f=randi([0,1],NP,L);
trace=zeros(1,G);
for k=1:G
    %解码
    for i = 1:NP
        U = f(i,:);
        m=0;
        for j = 1:L
            m=U(j)*2^(j-1)+m;
        end
        x(i)=Xx +m*(Xs-Xx)/(2^L-1);
        Fit(i) = func1(x(i));
    end
    maxFit=max(Fit);
    minFit=min(Fit);
    rr = find(Fit==maxFit);
    fBest = f(rr(1,1),:);
    xBest = x(rr(1,1));
    Fit = (Fit-minFit)/(maxFit-minFit);
    %复制操作
    sum_Fit = sum(Fit);
    fitvalue = Fit./sum_Fit;
    fitvalue = cumsum(fitvalue);
    ms=sort(rand(NP,1))
    fiti = 1;
    newi = 1;
    while newi <=NP
        if(ms(newi)<fitvalue(fiti))
            nf(newi,:)=fitvalue(fiti);
            newi=newi+i;
        else
            fiti = fiti +1;
        end
    end
    %基于概率的交叉操作
    for i =1:2:NP
        p=rand;
        if p<Pc
            q = randi([0,1],1,L);
            for j =1:L
                if q(j)==1
                    temp = nf(i + 1, j);
                    nf(i+1,j)=nf(i.j);
                    nf(i,j)=temp;
                end
            end
        end
    end
   
    %基于概率的变异操作
    i=1;
    while i <= round(NP*Pm)
        h = randi([1,NP],1,1);
        for j = 1:round(L*Pm)
            g=randi([1,L],1,1);
            nf(h,g) = ~nf(h,g);
        end
        i=i+1;
    end
    f=nf;
    f(1,:)=fBest;
    trace(k)=maxFit;
end
disp('最优解')
disp(xBest)
figure(2)
plot(trace)
xlabel('迭代次数')
ylabel('目标函数值')
title('适应度进化曲线')
function fit = func1(x)
fit = x+8 *sin(5*x) + 5*cos(x);
end
                    
        
  • 写回答

1条回答 默认 最新

  • 技术专家团-Joel 2021-11-08 22:34
    关注

    你这段48~60行

        for i =1:2:NP
            p=rand;
            if p<Pc
                q = randi([0,1],1,L);
                for j =1:L
                    if q(j)==1
                        temp = nf(i + 1, j);
                        nf(i+1,j)=nf(i.j);
                        nf(i,j)=temp;
                    end
                end
            end
        end
    

    中的

    for i =1:2:NP
    

    改成

    for i =1:2:NP-1
    

    即可

    评论

报告相同问题?

问题事件

  • 创建了问题 11月8日

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题