模拟恐龙和鳄梨树进化
项目描述
恐龙困境
这是恐龙困境,是我第一次尝试的模拟。它将涉及角色、交互以及控制这些交互的变量。角色将在一个基本世界中交互,最后,我们将对他们的结果(进化)感兴趣。您可以在这里看到一个详细的模拟运行,或者下面一个不太详细的运行
使用方法
安装
您可以通过pip安装,或者直接从这里从仓库安装。
pip install dinolemma
或者
git clone https://github.com/vsoch/dinosaur-dilemma
cd dinosaur-dilemma
python setup.py install
如果您想使用GUI,则需要pygame。以下任何一种都可以工作。
pip install .[game]
pip install dinolemma[game]
pip install pygame
命令
您可以从命令行运行文本模拟(使用默认值)
$ dinolemma run
Today is day 80 in the winter season.
There are 5 dinosaurs, and 13 avocado trees.
The temperate is 12°F, humidity 0.33
或(更有趣的)图形模拟(按Enter键循环通过天数)
dinolemma gui
GUI采用与运行相同的输入参数。
dinolemma gui --help
usage: dinolemma gui [-h] [--ndinos NDINOS] [--ntrees NTREES]
[--grid_size GRID_SIZE]
optional arguments:
-h, --help show this help message and exit
--ndinos NDINOS the number of dinosaurs to simulate.
--ntrees NTREES the number of avocado trees to simulate.
--grid_size GRID_SIZE
the size of the square grid, in units (one dimension).
如果您想要更有趣的模拟,尝试添加更多的恐龙或树木!
dinolemma gui --ndinos 100 --ntrees 30
根据这些比例,你可能会看到恐龙(紫色)互相捕食(或饿死),然后树木(绿色)生长来占据游戏板。
Python
你可以在Python内部运行模拟,无论是使用默认值
from dinolemma.game import DinosaurDilemma
simulation = DinosaurDilemma()
Today is day 13 in the summer season.
There are 1 dinosaurs, and 14 avocado trees.
The temperate is 59°F, humidity 0.43
还是通过设置任何变量(恐龙或树木的数量、网格大小等)
开发
我对这个项目的思考是分阶段的。
第一阶段:有状态的
1. 环境
首先需要设计的是环境,意味着一个有状态的基座,它包含一些变量(例如,温度、湿度),这些变量会以某种规律性增量变化,然后影响生活在其中的实体。例如,一个基本环境可能由季节和天数定义,导致特定的温度,这将对生活在其中的生物产生下游影响。如果我的环境有一个函数可以循环一个单位(例如,一天),那么我可以更新其状态,然后根据新的状态更新其中的实体。
2. 实体
一旦定义了环境,就必须定义下一级有状态的对象,即生活在环境中的实体。实体应该首先根据改变的环境更新自己,然后进行交互。交互归结为每个实体在某个网格上改变位置,如果位置靠近另一个生物,则发生交互。我曾考虑过是否要让所有实体移动(然后交互)或者允许它们在移动时交互,我选择了后者。原因是这会允许任何给定实体在一轮中发生多次交互,这更有趣。公平起见,我必须确保移动顺序是随机的。值得注意的是,鳄梨树不能移动。
3. 交互
每个实体都必须有与其他实体交互的规则。当所有实体在模拟中改变位置后,彼此靠近的实体可以交互。交互可以进一步影响实体的状态,甚至导致实体的创建或毁灭。
在第一阶段设计结束时,我们将开发一个本质上基于文本的有状态模拟。我们可以用一组起始条件运行它,然后观察在一定数量的时间步(天数)和最终结果上的交互。
第二阶段:图形化
一旦设计了有状态模拟,我们应该努力可视化它。这意味着(可能)在可以渲染对象在画布或通过dom(d3.js)的浏览器语言中重新实现。我们希望能够运行相同的基于文本的模拟,并观察它。
第三阶段:实时
有状态的方法适用于早期设计,但我们真正想要的是本质上是一群实体在一个环境中共存,然后相互反应。我认为我们可以尝试使用看起来更像是一群可以发出和订阅彼此事件的实体来模拟这一点,并知道如何响应。
角色
恐龙
恐龙是这个世界的主角,我们用一些数量初始化世界。具体来说,一只恐龙四处游荡,并具有以下属性
- 饥饿:每只恐龙都感到饥饿,随着模拟的进行变得越来越饿。如果恐龙遇到成熟的鳄梨,它会吃掉它,饥饿就会缓解。每只恐龙都有不同的阈值来决定是否进食。
- 大小:每只恐龙都有一个随机设置的大小。显然,较大的恐龙需要比较小的恐龙更多的食物,而且较大的恐龙在绝望的情况下也有优势,可以吃掉较小的恐龙。
- 疾病:如果恐龙饥饿并吃掉了患有疾病的鳄梨或另一只恐龙,它可能会生病。生病的恐龙移动较少,因此有更大的机会因饥饿或甚至被其他恐龙吃掉而死亡。
- 性别:恐龙有45%的几率是雄性或雌性,10%的几率是杂交种,可以无配偶繁殖。只有成熟的恐龙(成年体重的80%及以上)才能繁殖,并且每次互动都有一定的小概率发生。
恐龙有以下行为
- 移动:在游戏的每一回合中,恐龙都会移动,然后与它在新位置找到的任何东西互动。
- 进食:恐龙可以选择吃鳄梨,甚至吃另一只恐龙,这取决于其大小和饥饿程度。
- 睡眠:如果恐龙生病,它可以选择睡觉(有一定的概率)以增加痊愈的机会。
- 繁殖:遇到另一只恐龙(成熟且为异性)的恐龙有一定百分比的概率繁殖。
鳄梨
鳄梨生长在环境中的树上。对于任何给定的树,它必须达到一定的年龄才能产生鳄梨,一旦足够成熟,它会在一定时间内产生一定数量的鳄梨。这为我们提供了以下属性
- 成熟:成熟的树不能被恐龙吃掉,可以产生鳄梨。未成熟的树可以被完全吃掉并从游戏中移除。
- 鳄梨:一旦树成熟,它就持有一定数量的鳄梨
- 疾病:任何树都有一定概率感染疾病。感染疾病会使树面临死亡或使恐龙生病的风险。
变量
对于上述每个场景,必须在一定范围内生成概率,并将它们分配给随机生成的实体,这些实体也被随机放置在某个大小的游戏板上。
恐龙
游戏开始时有一定数量的恐龙(总恐龙数量),以下值是随机设定的(在一定范围内)
- 大小
- 饥饿
游戏本身(DinosaurDilemma的一个实例)在dinolemma/game.py中以以下方式创建一定数量的恐龙
from dinolemma.dinosaurs import Dinosaurs
dinosaurs = Dinosaurs()
dinosaurs
[14 dinosaurs]
for dino in dinosaurs:
print(dino.name)
persnickety-muffinpodus
loopy-tacopodus
gassy-poodledocus
frigid-nalgasasaurus
hanky-dogdocus
dirty-blackbeanpodus
astute-truffleus
loopy-knifeus
chocolate-noodleisaurus
psycho-chipiraptor
muffled-lizardus
stinky-underoosdocus
rainbow-cattywampusisaurus
buttery-saladiraptor
每个恐龙都保证有独特的名字,我们检查游戏板上有足够的空间来支持创建的恐龙和树。我们还可以随机选择一只恐龙
dino = dinosaurs.random()
dino.name
'bricky-eagleraptor'
鳄梨
游戏还开始时有一定数量的鳄梨幼苗。
from dinolemma.avocados import AvocadoTrees
trees = AvocadoTrees()
for tree in trees:
print(tree.name)
hanky-egg-tree
goodbye-poo-tree
reclusive-sundae-tree
muffled-squidward-tree
或随机选择一棵树
tree = trees.random()
tree
<dinolemma.avocados.AvocadoTree at 0x7f25347e7860>
项目详情
下载文件
下载适用于您平台文件的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源代码发行版
构建发行版
dinolemma-0.0.12.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | eb139a9e21e12a84578dc3f03a9a6f49bfe5f6d4fd34b050442320d7c950b412 |
|
MD5 | 78bdef3d15ca4f1454bacd9130caa132 |
|
BLAKE2b-256 | 81ac7905e5f638ed9add85d9d6a25521866c73554a4103506b4baa0546695f74 |
dinolemma-0.0.12-py3.7.egg 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 35f45f89f6f2511938e1b798164b494fbcee120e3e0d68aa2f9bdcceb1b66a18 |
|
MD5 | e32e653dee21629e731cec041d270c27 |
|
BLAKE2b-256 | 3526e3dd9090ebd21a4737e9490418fab90a61160a43e694176384107d499652 |