多线程图遍历

时间:2016-09-15 02:28:13

标签: .net multithreading simulation graph-traversal circuit-diagram

我有一个图表代表一个大电路网络。每个电线/设备可以是“活动的”#34; (它是 - 通过电线和设备的某些路径 - 连接到电源)或"不活动" (它不与电源连接)。没有建模地线或电压。它处于活动状态或非活动状态。

有不同种类的设备。设备可以有任意数量的插头。插头通过电线将设备连接在一起。电线的确切布局并不重要。只关注哪些插头连接在一起 设备的几个例子:

  • 灯泡
    用于轻松显示电路的某些状态。它有一个插头控制灯的状态。如下面的屏幕截图所示,活动设备和电线显示为红色,非活动状态显示为蓝色。
  • POWERSUPPLY
    始终有效。它有一个插头,总是输出一个信号。因此,连接到该插头的电线将始终处于活动状态,并且连接到该电线的设备也将变为活动状态。
  • 输入
    代表与外界联系的某种方式。可以通过运行模拟的过程设置为活动或非活动。它将在其唯一的插头上反映其状态。
  • 继电器
    该设备做了一些更复杂的事情。它由多个部分组成:它有一个线圈插头,用于控制真实继电器中线圈的状态。它有任意数量的开关,由继电器的状态控制。每个都有三个插头,如SPDT开关。当继电器不活动时,来自常闭插头的输入信号将被转发到公共插头,反之亦然,来自常开插头的信号将不被转发。当继电器处于活动状态时,它会连接普通插头和常开插头。

我想尽快浏览此图表。遍历之前图中的设备和电线的状态是“当前一代”#34;。遍历图表计算下一代的状态。遍历完成后,设备和电线的状态将设置为新状态。更新状态分为两部分(计算状态并应用它们)以避免出现问题,例如:中继可能会改变其状态并立即影响遍历。就像你运行Game of Life但不是将结果写入新数组并在计算完所有内容后将所有内容复制回来时,你会逐渐覆盖上一代数据并产生错误的结果。
遍历基本上应该这样做:

  • 首先假设所有对象(设备,插头,电线)在下一代中都处于非活动状态。当遍历到达时,它们将被标记为活动。
  • 然后找到所有绝对供电的插头。像powersupply-plugs一样,可以输出其他可以输出信号的设备。这些是遍历的起点。
  • 如果它已经全部标记为有效,请跳过它。遍历可以多次到达对象。如果不能捕获这种情况,它将导致无限循环/递归。
  • 将其标记为有效。
  • 通知连接的设备插头已变为活动状态。根据什么插头在什么设备上,做一些事情。例如继电器的一个开关上的公共插头。如果继电器有效,则递归常开插头,否则为常闭插头
  • 通知连接的电线,将其标记为有效并递归所有其他连接到电线的插头。
  • 完成所有起点后,分配"下一代"陈述每个对象的实际状态。

这是一个简单电路的例子。一开始一切都不活跃:
Input 0 Generation 0
在下一代左侧的有线网络中,顶部的导线和左侧灯都变为活动状态,因为它们以某种方式连接到电源:
Input 0 Generation 1
我在这里激活了底部的输入:
Input 1 Generation 0
在下一代中,继电器变为活动状态。注意右侧的电线是如何变化的。当计算这一代时,继电器仍然无效:
Input 1 Generation 1
在下一代中,电线会发生变化:
Input 1 Generation 2

当前存在的图形未针对快速遍历进行优化。它经过优化,易于编辑和显示更详细的信息,例如红线上显示信号来源的小箭头。并且有许多"不必要的"可以优化的步骤。有些设备只是将电线连接到电路的不同部分中的其他电线。这仅适用于光学器件,因为它使电路的哪些部分形成逻辑单元更清晰。并且由于导线需要易于编辑,因此每个弯曲或交叉点都是一种在功能上无效但可以在屏幕上拖动的设备。上面屏幕截图左侧的有线网络实际上是4条独立的线路和2条这些伪装置 因此,这太慢了。凭借我拥有的最大网络,我每秒最多可以获得3代。

我正在编写一个程序,通过设置输入,计算几代直到电路稳定并确保电路处于预期状态,自动对电路进行一些测试。使用现有解决方案的速度太慢了
图形的初始设置以及需要完成的任何操作都可能很慢,因为它只会执行一次,并且图形的结构在此之后永远不会改变。但计算世代应该非常快。还应该有一种方法可以检测到没有任何变化,因为我事先并不知道电路的信号延迟。

图表应包含哪些数据以及我可以使用哪些技巧来优化速度? (高内存使用率根本不是问题)
我如何在多个线程上分配负载?单线程这样做很容易,但是如何确保多个线程不做任何愚蠢的事情,而不是通过向所有地方扔锁来破坏性能?也许有可能在设置阶段确定图表的哪些部分应该由哪个线程完成?

我使用.NET(Framework 4.0),但是赞赏任何一般提示。

0 个答案:

没有答案