实现分区细化算法

时间:2016-12-20 05:51:09

标签: javascript algorithm haskell partitioning pseudocode

分区细化算法

我有另一个Stack Exchange问​​题的算法:

S = {x_1,x_2,x_3,x_4,x_5}

是州空间和

R = {
      (x_1,a,x_2),
      (x_1,b,x_3),
      (x_2,a,x_2),
      (x_3,a,x_4),
      (x_3,b,x_5),
      (x_4,a,x_4), // loop
      (x_5,a,x_5), // loop (a-transition)
      (x_5,b,x_5)  // loop (b-transition)
}

是过渡关系

然后我们从分区

开始
Pi_1 = {{x_1,x_2,x_3,x_4,x_5}}

所有州都集中在一起。

现在,x_2x_4都可以始终执行a - 转换为状态,但没有b - 转换,而其余状态可以同时执行a {1}} - 和b - 转换,因此我们将状态空间拆分为

Pi_2 = {{x_1,x_3,x_5},{x_2,x_4}}.

接下来,x_5可以执行a - 过渡到班级{x_1,x_3,x_5}, 但是x_1x_3不能,因为他们的a - 过渡进入了班级{x_2,x_4}。因此,这些应该再分开,所以我们得到

Pi_3 = {{x_1,x_3},{x_5},{x_2,x_4}}.

现在x_3可以b - 过渡到班级{x_5},但x_1不能,所以它们也必须分开,所以我们得到

Pi_4 = {{x_1},{x_3},{x_5},{x_2,x_4}},

如果你再做一步,你会看到Pi_4 = Pi_5,所以这就是结果。

实施

我不知道如何在JavaScript中实现此算法。

// blocks in initial partition (only consist of 1 block)
const initialPartition = { block1: getStates() };

// new partition
const partition = {};

// loop through each block in the partition
Object.values(initialPartition).forEach(function (block) {

  // now split the block into subgroups based on the relations.
  // loop through each node in block to see to which nodes it has relations
  block.forEach(function (node) {

    // recursively get edges (and their targets) coming out of the node
    const successors = node.successors();

    // ...

  }

});

我想我应该创建一个函数,每个节点可以说明它可以进行哪些转换。如果我有这样的功能,我可以遍历每个块中的每个节点,找到转换,并使用

之类的东西创建一个键
const key = getTransitions(node).sort().join();

并使用此键将节点分组为子块,从而可以执行类似

的操作
// blocks in initial partition (only consist of 1 block)
const initialPartition = { block1: getStates() };

// new partition
const partition = {};

// keep running until terminating
while (true) {

  // loop through each block in the partition
  Object.values(initialPartition).forEach(function (block) {

    // now split the block into subgroups based on the relations.
    // loop through each node in block to see to which nodes it has relations
    block.forEach(function (node) {

      // get possible transitions
      const key = getTransitions(node).sort().join();

      // group by key
      partition[key].push(node);

    }

  });

}

但我需要记住哪些节点已经分成块,所以子块不断变小(即如果我有{{x_1,x_3,x_5},{x_2,x_4}},我应该记住,这些块只能变小,永远不会'交换')

有人可以就如何实施算法提出想法吗?只是在伪代码或其他东西,所以我可以实现如何获取节点的后继者,收入者,标签(例如a-transition或b-transition)等。这是bisimulation algorithm,并且算法在Haskell中实现在slides here,但我不明白Haskell。

0 个答案:

没有答案