% 设置元胞自动机的大小
width = 100;
height = 100;
% 初始化状态矩阵,0表示空,1表示鱼,2表示水草
state = zeros(height, width);
% 随机初始化一些鱼和水草
fish_num = round(width*height*0.1);
grass_num = round(width*height*0.3);
fish_pos = randperm(width*height, fish_num);
grass_pos = randperm(width*height, grass_num);
state(fish_pos) = 1;
state(grass_pos) = 2;
% 开始迭代
for t = 1:100
% 显示当前状态矩阵
imagesc(state, [0 2]);
colormap(gca, [1 1 1; 0 1 0; 0 0 1]);
axis equal off;
drawnow;
% 随机更新每个元胞的状态
for i = 1:height
for j = 1:width
% 如果当前是空位,则随机生长水草或未出生的鱼
if state(i,j) == 0
if rand < 0.1 % 10%的概率生长水草
state(i,j) = 2;
elseif rand < 0.05 % 5%的概率出生鱼
neighbors = state(max(i-1,1):min(i+1,height), max(j-1,1):min(j+1,width));
if any(neighbors(:) == 1) % 如果周围有鱼,则出生失败
continue;
end
state(i,j) = 1;
end
% 如果当前是鱼,则根据周围状态决定会不会移动
elseif state(i,j) == 1
neighbors = state(max(i-1,1):min(i+1,height), max(j-1,1):min(j+1,width));
empty_idx = find(neighbors(:) == 0); % 找到周围的空位
if ~isempty(empty_idx) && rand < 0.8 % 80%的概率移动到周围的空位
new_pos = empty_idx(randi(length(empty_idx)));
[new_i, new_j] = ind2sub([3 3], new_pos);
state(i,j) = 0;
state(i-2+new_i, j-2+new_j) = 1;
end
% 如果当前是水草,则有一定概率枯萎消失
else
if rand < 0.05
state(i,j) = 0;
end
end
end
end
end
首先,我们定义了元胞自动机的大小,使用大小为`(height, width)`的状态矩阵`state`来表示每个元胞的状态。然后,通过随机生成一些鱼和水草来初始化状态矩阵。
接着,我们迭代了100个时间步,对于每个时间步,我们显示了当前的状态矩阵。随后,我们随机更新每个元胞的状态,先处理空位,随机生长水草或未出生的鱼。然后,处理鱼的状态,如果周围有空位,则有80%的概率移动到周围的空位。最后,处理水草的状态,有5%的概率枯萎消失。
在显示状态矩阵时,我们使用`imagesc`函数将状态矩阵作为颜色图像显示,其中0表示白色(空位),1表示蓝色(鱼),2表示绿色(水草)。我们通过`colormap`函数来设置颜色,其中`[1 1 1; 0 0 1; 0 1 0]`表示白色、蓝色、绿色对应的RGB三元组。我们还通过`axis equal off`来设置坐标轴,让图像更加美观。
运行以上代码,就可以看到一个模拟长江鱼群洄游的元胞自动机仿真了。在仿真过程中,可能会出现鱼群数量突然减少或者水草大量生长的情况,这是由于我们的模拟并没有考虑太多真实情况和环境因素,仅仅是一个简单的元胞自动机模型。
结果: