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

15

问题

我正在尝试解决一个经典的二维装箱问题的变体 - 类似于这个问题

给定任意多边形P和短语W,我希望使用平移、缩放和90度旋转将W的字母“装”入P中,使得:

  • W的字母尽可能覆盖P
  • W中的字母保持一般有序(也就是说,虽然W可能被分成更小的序列,但该序列中的字母应该仍然可读)。

以下是我想要实现的一些示例:

Example 1 Example 2

当前方法

我已开始建立遗传算法来尝试解决这个问题,它采取以下方法:

  • 256x256网格内映射P
  • W中的每个字母创建一个简化的边界多边形;
  • 使用每个字母的位置、旋转和缩放作为染色体(作为灰度编码二进制字符串,每个x位置、y位置和缩放有8位,旋转有2位,因此染色体大小为26*length(W)位);
  • 使用交叉策略将A中的n个字母与B中的length(W) - n个字母结合起来;
  • 使用简单的突变策略,选择进行突变的个体中每个位被突变的概率是1/26
  • 目前根据字母多边形边界覆盖的 P 的数量来评估适应度。
  • 目前算法正在运行并找到解决方案,尽管它们还不是特别美观,因为适应度函数没有考虑字母之间的重叠或易读性约束。

    它也非常缓慢,因为适应度评估需要大量的几何计算(我用Ruby编写算法,但使用C扩展来处理几何问题)。我正在考虑使用神经网络(或者可能是SVM)生成适应度估计,符合这篇论文这篇论文中的想法。

    问题

    我有一些关于我迄今为止所做的事情的问题:

    • 首先,整体方法是否合理?显然,大部分工作和计算时间将花在调整适应度函数上,但在我深入研究这个问题之前,我想检查自己的方向是否正确,并且是否存在更好的方法来解决这个问题。

    • 如何制定适应度函数以考虑字母排序/易读性约束?

    • 是否有任何优化可以对适应度函数进行,以提高我可以合理计算的世代数量?

    如果您有其他想法或建议,也将不胜感激。我已经阅读了大多数相关主题的现有SO问题,并阅读了一些关于该主题的论文,但还没有发现专门处理文本包装的内容。

    谢谢!

    1个回答

    10

    Q:如何制定适应字母排序/易读性限制的适应度函数?

    文本易读性与字母排列方式有关,即单词后续字母的移动方向。我认为可以采用以下简单技巧。

    enter image description here

    步骤:

    1. 计算放置字母后每个字母的中心点(可以是字母 x 和 y 范围的算术平均值)。以上图中红色点表示。
    2. 计算在眼睛移动方向上角度的绝对变化值。上图中我展示了角度 angle 1 到 angle 5。
    3. 选择最大可接受变化角度的限制,在此例中我们可以选择35度作为我们的值。
    4. 计算绝对值大于前一步中所述限制的角度数目。在上图中,两个角度 angle 3 和 angle 4 属于这一类别,因此 count = 2。
    5. 如果前面的步骤中得到的 count 大于特定值,则无法读取文本内容。

    希望我能解释清楚这个想法。该方法的衍生品可能是一个很好的解决方案。


    谢谢您的建议!我认为在将短语分解成序列后,我会使用这种方法的变体。我已经为您的答案投了赞成票,但会等待一段时间,希望其他人能对我的问题的其他部分提出一些想法。 - Gavin Ballard

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接