gpt4 book ai didi

Java:具有类型化单元的元胞自动机

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:10 25 4
gpt4 key购买 nike

我正在研究一种基于 Java 的元胞自动机式实现(不确定技术上是否如此,鉴于以下内容),其中各个单元可能具有封装不同数据和 CA 规则的不同类型。可能有很多类型,我希望能够动态地插入新的而不需要维护其他代码。

所有细胞类型都派生自一个共同的基类。每个单元格的 update() 方法在模拟的每一帧被调用一次:

public abstract class Cell
{
public abstract void update(Cell[] neighbors);
}

当 CA 规则只需要相关单元格的数据时,这很有效,例如:

public class CellTypeA extends Cell
{
public int Data = 0;

@Override
public void update(Cell[] neighbors)
{
Data++;
}
}

但是,我有一些模拟规则要求单元格查询相邻的相邻单元格以获取数据,但前提是它们属于具有所述数据的类型。有一种强烈的诱惑要使用 instanceof 操作符来完成这个:

public class CellTypeB extends Cell
{
public boolean State = false;

private void update(Cell[] neighbors)
{
for (Cell c : neighbors)
{
if (c instanceof CellTypeA)
{
State = (((CellTypeA)c).getData() > 10);
}
}
}
}

如果可能的话,我宁愿避免使用有臭味的 instanceof。我也不能仅仅将 getData() 提升到父类(super class)来实现多态性,因为这些单元格的实际数据结构会更加复杂和多变。我一直在阅读有关解决 instanceof 滥用的 GoF 访问者模式,但我似乎无法弄清楚如何将它应用于这个问题。关于如何执行此操作或解决问题的其他方法的想法?

谢谢!史蒂夫

最佳答案

我试了一下,无法弄清楚您如何使访问者模式 a) 整齐地处理两个要访问的项目和 b) 像您需要的那样可插入。

这可行,但可能将 instanceof 隐藏在 Guava 内容中:

import com.google.common.collect.Iterables;
import java.util.Arrays;

public class CellTypeB extends Cell
{
public boolean State = false;

@Override
public void update(Cell[] neighbors) {
Iterable<CellTypeA> onlyAs = Iterables.filter(Arrays.asList(neighbors), CellTypeA.class);
for(CellTypeA a: onlyAs) {
State = (a.getData() > 10);
}
}
}

附言在循环中为 State 赋值时,您的意思是使用 |= 吗?

关于Java:具有类型化单元的元胞自动机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070987/

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