问题标签 [cellular-automata]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ - 静态数组的性能,启动时可变大小
我编写了一个元胞自动机程序,将数据存储在矩阵(数组数组)中。对于 300*200 矩阵,我可以使用静态内存分配(例如)实现每秒 60 次或更多次迭代std::array
。
我想生成不同大小的矩阵,而无需每次都重新编译程序,即用户输入一个大小,然后开始对该矩阵大小的模拟。但是,如果我使用动态内存分配(例如std::vector
),模拟下降到每秒约 2 次迭代。我怎么解决这个问题?我采取的一种选择是预先分配一个比我预期用户将选择的更大的静态数组(例如 2000*2000),但这似乎很浪费,并且在某种程度上仍然限制了用户的选择。
我想知道我是否可以
a)分配一次内存,然后以某种方式“冻结”它以获得普通的静态数组性能?
b) 或对 ? 执行更有效的操作std::vector
?作为参考,我只是对矩阵执行matrix[x][y] == 1
和matrix[x][y] = 1
操作。
根据this question/answerstd::vector
,使用指针或使用指针在性能上没有区别。
编辑:
根据 UmNyobe 的建议,我已将矩阵重写为单个数组,可通过matrix[y*size_x + x]
. 使用动态内存分配(启动时调整一次),我将性能提高一倍,达到每秒 5 次迭代。
根据 PaulMcKenzie 的评论,我编译了一个发布版本并获得了我正在寻找的性能(每秒 60 次或更多次迭代)。但是,这是更多的基础,所以我仍然想更彻底地量化一种方法相对于另一种方法的好处,所以我使用了std::chrono::high_resolution_clock
每次迭代的时间,发现动态和静态数组之间的性能差异(使用后单个数组矩阵表示)在误差范围内(每次迭代 450~600 微秒)。
然而,调试期间的性能是一个小问题,所以我想我会保留两者,并在调试时切换到静态数组。
multidimensional-array - 生命处理游戏
我现在只追求功能而不是速度。
我正在尝试使用 Eclipse 中的处理来编写康威的生命游戏。上面的代码在多个方面功能失调:
显示的一代在窗口中看起来比我想要的要小得多。尽管我努力通过使每个单元格 2x2 像素和一半的行和列作为窗口的高和宽来平衡这一点,但它只占用了窗口的一小部分。
此外,几秒钟后显示第一代后,该代不会在窗口中更新。
我注意到变量 tNC 通常等于 0,而它应该等于 0 到 7 之间的任何数字。
netlogo - NetLogo BehaviorSpace 无法通过鼠标按下来识别补丁上的初始设置
我有一个带有任意状态配置的补丁点阵,其初始设置是使用mouse-down
原语手动完成的。在运行 BehaviorSpace 时,它会从状态的随机配置开始移动任意设置。
我该如何解决?
javascript - 卡在 JS 中编程 Conway 的“生命游戏”
我们必须为一个学校项目编写康威生命游戏的 JavaScript 版本,但我们被困在循环边缘。整个事情工作正常,但计算邻居数量的函数不适用于边缘上的单元格(因为它必须评估数组之外的值,这些值是未定义的)。我们尝试了几个选项,但它们都改变了程序其余部分的功能。
我们应该添加什么让它在网格边缘工作?
谢谢!
java - 元胞自动机检查邻居
我有一个非常简单的问题,但我似乎无法弄清楚。我认为这是与元胞自动机中的邻居检查有关的逻辑错误。这是我的代码,每秒运行一次,用于增长和检查邻居:
我在我的元胞自动机中使用了一个简单的 12345/3(生存/出生)规则。
目前的问题是我有一个 100x100 的网格,中心有一个 10x10 的 ALIVE/ON 单元格空间。在我的代码运行一次后,所有的细胞都死了。
如果有人需要更多信息,请随时询问。提前致谢!
java - 并发元胞自动机演员移动
我有一个二维元胞自动机。在某些细胞中可能有演员(代理人)。每个演员都是一个线程。我需要根据演员单元格周围的 9 个单元格移动演员。我想同时执行此操作,以便单元格 (4,5) 中的参与者可以使用相邻单元格 (3,4)、(4,4)、(5,4)、(3,5)、(5,5) , (3,6), (4,6), (5,6) 和其他任何参与者都不能使用这个单元格。如果某个演员在他的附近有这些牢房,他必须等到第一个演员搬家。但我想允许同时移动没有共同邻居的演员。所以 (4,5) 中的演员可以与 (10,5) 中的演员同时移动,因为他们没有共同的邻域。
什么是最好的解决方案?你能提出一些建议吗?
python-3.x - 如何提高元胞自动机的性能
我制作了一个简单的地形生成器,但是生成大于 50x50 的任何东西都需要花费大量时间。我可以做些什么来优化代码以便生成更大的东西吗?我知道 pygame 或 numpy 之类的东西可能更适合这样做,但在我的学校他们不会安装它们,所以这就是我必须使用的。
以下是相关代码:
algorithm - 细胞自动化游戏中的有效先前职位(如康威)
我有一个可以表示为的网格boolean[][]
,例如
将代表一个网格,如:
其中O
是 on/alive/true 并且 X 是 off/dead/false。
网格始终是尺寸(长度或宽度)的矩形或正方形,可以是非平凡的长度(大于 20)
这种细胞自动化的规则是:
如果以下 4 个细胞中的一个在当前滴答中存活,则一个细胞在下一个滴答中存活:
- 这个细胞
- 下面的单元格
- 右边的单元格
- 下方和右侧的单元格
在所有其他条件下,细胞在下一个滴答声中死亡。
一个特殊情况是网格底部行和最右列的单元格,它们在下一个刻度上都被删除。
例如,输入网格
将会
在下一个滴答声中,
所以游戏规则非常简单。
问题是,从任何给定的位置,如何确定将评估为当前刻度的有效先前刻度的总数?
很明显,如果输入是m x n
网格,则可以生成网格大小的每个可能的网格组合m+1 x n+1
,评估刻度并比较位置。但是,这将是一种解决方案,2^(O(m x n))
并且这种方法存在很多冗余。
我编写了一种方法,计算每个可能的底行组合,然后将它们组合成“加权底行”,然后继续向上遍历网格。这消除了一遍又一遍地计算相同结果的重复,但显然仍然可以改进。类似的方法是从右侧向内移动或两者结合。
我的想法是,对于任何给定的单元格,它只受当前单元格左上角的单元格的影响。例如,在 a10x10
上,左下角的前一个刻度上的单元格组合在很大程度上不受右上角的前一个刻度上的单元格组合的影响。
当然有一种方法可以找到有效的先前网格的总数,同时考虑到大多数单元格不会相互影响的事实?
我主要是在寻找对该方法的理解,而不是寻找完整解决方案的任何代码-如果您愿意,请继续!