从有限值列表中寻找目标值的组合算法

时间:2015-09-29 20:42:30

标签: algorithm optimization combinatorics

我遇到一个问题,我有一组有限的值,比如说:

[1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5, 5, 5.5, 6, 6.5, 7, 7.5, 8, 8.5, 9, 9.5, 10]

我想写一个算法,在其中我提供一个目标值,其中返回两个(数量,值)对的列表,以便遵循以下规则。规则按重要性递减的顺序列出,未编号的规则是“很好”的规则。但请注意“必须拥有”。

  1. 数量 - 值对的所有乘积之和等于目标值
  2. 使用一个或两个数量 - 值对
  3. 每对中的整数和列表中的一个值
  4. 数量之和最小化
  5. 这两个值在彼此的2之内,这样(value2 - value1)< = 2
    • 最小化1/2值的数量
    • 使用列表中可能的最低值

    我的问题如下:此问题的参数是否属于任何“经典”或众所周知/研究过的计算机算法?如果某些条件被调整,可能会使这个问题看起来更像是一个经典的'优化问题?

    我感兴趣的是以“蛮力”之外的任何其他方式解决这个问题,但是我对不同优化问题的了解很少。

    修改

    以下是一些例子:

    #------Example 1------------
    print(find_combination(16.5))
    # output = ({'qty':1, value:4.5},
    #           {'qty':2, value:6})
    # The following is invalid because the sum of qty is
    # equivalent but more half values are used
    # output = ({'qty':3, value:5.5})
    #------Example 2------------
    print(find_combination(15))
    # output = ({'qty':3, value:5})
    # The following is invalid because it uses more half
    # values, and the sum of the quantity is not at least
    # two less than the above answer
    # output = ({'qty':2, value:7.5})
    #------Example 3------------
    print(find_combination(12))
    # output = ({'qty':2, 'value':6})
    # The following is invalid because the two values are
    # not within two of each other. Also, the number of
    # different values was not minimized
    # output = ({'qty':1, 'value':2},
                {'qty':1, 'value':10})
    

1 个答案:

答案 0 :(得分:1)

这有什么好处:

largest = largest value in the list
if (target <= largest) {
    search for it in the list, and maybe make a sum of two elements if there's a gap where the target would be
} else {
    n = target / largest
    try larger n with smaller values from the allowed set, to check for an exact match.
    Maybe do something clever with the remainder of target/largest to avoid skip some trial-divisions

}

嗯,如果你没有所有其他限制条件,比如数量在2彼此之内,这可能是一个好的开始。

使用列表中的最小值与&#34;保持最小的数量和#34;冲突。因此,我假设您只想查找较小的列表值,而不会增加与另一个候选解决方案相比的数量总和。

如果目标是其中一个列表值的精确倍数,那么您的规则甚至不会说您应该返回一对,但我认为这是一个目标。 (规则只说当目标实际上集合中时,数量= 1)。

我现在要放弃,直到你明确规定实际是什么