带并发症的线性规划

时间:2009-01-14 08:40:09

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

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

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

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

4 个答案:

答案 0 :(得分:3)

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

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

然后解决方案“listingrave”有“获得”17,而你用“abcd”(“abcdingrave”)做的任何事情只有12,尽管长度为4, “abcd”是最佳选择。

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

更新:应该这样工作:

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

答案 1 :(得分:0)

重新计算重量。例如:

key = 3
board = 2
keyboard = 5

这改为:

key = 3
board = 2
keyboard = 5 + 3 + 2 = 10

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

ey = 7
key = 3 + 7
board = 2
keyboard = 5 + 7 + (3 + 7) + 2

您可以通过在短语的长度之后对列表进行排序来避免它。 (最长的)

BTW:这不是dynamic programming问题吗?

答案 2 :(得分:0)

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

答案 3 :(得分:-1)

这似乎可以解决为背包问题,请参阅http://en.wikipedia.org/wiki/Knapsack_problem,权重定义为gs建议。