当前位置: 代码迷 >> 综合 >> fastMapper 计算流程
  详细解决方案

fastMapper 计算流程

热度:88   发布时间:2023-12-28 12:15:33.0

下面的说明都是以二维像素图为例,svg矢量图会有不同;我再写一篇文章讨论矢量的情况

fastMapper 的计算流程

大体思想

  • 以一个会场的坐位分布图为例,刚开始会场中所有坐位都是空的,没有人坐。只要依次安排所有人的坐位,就能确定这个会场的坐位图了。
  • 很明显,在我们安排会场坐位时,有一定的先后次序,不同坐位被安排的时间不一样。

会场中安排坐位的做法

  1. 将会场中的坐位清空
  2. 当会场中还有坐位时,选取一个最有可能被坐的坐位安排最想坐此坐位的人,此时会场中的空坐减一
  3. 知道会场中没有空坐位,计算完成,得到会场中所有人的坐位分布情况

最重要是如何选取一个最有可能被坐的坐位和安排最想坐此坐位的人


从很多空坐位中,选取一个最有可能被坐的坐位

采用最小熵的方式进行计算
单独一篇文章写这个,先放一张图
在这里插入图片描述

对于一个已选而且确定的坐位,安排最想坐此坐位的人

  • 除了第一个坐下的人,很明显,在安排此坐位时,该坐位周围肯定有做其他人
  • 我们可以依据该坐位周围所做的人,确定该坐位坐那一个人

详细流程

  1. 读取输入的二维图像,得到含uint_8类型的二维矩阵
  2. 处理二维矩阵,得到一个碎片矩阵,并且得到碎片的出现频率
  3. 对于所有碎片的所有方向的所有碎片,判断他们在该方向上的相交像素是否全等,如全等,就加入propagator
  4. 进行计算
    1. 进行观察,取位置的最小熵的位置,如果取不到,这返回success的状态码,如取到,则进行如下的观察

    2. 依据图像中的最小熵的位置,按照该位置碎片现有频率,确定该位置的一个碎片

    3. 标识该位置已经计算,对于该位置的其它碎片,将{位置id,碎片id}加入传播队列,更新对应的熵

    4. 进行传播

      1. 如果传播队列不为空,取传播队列的top元素{位置id,碎片id},作为当前传播元素,队列顶端出栈
      2. 对于传播元素的所有方向进行计算,记对应方向的为计算元素 {该方向的位置id,碎片id}
      3. 如果计算元素无效,即数组越界,跳过(忽略图像边界外的部分)
      4. 如果计算元素有效,减少一次该碎片此方向上的碎片可能数量,如果此碎片此方向上的可能出现的数量为0,则ban掉此方向,并更新对应的熵
    5. 状态码为success,计算完成;状态为continue,接着算

  5. 计算完,输出图像