【问题标题】:Linear Programming with Complication复杂的线性规划
【发布时间】:2009-01-14 08:40:09
【问题描述】:

我正在尝试解决一个看起来像标准线性规划问题的问题。

我们有一组“短语”作为输入,每个短语都有一个权重。我们需要选择在文本中重复每个短语的次数以最大化总权重,但要遵守最大字符长度限制。

这似乎是一个简单的线性规划问题,除了一个短语可能是另一个短语的子短语。例如,如果您的输入短语包括“foo bar”和“foo”,那么如果您重复短语“foo bar”,您也会重复短语“foo”。我不知道如何在线性规划模型中处理这个问题。

【问题讨论】:

    标签: linear-algebra mathematical-optimization linear-programming


    【解决方案1】:

    你还有一个问题,两个短语的串联可能会形成第三个短语。例如,如果您有

    list...4
    sting...6
    ingrave...7
    abcd...5
    

    那么解决方案“listingrave”的“增益”为 17,而您可以用“abcd”(“abcdingrave”)做的任何事情都只有 12,尽管对于长度 4,“abcd”是最佳。

    不过,这是一个有趣的问题,我认为您需要构建一个自动机来搜索文本以查找您的单词,并且您需要在给定长度的自动机中找到一条通过“最简单”状态的路径(例如,通过给予最多糖果作为回报的州)。我会进一步考虑。

    更新:它应该像这样工作:

    1. 从 Aho-Corasick 文本搜索算法构建 DFA
    2. 从 DFA 的起始状态开始,以最大增益搜索给定长度的步行(不是路径,即允许重复的边和顶点)。您可以使用动态编程来做到这一点(从 1 个字符较短的步行构建更长的步行)。

    【讨论】:

    • 只有几个短语就可以创造出所有的排列……这个问题似乎比我想象的要难。
    【解决方案2】:

    只需重新计算权重。例如:

    键 = 3 板 = 2 键盘 = 5

    这会变成:

    键 = 3 板 = 2 键盘 = 5 + 3 + 2 = 10

    如果您这样做,您必须注意包含一个短语的短语,该短语包含一个短语。你必须确保你不这样做:

    y = 7 键 = 3 + 7 板 = 2 键盘 = 5 + 7 + (3 + 7) + 2

    您可以通过在短语长度之后对列表进行排序来避免这种情况。 (最长在前)

    顺便说一句:这不是dynamic programming 的问题吗?

    【讨论】:

      【解决方案3】:

      也许它可以通过只使用动态编程并每次重新计算整个事情来工作。可以使用大量优化来加快速度。 (就像试图只重新计算最后一部分)我认为速度是合理的。 O(n^2 * m) 左右。

      【讨论】:

        【解决方案4】:

        这看起来可以作为背包问题来解决,参见http://en.wikipedia.org/wiki/Knapsack_problem,权重定义为 gs 建议的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          相关资源
          最近更新 更多