【问题标题】:Multi dimensional array in Gurobi/Jump/JuliaGurobi/Jump/Julia 中的多维数组
【发布时间】:2018-03-29 01:40:01
【问题描述】:

我正在使用 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 的成本。谢谢。

【问题讨论】:

    标签: julia gurobi julia-jump ijulia-notebook


    【解决方案1】:

    我可能误解了这个问题,但我认为你可以这样做(为了说明起见假设 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_2和tr_product_3)编写二维源-目的地矩阵并重复该过程。为了便于说明,我只使用了一个乘数:

    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 的布局方式更有效。

    【讨论】:

      【解决方案2】:

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

      对于使用字典的非常相似的问题(规范传输问题),请参阅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]
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多