mosek 中带索引的变量和带索引的总和
Variables with indexes and sums with indexes in mosek
我必须找到整数规划问题的解决方案:
我正在使用 Mosek 的 Fusion API (Python)。现在约束很容易放入,我更担心实际objective。我的问题是:如何告诉 mosek 我想对所有 i
s、j
s 或 k
s 求和并定义它们是什么、它们的边界是什么等.?
这是服务器上下文中自缓存问题的简化版本。所以这里的 i
表示服务器,j
表示要缓存的对象,但是在这个版本中只有一个对象,所以我想这并不重要。 k
也表示服务器,例如d(ik)
表示服务器i
到服务器k
的距离。
但是我想实现什么,我不知道怎么写这个objective。现在我有这样的东西:
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
克?我将如何在 objective?
开头定义这两个总和
我不知道这是否回答了问题,但如果你回答了,请说
x = M.variable("x", n, Domain.integral(Domain.inRange(0, 1)))
然后sum_ix_i得到
Expr.sum(x)
类似地,如果现在 alpha
是一个长度为 n
的数值数组,那么 sum_i (alpha_i*x_i) 是通过
Expr.sum( Expr.mulElm(alpha,x) )
甚至
Expr.dot( alpha, x )
等等。您从未明确指定求和索引,您正在对 Expr.sum
和类似方法中出现的所有条目求和。
我必须找到整数规划问题的解决方案:
我正在使用 Mosek 的 Fusion API (Python)。现在约束很容易放入,我更担心实际objective。我的问题是:如何告诉 mosek 我想对所有 i
s、j
s 或 k
s 求和并定义它们是什么、它们的边界是什么等.?
这是服务器上下文中自缓存问题的简化版本。所以这里的 i
表示服务器,j
表示要缓存的对象,但是在这个版本中只有一个对象,所以我想这并不重要。 k
也表示服务器,例如d(ik)
表示服务器i
到服务器k
的距离。
但是我想实现什么,我不知道怎么写这个objective。现在我有这样的东西:
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
克?我将如何在 objective?
我不知道这是否回答了问题,但如果你回答了,请说
x = M.variable("x", n, Domain.integral(Domain.inRange(0, 1)))
然后sum_ix_i得到
Expr.sum(x)
类似地,如果现在 alpha
是一个长度为 n
的数值数组,那么 sum_i (alpha_i*x_i) 是通过
Expr.sum( Expr.mulElm(alpha,x) )
甚至
Expr.dot( alpha, x )
等等。您从未明确指定求和索引,您正在对 Expr.sum
和类似方法中出现的所有条目求和。