编辑2:我认为大卫·艾森斯塔的解决方案是可行的,但我会在提出问题解决之前检查一下。
字符串列表示例:
1.)“一”
2.)“ab”
3.)“公元前”
4.)“直流”
5.)“全民教育”
6.“有效”
7.)“生长激素”
8.)“嗨”
你可以选择数字1。)里面有一个字符串和一个字母:“A”
您也可以选择1.)和2.)这是两个字符串,其中只有两个不同的字母“a”和“b”
其他有效字符串组合:
1.)2.)3.)
1.)5.)6.)
没有与“h”的有效组合(如果这样的情况能够被证明是理想的,但是你可以假设程序只需要在有有效答案的情况下工作)
可能还有一个额外的条件,即您选择的字符串必须包含一个指定的字母,但是只要找到所有可能的组合,也可以解决问题。在这种情况下,唯一的解决办法是:1.)2.)3.)
[可选信息]目的:我想做一个程序,它可以从一个大的方程列表中(大概100个左右)选择哪些方程可以用来求解一个变量。每个方程得到一个字符串,字符串中的每个字母表示一个未知。方程组的列表都是不同的,例如不能从彼此中导出,所以你需要尽可能多的方程组,因为方程组中有许多未知数。解决未知问题将在cas中完成,所以您不必担心它。然而,我相信CAS(Max)可能会限制它可以同时求解多少个方程,如果你一次给出太多不必要的方程,它可能会太慢。
首先,我将使用一种算法来减少字符串的数量,以使其更快首先,包含指定字母的所有字符串都在缩减列表中,然后,包含缩减列表中字符串中字母的所有字符串都是缩减列表的一部分,直到不添加任何字符为止“g”的缩略列表是7.“gh”和8.“hi”,这只会删除一些不必要的字符串,但任务与其他字符串保持不变。
我认为这可以通过从减少的列表中去掉不必要的字符串来解决,直到需要剩下的所有字符串为止,但是我不知道如何明确定义哪些字符串是不必要的(除了前面提到的那些字符串)。
如果您使用额外的条件:这是一个优化任务。我不需要完美的解决方案,只需要一个最佳的解决方案程序不需要找到给出解决方案的字符串的绝对最小数目。在解决方案中添加一些额外的字符串可能只会减慢计算机的速度,但这是可以接受的。
编辑:关于字符串含义的可选说明:字符串中的每个字母表示方程式中的未知项,因此方程式a=2将用“a”表示,因为这是唯一未知项。方程a+b=0用“ab”表示,方程b^2-c=0用“bc”表示

最佳答案

我不知道该怎么称呼这个问题。这似乎是np难,所以我将建议一个整数规划公式,它可以攻击现成的解决方案。
x_i为0-1变量,指示输出中是否包含方程式iy_j为0-1变量,指示变量j是否包含在输出中我们有限制

for all equations i, for all variables j in equation i, y_j - x_i >= 0.

我们在输出中需要和变量一样多的方程。
(sum over all equations i of x_i) - (sum over all variables j of y_j) = 0

正如您所指出的,需要特别禁止空集合设k为必须出现在输出中的变量。
sum over all equations i containing variable k of x_i >= 1

当然,目标是
minimize sum over all equations i of x_i.

关于algorithm - 是否有一种算法可以从列表中选择一些字符串,以使字符串的数量等于其中不同字母的数量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25448229/

10-14 17:40
查看更多