如何选择9个这样的值

时间:2012-10-29 10:26:20

标签: math numbers logic constraints

鉴于9个变量x1 x2 x3 x4 x5 x6 x7 x8 x9,我想为它们分配实数,以便:

exactly 1 pair among them sums to 2
exactly 2 pairs among them sum to 3
exactly 3 pairs among them sum to 4
exactly 4 pairs among them sum to 5
exactly 5 pairs among them sum to 6
exactly 6 pairs among them sum to 7
exactly 5 pairs among them sum to 8
exactly 4 pairs among them sum to 9
exactly 3 pairs among them sum to 10
exactly 2 pairs among them sum to 11
and exactly 1 pair among them sums to 12

这可以以某种方式建模为约束满足问题吗?或者如何解决这个问题?

谢谢,

1 个答案:

答案 0 :(得分:2)

由于您要求1对具有一定的总和,因此它必须是计算的变量的无序对。此外,由于指定了36个和,我们排除(我假设)向自身添加一个变量(因此36个不一定是不同的总和)。

你问一个表面上的编程问题,是否可以通过约束编程来解决它。约束编程可以为有限域产生答案。在实数范围内,如果没有进一步的洞察力,将有无限多种可能性进行检查。

在搜索中,通过假设变量按递增顺序可以获得某些经济性,这将使这些变量的“加法表”的行和列也按升序排序。现在我们至少要探讨一个有限的问题。这个表的上三角和下三角是对称的,所以我们只需要找出是否可以填写一半或另一半。

这是否足以提示?我注意到表中2和12项的位置是确定的(作为两个最小和两个最大的和)变量。我们可以像这样想象加法表的上半部分:

  _  2  ?  ?  ?  ?  ?  ?  ?
     _  ?  ?  ?  ?  ?  ?  ?
        _  ?  ?  ?  ?  ?  ?
           _  ?  ?  ?  ?  ?
              _  ?  ?  ?  ?
                 _  ?  ?  ?
                    _  ?  ?
                       _ 12
                          _

我们可以给出一个相当简单的Prolog程序,它选择一行接一行的条目,使用每行中第一个开放条目必须是最小可用条目的事实(因为以后不会有机会使用该条目,如果在那里使用大的那个)以及连续行但相应列中的条目之间的差异在该行上是一个常量(包括对角线和下半部分条目)的事实。

要看到这一点,请考虑第i行和第j列减去第i行和第j列:

(x_i + x_j) - (x_i' + x_j)  =  x_i - x_i'

差异不取决于专栏!我们在这些行之间的每列中获得相同的差异,例如如果列j被改为列j'(比如说)。

将这些想法推得足够远,可以让人手动解决问题。