【问题标题】:How to find the lowest amount of combinations needed to reach a set of target values如何找到达到一组目标值所需的最少组合数量
【发布时间】:2022-09-27 17:27:36
【问题描述】:

我正在尝试为自己制作一个小脚本或一些可以帮助我找到达到目标值集所需的最少组合数量的东西。但是我很难找到一种方法来做到这一点,因为我只能找到类似的问题,但只有一个总和,而不是一组数字。

考虑这张表:

   | X | Y | Z
A  | 4       4
B  |     5   5
C  | 4   4
D  | 3   3   3

A、B、C、D 是不同的集合,产生不同数量的 X、Y、Z。

现在假设我们的目标是 40X、80Y、60Z。

通过手动试错,我能找到的最低组合是 21 个,并且有多种变体可以达到这个目标。

例如: 0A、9B、7C、5D = 43X、88Y、60Z 但是也 1A、8B、6C、6D = 46X、82Y、62Z

两者都是有效的,因为它们都使用了 21 种组合并达到了目标值。 有些稍微超过了,但没关系,重要的部分是最少的组数,而不低于任何目标值。

我的问题:我将如何确定 21 是否是可能的最低值,如果不是,那么会给出更低数量的组合是什么?

  • 动态规划?
  • 这是一个非常经典的linear programming 问题。您想在约束qA * 4 + qC * 4 + qD * 3 >= 40 下最小化qA + qB + qC + qDqB * 5 + qC * 4 + qD * 3 >= 80; qA * 4 + qB * 5 + qD * 3 >= 60qA >= 0, qB >= 0, qC >= 0, qD >= 0

标签: python math calculation


【解决方案1】:

这是一个非常经典的linear programming 问题。

问题可以表述为:

最小化: qA + qB + qC + qD

在约束下:

  • qA * 4 + qC * 4 + qD * 3 >= 40;
  • qB * 5 + qC * 4 + qD * 3 >= 80;
  • qA * 4 + qB * 5 + qD * 3 >= 60
  • qA >= 0, qB >= 0, qC >= 0, qD >= 0

在python中,有scipy.optimize.linprog可以为你解决这些问题。

from scipy.optimize import linprog
from numpy import array

c = array([1, 1, 1, 1])
A_ub = -array([[4,0,4,3],[0,5,4,3],[4,5,0,3]])
b_ub = -array([40, 80, 60])
res = linprog(c, A_ub=A_ub, b_ub=b_ub)

print('Results')
print('qA, qB, qC, qD =', res.x)
print('qA + qB + qC +qD =', res.fun)

输出:

qA, qB, qC, qD = [0.         8.         5.         6.66666667]
qA + qB + qC +qD = 19.666666666666668

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 2015-11-19
    相关资源
    最近更新 更多