我有一个图表代表一个大电路网络。每个电线/设备可以是“活动的”#34; (它是 - 通过电线和设备的某些路径 - 连接到电源)或"不活动" (它不与电源连接)。没有建模地线或电压。它处于活动状态或非活动状态。
有不同种类的设备。设备可以有任意数量的插头。插头通过电线将设备连接在一起。电线的确切布局并不重要。只关注哪些插头连接在一起
设备的几个例子:
我想尽快浏览此图表。遍历之前图中的设备和电线的状态是“当前一代”#34;。遍历图表计算下一代的状态。遍历完成后,设备和电线的状态将设置为新状态。更新状态分为两部分(计算状态并应用它们)以避免出现问题,例如:中继可能会改变其状态并立即影响遍历。就像你运行Game of Life但不是将结果写入新数组并在计算完所有内容后将所有内容复制回来时,你会逐渐覆盖上一代数据并产生错误的结果。
遍历基本上应该这样做:
这是一个简单电路的例子。一开始一切都不活跃:
在下一代左侧的有线网络中,顶部的导线和左侧灯都变为活动状态,因为它们以某种方式连接到电源:
我在这里激活了底部的输入:
在下一代中,继电器变为活动状态。注意右侧的电线是如何变化的。当计算这一代时,继电器仍然无效:
在下一代中,电线会发生变化:
当前存在的图形未针对快速遍历进行优化。它经过优化,易于编辑和显示更详细的信息,例如红线上显示信号来源的小箭头。并且有许多"不必要的"可以优化的步骤。有些设备只是将电线连接到电路的不同部分中的其他电线。这仅适用于光学器件,因为它使电路的哪些部分形成逻辑单元更清晰。并且由于导线需要易于编辑,因此每个弯曲或交叉点都是一种在功能上无效但可以在屏幕上拖动的设备。上面屏幕截图左侧的有线网络实际上是4条独立的线路和2条这些伪装置
因此,这太慢了。凭借我拥有的最大网络,我每秒最多可以获得3代。
我正在编写一个程序,通过设置输入,计算几代直到电路稳定并确保电路处于预期状态,自动对电路进行一些测试。使用现有解决方案的速度太慢了
图形的初始设置以及需要完成的任何操作都可能很慢,因为它只会执行一次,并且图形的结构在此之后永远不会改变。但计算世代应该非常快。还应该有一种方法可以检测到没有任何变化,因为我事先并不知道电路的信号延迟。
图表应包含哪些数据以及我可以使用哪些技巧来优化速度? (高内存使用率根本不是问题)
我如何在多个线程上分配负载?单线程这样做很容易,但是如何确保多个线程不做任何愚蠢的事情,而不是通过向所有地方扔锁来破坏性能?也许有可能在设置阶段确定图表的哪些部分应该由哪个线程完成?
我使用.NET(Framework 4.0),但是赞赏任何一般提示。