Gurobi/Jump/Julia 中的多维数组

Multi dimensional array in Gurobi/Jump/Julia

我正在使用 Jump/Julia 来解决优化问题。这是一些源位置和一些目的地的运输问题。此外,我有不同的产品类型,因此将一种产品从源 i 发送到目的地 j 与其他产品不同。通常在产品同质化的情况下,我可以这样写一个成本矩阵

tr =[0 2.82 4.24 5.83 4.12 0;
2.82 0 1.41 3.16 2.23 2.82;
4.24 1.41 0 2 2.23 4.24;
5.83 3.16 2 0 2.23 5.83;
4.12 2.23 2.23 2.23 0 4.12;
0 2.82 4.24 5.83 4.12 0]

它只是表示将一件产品从 i 发送到 j 的费用。当移动成本还取决于产品类型时,我试图找到一种修改成本矩阵的方法。示例 c[1,2,3] 表示将产品类型 1 从来源 2 移动到目的地 3 的成本。谢谢。

我可能误解了问题,但我认为你可以按照以下方式进行(为了说明起见假设有 3 个产品):

tr_product_1 = [0 2.82 4.24 5.83 4.12 0;
2.82 0 1.41 3.16 2.23 2.82;
4.24 1.41 0 2 2.23 4.24;
5.83 3.16 2 0 2.23 5.83;
4.12 2.23 2.23 2.23 0 4.12;
0 2.82 4.24 5.83 4.12 0]

cost_matrix = zeros(6,6,3)
cost_matrix[:,:,1] = tr_product_1

然后为其他产品(例如 tr_product_2tr_product_3)编写二维 source-destination 矩阵并重复该过程。为了便于说明,我刚刚使用了一个乘数:

tr_product_2 = 1.2 * tr_product_1
tr_product_3 = 1.5 * tr_product_1

cost_matrix[:,:,2] = tr_product_2
cost_matrix[:,:,3] = tr_product_3

cost_matrix

6×6×3 Array{Float64,3}:
[:, :, 1] =
 0.0   2.82  4.24  5.83  4.12  0.0 
 2.82  0.0   1.41  3.16  2.23  2.82
 4.24  1.41  0.0   2.0   2.23  4.24
 5.83  3.16  2.0   0.0   2.23  5.83
 4.12  2.23  2.23  2.23  0.0   4.12
 0.0   2.82  4.24  5.83  4.12  0.0 

[:, :, 2] =
 0.0    3.384  5.088  6.996  4.944  0.0  
 3.384  0.0    1.692  3.792  2.676  3.384
 5.088  1.692  0.0    2.4    2.676  5.088
 6.996  3.792  2.4    0.0    2.676  6.996
 4.944  2.676  2.676  2.676  0.0    4.944
 0.0    3.384  5.088  6.996  4.944  0.0  

[:, :, 3] =
 0.0    4.23   6.36   8.745  6.18   0.0  
 4.23   0.0    2.115  4.74   3.345  4.23 
 6.36   2.115  0.0    3.0    3.345  6.36 
 8.745  4.74   3.0    0.0    3.345  8.745
 6.18   3.345  3.345  3.345  0.0    6.18 
 0.0    4.23   6.36   8.745  6.18   0.0

在这种情况下,3 维矩阵的形式为 [source, destination, product],但我认为这更适合 Julia 的布局方式。

我更喜欢使用字典来解决多维问题,因为我可以跟踪维度名称。

对于使用字典的非常相似的问题(规范传输问题),请参阅 https://lobianco.org/antonello/personal:blog:2017:0203_jump_for_gams_users

基本上你为向量中的每个维度定义了一组允许的元素(例如plants = ["seattle","san_diego"]; markets = ["new_york","chicago","topeka"]),然后你可以在 JuMP 中使用这样的东西:

@constraints trmodel begin
    supply[p in plants],   # observe supply limit at plant p
        sum(x[p,m] for m in markets)  <=  a[p]
    demand[m in markets],  # satisfy demand at market m
        sum(x[p,m] for p in plants)  >=  b[m]

链接示例仍然使用同质成本,但使用字典将其扩展为异质成本非常简单。