如何将有序文本打包到任意2D多边形中?

时间:2012-01-01 19:02:32

标签: algorithm genetic-algorithm

问题

我正在尝试找到经典2D打包问题的变体解决方案 - 类似于this question

给定一个任意多边形 P 和一个短语 W ,我想将 W 的字母“打包”到 P中,使用平移,缩放和90度旋转,以便:

  • W 的字母尽可能覆盖 P ;
  • W 的字母通常按顺序保留(也就是说,当 W 可以分解成更小的序列时,该序列中的字母应保持可读)。< / LI>

我正在努力实现的一些例子:

Example 1 Example 2

当前方法

我已经开始设置遗传算法来尝试解决这个问题,采用以下方法:

  • 256x256网格内映射 P ;
  • W ;
  • 中的每个字母创建一个简化的边界多边形
  • 使用每个字母的位置,旋转和比例作为染色体(作为灰色编码的二进制字符串,每个x位置,y位置和比例为8位,旋转2位,产生大小为{的染色体{1}}位);
  • 使用交叉策略,其中 A 26*length(W)个字母和 B 中的n个字母;
  • 使用简单的变异策略,其中每个位在被选择用于变异的个体中发生突变的概率为length(W) - n;
  • 目前根据边界字母多边形所涵盖的 P 的数量来评估适合度。

目前,算法正在运行并找到解决方案,虽然它们并不是特别漂亮,因为适应度函数没有考虑字母之间的重叠或可读性约束。

它也很慢,因为适应性评估需要大量的几何计算(我在Ruby中编写算法,但使用C扩展来处理几何体)。我正在考虑使用神经网络(或者可能是SVM)来生成符合this paperthis paper中的想法的适应度估计值。

问题

关于我到目前为止所做的事情,我有几个问题:

  • 首先,整体方法是否有意义?显然,大部分的工作和计算时间都在调整适应度函数,但在我深入研究之前,我想检查一下我是朝着正确的方向前进,并且没有一种不同的方法可以解决这个问题。更好。

  • 如何制定适应度函数以说明字母排序/可读性约束?

  • 我是否可以对健身功能进行任何优化以改善我可以计算的世代数?

任何其他想法或建议也将非常感激。我已经阅读了大多数关于类似主题的现有SO问题,并阅读了大量有关该主题的论文,但没有涉及任何专门处理文本打包的问题。

谢谢!

1 个答案:

答案 0 :(得分:10)

  

问:我如何制定健身功能来说明这封信   订购/可读性约束?

文本可读性与流程有关,即单词的后续字母处于眼睛移动的相同后续方向。我认为像下面这样简单的技术可能有用。

enter image description here

步骤:

  1. 计算每个字母放置后的中心(这些字母可能只是字母x和y范围的算术平均值)。这些是上图中的红点。
  2. 计算眼球运动方向角度绝对变化的值。我已在上面显示了angle 1angle 5的角度。
  3. 选择要在流量中计算的最大可接受角度变化限制,例如我们可以选择35 degrees作为我们的值。
  4. 计算绝对值大于上一步限制的角度数。在上图中,两个角度angle 3angle 4属于此类别,因此count = 2
  5. 如果上一步中获得的count大于特定值,则文字展示位置无法读取。
  6. 我希望我能够解释这个想法。相同的衍生物可能是一个很好的解决方案。