我正在开发一款游戏,我需要找到特定句子的最大重量。
假设我有句子“快速的棕色狐狸”,并假设只有单个词的定义权重:“the” - > 10,“快速” - > 5,“棕色” - > 3,“狐狸” - > 8
在这种情况下,问题是微不足道的,因为解决方案在于添加每个单词的权重。
现在假设我们还添加了双字,所以除了上面的话,我们还有“快速” - > 5,“快速褐色” - > 10,“棕色狐狸” - > 1
我想知道单词和双词的哪个组合提供最大的权重,在这种情况下它将是“the”,“quick brown”,“fox”
我的问题是,除了明显的蛮力方法之外,还有其他可能的方法来获得解决方案吗?毋庸置疑,我正在寻找一些最佳方法来实现更大的句子。
谢谢。
答案 0 :(得分:3)
您可以查看Integer Linear Program等lp_solve库。在这种情况下,您将希望最大化分数,并且您的目标函数将包含权重。然后你可以使它受到约束,就像你不能同时拥有“快速褐色”和“棕色”一样。
对于单词对齐,这在paper中使用,但您的问题比这更简单,但您可以浏览该论文以了解如何使用ILP。除了ILP之外,可能还有其他算法可以用来最优地解决这个问题,但ILP可以针对小问题以最佳和最有效的方式解决它。
答案 1 :(得分:0)
这感觉就像一个动态的编程问题。
我可以想象这句话的k个单词放在彼此旁边,每个单词之间都有一个灯泡(即总共为k-1个灯泡)。如果打开一个灯泡,这意味着与它相邻的单词是单个短语的一部分,如果它关闭,则它们不是。因此,这些灯泡的任何配置都表明了权重的可能组合。当然,许多配置甚至都不可能,因为我们没有任何他们需要的短语分数。因此,k-1灯泡意味着我们可以获得最多2 ^(k-1)个可能的答案。
我们可以认识到,每次计算的某些部分都可以重复用于其他计算,而不是强制它,因此对于(The)(快速)(棕色狐狸......懒狗)和(快速)(棕色狐狸...懒狗),我们只能计算一次(棕色狐狸...懒狗)的最高分数,记住它并重新使用它,而不会在下次我们看到它时做任何额外的工作。
在我们开始之前,我们应该首先摆脱只有1个可能值的灯泡(假设我们没有短语'brown fox'或其中包含该短语的任何更大的短语,那么灯泡“棕色”和“狐狸”之间总是必须关闭。每个移除的灯泡将解决方案空间减半。
如果w1,w2,w3是单词,那么灯泡将是w1w2,w2w3,w3w4等。所以
Optimal(w1w2 w2w3 w3w4 ...) = max(Optimal(w2w3 w3w4 ...) given w1w2 is on, Optimal(w2w3 w3w4 ...) given w1w2 is off)
(如果我们遇到无法解决的问题,请注意,我们只需返回MIN_INT,事情就应该解决了)
我们可以解决这样的问题,但如果我们接近灯泡的顺序很聪明,我们可以节省更多的时间。也许首先攻击中心灯泡可能会有所帮助..我不确定这部分。
答案 2 :(得分:0)
“ the”-> 10,“ quick”-> 5,“ brown”-> 3,“ fox”-> 8 说上面的单个单词,我会整理一个数组 [10,5,3,8]用于单词0,1,2,3 遍历列表并获取两个分数的总和是否小于总和 例如 10 + 5> 5 the +快>快 5 + 3 <10快棕色>快+棕色。标记此 等等
在标记组合溶液时,将它们沿连续范围标记。 例如 如果单词分数是 字= [1,2,5,3,1,4,6,2,6,8]和[4,6,9,7,8,2,9,1,2] 标记范围(包括两端) 分别是[0,1],[2,5],[6,7]
伪代码在下面给出
从0到字长-1
if number not in range :
add word[number] to overall sum.
else:
if length of range = 1 :
add combined_word_score [ lower_end_number]
else if length of range = 2 :
add combined_word_score [ lower_end_number+next number]
else if length of range > 2 and is odd number :
add max (alternate_score_starting at lower_end_number ,
word[lower_end]+word[higher_end]+alternate_score_starting at
next_number)
else if length of range > 2 and is even number :
add max (alternate_score_starting at lower_end_number +word[higher_end],
word[lower_end]+alternate_score_starting at
next_number).