从列表中选择单词,以使唯一字母的数量最少

时间:2019-06-10 17:41:09

标签: algorithm minimization

我有一个单词列表,我必须从中选择n个单词,以使其中不同/唯一字母的数量保持最少。我感觉已经有了一个众所周知的算法,但是我找不到它。能否指出可用于解决此问题的算法?

以下示例说明了我用唯一字母表示的意思

说我有单词HELL,HELP和FAIL的列表,我必须从中选择2个单词。

如果我选择“地狱”和“帮助”,则其中的唯一字母数= 4

如果我选择HELL和FAIL,则其中唯一字母的数量= 6

如果我选择“帮助”和“失败”,则其中唯一字母的数量= 7

该算法应选择HELL和HELP。

对于我的用例,我希望有大约15个单词的列表,从中必须选择大约9个单词。

1 个答案:

答案 0 :(得分:0)

使用MIP(混合整数编程)模型(或类似类型的模型)可以找到最佳解决方案。

让我是字母集合,w是单词集合。此外,定义二进制变量:

x(w) = 1 if word w is selected 
       0 otherwise

y(i) = 1 if letter i is selected 
       0 otherwise

然后我们可以写:

min sum(i, y(i))
subject to
    sum(w,x(w)) = K
    y(i) >= x(w)  for letters i in word w
    y,z in {0,1}

当我解决此问题时,会看到以下内容。

数据的组织方式为:

----      8 SET i  letters

A,    B,    C,    D,    E,    F,    G,    H,    I,    J,    K,    L,    M,    N,    O,    P,    Q,    R,    S,    T
U,    V,    W,    X,    Y,    Z


----      8 SET w  words

HELL,    HELP,    FAIL


----      8 SET map  

               A           E           F           H           I           L           P

HELL                     YES                     YES                     YES
HELP                     YES                     YES                     YES         YES
FAIL         YES                     YES                     YES         YES

----      8 PARAMETER k                    =        2.000  number of words to select

解决方案如下:

----     29 VARIABLE x.L  select word

HELL 1.000,    HELP 1.000


----     29 VARIABLE y.L  selected letters

E 1.000,    H 1.000,    L 1.000,    P 1.000


----     29 VARIABLE z.L                   =        4.000  objective

MIP求解器随时可用。