Многомерный массив в 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. Спасибо.


person bhawesh sah    schedule 29.03.2018    source источник


Ответы (2)


Возможно, я неправильно понял вопрос, но я думаю, что вы можете сделать это следующим образом (при условии, что 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], но я думаю, что это работает лучше с тем, как ее излагает Джулия.

person Mark Birtwistle    schedule 29.03.2018

Я предпочитаю использовать словари для многомерных задач, так как могу отслеживать имена измерений.

Для очень похожей проблемы (проблема канонического транспорта) с использованием словарей см. 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]

В связанном примере все еще используются однородные затраты, но с помощью словарей очень легко расширить его для разнородных затрат.

person Antonello    schedule 30.03.2018