查看: 7375|回复: 12|关注: 0

[已解决] 位置 1 处的索引超出数组边界(不能超出 1)。

[复制链接]

新手

9 麦片

财富积分


050


1

主题

6

帖子

1

最佳答案
本帖最后由 小井z 于 2020-3-22 21:37 编辑

for i=1:sizepop                                %sizepop为20
    pop(i,:)=round(rand(1,10)*10);     %初始粒子
    pop(:,1)=Sx;pop(:,10)=Fx;            %Sx=1,Fx=10只是数值,不用在意
    V(i,:)=rands(1,10);                       %初始速度
     fitness(i)=fun1(pop(i,:));              %适应度函数,这边fun1计算出来是1*20的20组欧氏距离
end
[bestfitness,bestindex]=min(fitness);
pbest=pop;                                %个体最优
gbest=pop(bestindex,:);              %群体最优
fitnesspbest=fitness;                   %个体最优适应度值
fitnessgbest=bestfitness;             %群体最优适应度值
for i=1:maxgen
    for j=1:sizepop                  %速度更新
        V(j,:)=V(j,:)+c1*rand*(pbest(j,:)-pop(j,:))+c2*rand*(gbest-pop(j,:));
...
运行到V(j,:)这行时提示说
位置 1 处的索引超出数组边界(不能超出 1)。
出错 LuJingGuiHua (line 42)
        V(j,:)=V(j,:)+c1*rand*(pbest(j,:)-pop(j,:))+c2*rand*(gbest-pop(j,:));
%在这纠结好久了,大哥们帮帮

回复主题 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


1

主题

6

帖子

1

最佳答案
 楼主| 发表于 2020-3-26 10:52:01 | 显示全部楼层 |此回复为最佳答案
for j=1:sizepop
         if fitness(j)<fitnesspbest    %个体最优更新
            pbest=pop(j,:);
            fitnesspbest = fitness(j);
end
改为------------------------------
for j=1:sizepop
         if fitness(j)<fitnesspbest(j)    %个体最优更新
            pbest(j,:)=pop(j,:);
            fitnesspbest(j) = fitness(j);
end
即可解决
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

0

主题

2263

帖子

351

最佳答案
  • 关注者: 63
发表于 2020-3-23 10:47:48 | 显示全部楼层
pop(i,:)=round(rand(1,10)*10);
改为:
pop(i,:)=round(rand(1,20)*10);

V(i,:)=rands(1,10);  
改为:
V(i,:)=rands(1,20);  
1.仔细阅读论坛各版块置顶贴;2.该论坛旨在交流解惑,请粘贴出错代码;3.doc+'函数名'查看函数说明 ...
回复此楼 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


1

主题

6

帖子

1

最佳答案
 楼主| 发表于 2020-3-23 11:10:51 | 显示全部楼层
WarnerChang 发表于 2020-3-23 10:47
pop(i,=round(rand(1,10)*10);
改为:
pop(i,=round(rand(1,20)*10);

那个10是维数,我如果在命令行窗口单独逐个运行 V(1,:)=V(1,:)+c1*rand*(pbest(1,:)-pop(1,:))+c2*rand*(gbest-pop(1,:));     V(1,:)~ V(20,:)的话可以正常运行,但是运行脚本里的循环时就出现错误。
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

0

主题

2263

帖子

351

最佳答案
  • 关注者: 63
发表于 2020-3-23 11:56:54 | 显示全部楼层
本帖最后由 WarnerChang 于 2020-3-23 12:01 编辑
小井z 发表于 2020-3-23 11:10
那个10是维数,我如果在命令行窗口单独逐个运行 V(1,=V(1,+c1*rand*(pbest(1,-pop(1,)+c2*rand*( ...

噢噢,好吧,我看错了
1.仔细阅读论坛各版块置顶贴;2.该论坛旨在交流解惑,请粘贴出错代码;3.doc+'函数名'查看函数说明 ...
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

0

主题

2263

帖子

351

最佳答案
  • 关注者: 63
发表于 2020-3-23 12:03:22 | 显示全部楼层
本帖最后由 WarnerChang 于 2020-3-23 12:04 编辑
小井z 发表于 2020-3-23 11:10
那个10是维数,我如果在命令行窗口单独逐个运行 V(1,=V(1,+c1*rand*(pbest(1,-pop(1,)+c2*rand*( ...

就这样看,我好像没有看出什么错误哦!最好把完整代码上传一下呢!
也不知道你的rand是变量名,还是函数呢!如果是个变量的话,最好换一个名字呢
1.仔细阅读论坛各版块置顶贴;2.该论坛旨在交流解惑,请粘贴出错代码;3.doc+'函数名'查看函数说明 ...
回复此楼 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


1

主题

6

帖子

1

最佳答案
 楼主| 发表于 2020-3-23 17:44:41 | 显示全部楼层
WarnerChang 发表于 2020-3-23 12:03
就这样看,我好像没有看出什么错误哦!最好把完整代码上传一下呢!
也不知道你的rand是变量名,还是函数呢 ...

rand是随机生成一个0-1的数。完整代码后面发下
回复此楼 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


1

主题

6

帖子

1

最佳答案
 楼主| 发表于 2020-3-23 17:47:50 | 显示全部楼层
WarnerChang 发表于 2020-3-23 12:03
就这样看,我好像没有看出什么错误哦!最好把完整代码上传一下呢!
也不知道你的rand是变量名,还是函数呢 ...

%% 参数初始化
Sx=1;Sy=1;                    %起始点
Fx=10;Fy=10;                  %目的点
c1=2;c2=2;          %学习因子
maxgen=50;          %进化次数
sizepop=20;         %种群数量
Vmax=1;Vmin=-1;     %速度限制
x=1:1:10;
popmax=10;popmin=0; %变量限制
dim=10;             %维数
%% 初始粒子、速度、适应度函数
for i=1:sizepop
    pop(i,:)=round(rand(1,dim)*10);       %初始粒子,取整
    pop(:,1)=Sx;pop(:,10)=Fx;             %起始、终止位置
    V(i,:)=rands(1,dim);               %初始速度
     fitness(i)=fun1(pop(i,:));         %适应度函数
end
%% 个体最优、群体最优
[bestfitness,bestindex]=min(fitness);
pbest=pop;                           %个体最优
gbest=pop(bestindex,:);              %群体最优
fitnesspbest=fitness;                %个体最优适应度值
fitnessgbest=bestfitness;            %群体最优适应度值
%% 迭代寻优
for i=1:maxgen
    for j=1:sizepop                  %速度更新
        V(j,:)=V(j,:)+c1*rand*(pbest(j,:)-pop(j,:))+c2*rand*(gbest-pop(j,:));
        V(j,find(V(j,:)>Vmax))=Vmax;
        V(j,find(V(j,:)<Vmin))=Vmin;
        
        pop(j,:)=pop(j,:)+round(V(j,:));     %种群更新,取整
        pop(j,find(pop(j,:)>popmax))=popmax;
        pop(j,find(pop(j,:)<popmin))=popmin;
              
        fitness(j)=fun1(pop(j,:));     %适应度更新
    end
   
    for j=1:sizepop
        if fitness(j)<fitnesspbest    %个体最优更新
           pbest=pop(j,:);
           fitnesspbest = fitness(j);
        end
        if fitness(j)<fitnessgbest    %群体最优更新
           gbest=pop(j,:);
           fitnessgbest = fitness(j);
        end
    end        
end
----------------------------------------------------
function f=fun1(y)
%该函数用于计算粒子适应度值
%    input   输入粒子
%    output  粒子适应度
a=ones(10);
a(2,3:4)=0;a(3,3:4)=0;a(4,3:4)=0;
a(4,7:8)=0;a(5,7:8)=0;a(6,3:5)=0;
a(7,3:5)=0;a(7,8:9)=0;a(8,8:9)=0;a(9,8:9)=0;
f=0;
for i=1:9
    dy=y(i+1)-y(i);
    d=1+dy.^2;
    f=f+sqrt(d);
end
for j=1:10
    Y=y(j);
    for k=1:10
        if a(k,j)==0&Y==k
           f=100*f;
        end
    end   
end
end
--------------------
刚试了下,V(1,:)迭代能运行,V(2,:)就超出索引了,麻烦你了
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

0

主题

2263

帖子

351

最佳答案
  • 关注者: 63
发表于 2020-3-23 19:00:33 | 显示全部楼层
小井z 发表于 2020-3-23 17:47
%% 参数初始化
Sx=1;Sy=1;                    %起始点
Fx=10;Fy=10;                  %目的点

我在你出错的那一行设置了断点,步进运行很久没有发现出错,但是一取消断点运行,就出错了,我还真找不出错误在哪块
1.仔细阅读论坛各版块置顶贴;2.该论坛旨在交流解惑,请粘贴出错代码;3.doc+'函数名'查看函数说明 ...
回复此楼 已获打赏: 0 积分

举报

新手

9 麦片

财富积分


050


1

主题

6

帖子

1

最佳答案
 楼主| 发表于 2020-3-23 19:39:51 | 显示全部楼层
WarnerChang 发表于 2020-3-23 19:00
我在你出错的那一行设置了断点,步进运行很久没有发现出错,但是一取消断点运行,就出错了,我还真找不出 ...

好吧  不过也很感谢!我自己在多看看,你如果有什么发现的话麻烦到时候留个言:lol,我如果解决了也会发在本贴
回复此楼 已获打赏: 0 积分

举报

论坛优秀回答者

0

主题

2263

帖子

351

最佳答案
  • 关注者: 63
发表于 2020-3-23 19:40:29 | 显示全部楼层
小井z 发表于 2020-3-23 19:39
好吧  不过也很感谢!我自己在多看看,你如果有什么发现的话麻烦到时候留个言,我如果解决了也会发在 ...

好的,真是不好意思,没能帮到你
1.仔细阅读论坛各版块置顶贴;2.该论坛旨在交流解惑,请粘贴出错代码;3.doc+'函数名'查看函数说明 ...
回复此楼 已获打赏: 0 积分

举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

快速回复 返回顶部 返回列表