gpt4 book ai didi

c# - 寻找如何重构我的算法的想法

转载 作者:可可西里 更新时间:2023-11-01 08:12:26 26 4
gpt4 key购买 nike

我正在尝试自己编写 Game of Life ,有我自己的一套规则。我想应用的第一个“概念”是社会化(这基本上意味着细胞是想独处还是想与其他细胞成群结队)。数据结构是二维数组(目前)。

为了能够将一个单元格移动到/远离一组其他单元格,我需要确定将它移动到哪里。这个想法是,我评估该区域(邻居)中的所有单元格并获得一个向量,它告诉我将单元格移动到哪里。向量的大小为0或1(不移动或移动),角度为方向数组(上、下、右、左)。

这是一张表示细胞受力的图像,就像我想象的那样(但范围可能超过 5):

ForceAppliedToACell

让我们以这张照片为例:

Example

Forces from lower left neighbour: down (0), up (2), right (2), left (0)
Forces from right neighbour : down (0), up (0), right (0), left (2)
sum : down (0), up (2), right (0), left (0)

所以单元格应该上升。

我可以编写一个包含大量 if 语句的算法,并检查附近的所有单元格。当然,如果将“reach”参数设置为 1(图片 1 的第一列),此算法将是最简单的。但是,如果我将 reach 参数更改为 10 怎么办?我需要提前为每个“到达”参数编写一个算法...我怎样才能避免这种情况(注意,力正在增长 potentialy (1, 2, 4, 8, 16, 32,...)) ?我可以使用特定的设计模式来解决这个问题吗?

另外:最重要的不是速度,而是能够扩展初始逻辑。

需要考虑的事项:

  • reach 应该作为参数传递
  • 我想更改计算力(势,斐波那契)的函数
  • 只有当这个新地方没有被填充时,一个单元格才能去到一个新地方
  • 注意角落(例如,您不能评估右上角的右侧和顶部邻居)

最佳答案

编写算法来搜索特定单元格 C 可到达距离内的所有单元格应该不难。每个有居民的细胞都会对细胞 C 产生特定的排斥力。这种排斥力基于单元格到单元格 C 的距离。在您给出的示例中,排斥力基于 L-1 距离并且是 2^(reach-distance)。然后将每个排斥力加在一起以创建一个累积力,该力指示移动单元格 C 中的居民的方向。

您无需为每个不同的覆盖面编写算法。力的大小可以通过一个简单的公式来确定。如果将该公式更改为其他公式,例如斐波那契数,您仍然应该能够根据距离和范围计算所需的震级。


这是一些用伪 Java 编写的粗略代码,展示了基本思想:http://codepad.org/K6zxnOAx

enum Direction {Left, Right, Up, Down, None};

Direction push(boolean board[][], int testX, int testY, int reach)
{
int xWeight = 0;
int yWeight = 0;
for (int xDist=-reach; xDist<=+reach; ++xDist)
{
for (int yDist=-reach; yDist<=+reach; ++yDist)
{
int normDist = abs(xDist) + abs(yDist);
if (0<normDist && normDist<reach)
{
int x = testX + xDist;
int y = testY + yDist;
if (0<=x && x<board.length && 0<=y && y<board[0].length)
{
if (board[x][y])
{
int force = getForceMagnitude(reach, normDist);
xWeight += sign(xDist) * force;
yWeight += sign(yDist) * force;
}
}
}
}
}
if (xWeight==0 && yWeight==0) return Direction.None;
if (abs(xWeight) > abs(yWeight))
{
return xWeight<0 ? Direction.Left : Direction.Right;
}
else
{
return yWeight<0 ? Direction.Up : Direction.Down;
}
}

int getForceMagnitude(int reach, int distance)
{
return 1<<(reach-distance);
}

关于c# - 寻找如何重构我的算法的想法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2662626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com