Algorithm 数值优化问题-在产品和方案之间选择所需的算法

Algorithm 数值优化问题-在产品和方案之间选择所需的算法,algorithm,optimization,numeric,Algorithm,Optimization,Numeric,我正试图找到一个最佳的算法,在这种情况下,我有许多不同的产品,每个产品有4个场景(彼此无关),以及该场景的成本和收入。例如: 然后,我想找到场景的最佳组合,以便在低于给定成本约束的情况下获得最大的收益。例如,我希望它返回: 我考虑过创建每种可能的组合,并计算每种组合的成本和收入(并选择成本小于x英镑的最大收入),但是组合太多了,因为我有大约120种产品和5种场景(比宇宙中的原子还要多) 有谁知道有什么算法可以给出最佳方案的最佳猜测吗 非常感谢这是著名的运筹学问题的一个版本,名为“” 一般来说

我正试图找到一个最佳的算法,在这种情况下,我有许多不同的产品,每个产品有4个场景(彼此无关),以及该场景的成本和收入。例如:

然后,我想找到场景的最佳组合,以便在低于给定成本约束的情况下获得最大的收益。例如,我希望它返回:

我考虑过创建每种可能的组合,并计算每种组合的成本和收入(并选择成本小于x英镑的最大收入),但是组合太多了,因为我有大约120种产品和5种场景(比宇宙中的原子还要多)

有谁知道有什么算法可以给出最佳方案的最佳猜测吗


非常感谢

这是著名的运筹学问题的一个版本,名为“”

一般来说,这是一个“NP难”问题,所以没有已知的方法来有效和优化地解决这个问题。(你的版本甚至比基本问题更难。)

如果仍然需要最佳解决方案,可以使用整数规划优化器/解算器来求解以下模型:

maximize sum( Revenue_ik * I_ik ) over all product-scenarios i,k  # maximize revenue

s.t.
sum( Cost_ik * I_ik ) over all product-scenarios i,k <= BUDGET  # Total cost should be lower than the budget
sum( I_ik ) over all scenarios k <= 1 for all products i   # Choose at most 1 scenario per product (we can make it equals if we *have* to choose)

I_ik in {0, 1} # Decision variables are binary: not choose or choose

可能的最大收入是1038,按顺序为每个产品选择场景2、3、2和0。

问题似乎有点不够明确。例如,这些零成本/收入项目是什么?零成本/收入项目只是另一种情况,即我们不在该产品上花费任何东西,因此不会从该产品中获得任何收入(例如,如果我们觉得钱在其他地方花得更好)
f(i, w) = max revenue possible using products 0...i, which costs at most w.

f(i, w) = max{ f(i-1, w) , f(i-1, w-Cost_ik) + Revenue_ik for each scenario k for product i }
f(-1, w) = 0 # base case
f(i, w) = -INFINITY if w < 0 # base case
cache = {}
chosen = {}

revenue = [[0, 200, 240, 250], [0, 207, 257, 398], [0, 115, 400, 350], [0, 240, 300, 340]]
cost = [[0, 30, 40, 60], [0, 35, 38, 70], [0, 110, 160, 240], [0, 80, 200, 350]]
scenarios = [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
BUDGET = 275

def f(i, w):
    if w < 0:
        return -10000000
    if i == -1:
        return 0
    if (i, w) in cache:
        return cache[(i, w)]

    vals = [f(i - 1, w - cost[i][k]) + revenue[i][k] for k in scenarios[i]]
    max_val = max(vals)
    chosen_scenario = vals.index(max_val)
    chosen[(i, w)] = chosen_scenario
    cache[(i, w)] = max_val
    return max_val

print(f(3, BUDGET))
result = []
W = BUDGET
for i in reversed(range(len(scenarios))):
    chosen_scenario = chosen[(i, W)]
    result.append(chosen_scenario)
    W -= cost[i][chosen_scenario]

result.reverse()
print(result)  
1038
[2, 3, 2, 0]