在编写基于栅格法人工鱼群算法用到的一些MATLAB知识储备
a(uint16(rand * (length(a) - 1) + 1))
其中:2 要在整个人工鱼区域内取出除障碍物以外的可行域,使用 stediff函数。
rand 生成一个[0, 1] 之间的随机实数。
length(a) - 1 是a的元素个数减去1。
rand * (length(a) - 1) + 1把这个随机数变为 [1, a的元素个数] 之间的随机实数。
uint16(...)把这个实数转化为无符号16位整数,当然你用int16或者uint32等等也行,总之必须满足数组下标是整数类型的要求。
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 在算法的测试阶段,发现仅仅执行觅食行为,会导致算法陷入局部最优解,状况如下:
在图中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函数还原
10 当前程序处理完后,可直接用cftool命令调出界面,拟合曲线
11