Step6: 更加复杂的行为(Optional)

现在一个简单的捕食者仿真模型已经基本搭建完成,我们还可以优化一下,实现更加复杂的行为。

4.6.1 捕食者仿真模型

通过图像控制网格分布

现在的模型中,草地网格的初始分布时随机的,为了让其更加符合自然状态,我们通过图像的数值来控制网格中食物量的多少,使得草地的分布和图像一致。

原始图像(下载链接arrow-up-right)如下,原始图像大小为50x50,和草地网格的大小一致

4.6.1 草地分布图像

TIPS: 图像文件读取后可以直接看成一个matrix多维数组进行操作,通过matix[i,j]可以读取图像在第i行第j列数据的值。这里通过matrix at {i,j} 返回第i行第j列的值。

如此,草地初始化为与图像一致的分布。

4.6.2 优化后的捕食者仿真模型

向附近的食物移动

之前在编写食草与食肉动物的移动时,我们移动的逻辑是向周围相距为2的网格随机移动,现在我们利用条件语句实现更加复杂的移动逻辑。

首先,在父族中添加choosecell函数,子族通过重写choose_cell实现不同的移动逻辑

nil: nil表示控空值

在食草动物子族中,重写choose_cell

each: each指代列表中的每个元素,因为food是vegetation_cell的属性,不是my_cell.neighbors2这个列表的属性,因此这里用each.food,列出my_cell.neighbors2中每个元素的food属性,并用with_max_of 返回最大值

在食肉动物子族中,重写choose_cell

  • shuffle: 以随机顺序打乱列表

  • first_with : 返回符合条件的第一个元素

  • empty(list): 判断列表是否为空。 !(empty(list)) 判断列表是否不为空

  • prey inside vegetation_cell: 里面有prey族的vegetation_cell

本节完整代码如下:

Last updated