我有一个非常简单的MIP问题:给定一组数字,请选择这些数字中的n个,它们的总和应高于给定的阈值。最小化超过该阈值的总和。
代码如下:
colors = [...]
threshold = 9851000000000.0 / 1e12
n = 36
for i in range(1):
# initialize
m = Model("HarvestProblem")
# initialize variables
cs = []
for i in range(len(colors)):
name = "cs" + str(i).zfill(5)
cs.append(m.addVar(vtype=GRB.BINARY, name=name))
# set objective
m.setObjective(sum([colors[i] * cs[i] for i in range(len(colors))]), GRB.MINIMIZE)
# set constraints
m.addConstr(quicksum([colors[i] * cs[i] for i in range(len(colors))]) >= threshold)
m.addConstr(quicksum(cs) == n)
m.optimize()
这很容易解决。发生了一个想法:如果我允许选择少于n个,那么会有更多选择可能会导致更好的结果。但是,当我这样做时(因此更改了第二个约束),我得到的最优解就更糟了。我发现这很奇怪,因为仍然可以使用原始解决方案。有任何线索吗?
原始结果:
Solution count 1: 9.85112
Optimal solution found (tolerance 1.00e-04)
Best objective 9.851118387317e+00, best bound 9.851000000000e+00, gap 0.0012%
新结果:
Solution count 1: 9.85121
Optimal solution found (tolerance 1.00e-04)
Best objective 9.851213112957e+00, best bound 9.851000000000e+00, gap 0.0022%