gpt4 book ai didi

python - 链接桶的最佳组合

转载 作者:行者123 更新时间:2023-12-05 05:34:43 27 4
gpt4 key购买 nike

假设我有以下(总是二元的)选项:

import numpy as np
a=np.array([1, 1, 0, 0, 1, 1, 1])
b=np.array([1, 1, 0, 0, 1, 0, 1])
c=np.array([1, 0, 0, 1, 0, 0, 0])
d=np.array([1, 0, 1, 1, 0, 0, 0])

我想找到上述的最佳组合,让我至少,上面最少:

req = np.array([50,50,20,20,100,40,10])

例如:

final = X1*a + X2*b + X3*c + X4*d
  1. 这是否映射到一个已知的运筹学问题?还是属于数学规划?
  2. 这是 NP 难的,还是可以在合理的时间内精确求解(我假设它在组合上不可能精确求解)
  3. 是否有已知的解决方案?

注意:数组的实际长度更长 - 认为是 ~50,选项数是 ~20我目前的研究使我找到了分配问题和背包的某种组合,但不太确定。

最佳答案

这是一个覆盖问题,使用整数程序求解器很容易解决(我在下面使用了 OR-Tools)。如果 X 变量可以是小数,请将 NumVar 替换为 IntVar。如果 X 变量为 0--1,则替换为 BoolVar

import numpy as np

a = np.array([1, 1, 0, 0, 1, 1, 1])
b = np.array([1, 1, 0, 0, 1, 0, 1])
c = np.array([1, 0, 0, 1, 0, 0, 0])
d = np.array([1, 0, 1, 1, 0, 0, 0])
opt = [a, b, c, d]
req = np.array([50, 50, 20, 20, 100, 40, 10])


from ortools.linear_solver import pywraplp

solver = pywraplp.Solver.CreateSolver("SCIP")
x = [solver.IntVar(0, solver.infinity(), "x{}".format(i)) for i in range(len(opt))]
extra = [solver.NumVar(0, solver.infinity(), "y{}".format(j)) for j in range(len(req))]
for j, (req_j, extra_j) in enumerate(zip(req, extra)):
solver.Add(extra_j == sum(opt_i[j] * x_i for (opt_i, x_i) in zip(opt, x)) - req_j)
solver.Minimize(sum(extra))
status = solver.Solve()
if status == pywraplp.Solver.OPTIMAL:
print("Solution:")
print("Objective value =", solver.Objective().Value())
for i, x_i in enumerate(x):
print("x{} = {}".format(i, x[i].solution_value()))
else:
print("The problem does not have an optimal solution.")

输出:

Solution:
Objective value = 210.0
x0 = 40.0
x1 = 60.0
x2 = -0.0
x3 = 20.0

关于python - 链接桶的最佳组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73634199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com