【发布时间】:2020-01-05 02:58:18
【问题描述】:
我必须找到整数规划问题的解决方案:
我正在使用 Mosek 的 Fusion API (Python)。现在约束很容易放入,我更担心实际目标。我的问题是:我如何告诉 mosek 我想对所有 is、js 或 ks 求和并定义它们是什么、它们的边界是什么等?
这是服务器上下文中自缓存问题的简化版本。所以i 在这里表示服务器,j 表示要缓存的对象,但在这个版本中只有一个对象,所以我想这并不重要。 k 也表示服务器,例如d(ik) 表示服务器i 到服务器k 的距离。
但是无论我想实现什么,我都不知道如何写这个目标。现在我有这样的东西:
from mosek.fusion import Domain, Model, Expr, ObjectiveSense
alpha = 4 # alpha is the same for all i and j
demand = 1 # w is the same for all i and k
n = 6 # number of servers
distances_matrix = [[...], [...], ...]
with Model("lo1") as M:
x = M.variable("x", n, Domain.integral(Domain.inRange(0, 1)))
y = M.variable("y", n, Domain.integral(Domain.inRange(0, 1)))
alpha_times_x = Expr.mul(alpha, x)
demand_times_dist_times_y = Expr.mul(demand, distances_matrix, y)
M.objective("obj", ObjectiveSense.Minimize, )
M.solve()
print(x.level())
print(y.level())
现在demand_times_dist_times_y 当然是错误的,因为我想从矩阵中得到从i 到k 的距离。上面的x 很好,因为xs 是:{x0, x1, x2, x3, x4, x5, x6},但ys 必须是{y11, y12, y13, y14, y15, y16, y21, y22, ..., y66},所以我想我定义错了。
例如我如何定义 i,k 在{1,2,3,4,5,6} 中并通过例如创建Expr.sum克?我如何在目标开始时定义这两个总和?
【问题讨论】:
-
如果要对所有 i,j,k 求和,为什么还要定义边界(至少从符号上看是这样)? Expr.sum() 应该这样做。如果您真的想对子集求和,请使用 pick() 或 range()。您可能希望 y 是二维的。如果您需要更详细的答案,请告诉我。
-
是的,但是我将如何以及在哪里定义 i、j 和 ks 是什么?