在编写基于栅格法人工鱼群算法用到的一些MATLAB知识储备

1    在向量a中,随机取出一个整数元素:
                            a(uint16(rand * (length(a) - 1) + 1))

其中:
rand 生成一个[0, 1] 之间的随机实数。
length(a) - 1 是a的元素个数减去1。
rand * (length(a) - 1) + 1把这个随机数变为 [1, a的元素个数] 之间的随机实数。
uint16(...)把这个实数转化为无符号16位整数,当然你用int16或者uint32等等也行,总之必须满足数组下标是整数类型的要求。
2    要在整个人工鱼区域内取出除障碍物以外的可行域,使用 stediff函数。
            allow = setdiff(1:1:n^2,Barrier);   

算法描述如下:
for i = 1:1:length(allow)
    if distance(n,ppValue,allow(i)) <=rightInf && 0 < distance(ppValue,allow(i))
        allow_area(j) = allow(i);
        j = j+1;
    end

end

%distance是为了求解距离是否在(0,sqrt(2)]之间。

3    tic---toc放在程序的开始和结束,可以显示运行程序的时间。

4    取得栅格地图中的障碍物集合

            Barrier = (find(a==0))';%Barrier转换成行向量。

5    在算法的测试阶段,发现仅仅执行觅食行为,会导致算法陷入局部最优解,状况如下:

在编写基于栅格法人工鱼群算法用到的一些MATLAB知识储备

在图中230 ,208处,出现跳跃,是应为,陷入局部最优解。解释如下:

(12,10)----230,d1

(11, 8)-----208,d2

di (i=1,2,...),为当前位置到Goal位置的欧氏距离。

d1 = sqrt((12-20)^2+(10-0)^2) = sqrt(164);

d2 = sqrt((11-20)^2+(8-0)^2) = sqrt(145);

d2<d1,所以d2优于d1,即208,比230更加接近goal,在欧式距离上。

而230的可行域只有,210,和211,他们们到goal的距离都大于208都不是最优解,所以算法在此处陷入局部最优解。

在加入追尾和群居算法后,可改善这个问题的出现。

6    在群聚和追尾行为中,要求附近鱼群的中心点Xc,因为在栅格中处理不存在小数,所以要取整化

使用如下函数:

floor、ceil、round、fix
floor:朝负无穷方向靠近最近的整数;


ceil:朝正无穷方向靠近最近的整数;


round:取最近的整数(相当于四舍五入


fix:取离0最近的整数

7    Matlab有for ,while两种循环方式但是区别很大,

            for i = .....

                %修改i的值;

            end

运行结果,在循环中i的值是不会受影响的

            %初始化i

            while i<...

                %修改i的值

            end

运行结果,i的值会直接被修改。

8    Matlab中找出两个矩阵公共元素

            intersect

            a = [ 4 3 6 8 0 1];

            b = [ 1 2 3 5 7 0 9 10];

            [c,ia,ib] = intersect(a,b)

运行结果:

            c =
                 0     1     3
            ia =
                 5
                 6
                 2
            ib =
                 6
                 1

                 3

9    在MATLAB中使用[c,ia,ib] = intersect(a,b)函数获得两个矩阵的公共部分时,ib中的顺序不在保持原样了,被重新排列了,要注意。可以通过sort函数还原

在编写基于栅格法人工鱼群算法用到的一些MATLAB知识储备

10    当前程序处理完后,可直接用cftool命令调出界面,拟合曲线

11