Использование индекса в массиве, чтобы сделать сумму - PullRequest
0 голосов
/ 04 апреля 2019

Меня бросили в Cplex, и у меня совершенно нет опыта его использования. Возможно, мне не хватает какой-то очевидной информации.

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

Короче говоря, я ищу эквивалент ".getindex ()" в Cplex. Я огляделся безрезультатно.

Вот упрощенная версия соответствующих параметров.

int amountSegments=6;
int products=1..2;
int time=15;
int path[products][segments]=[[2,1,4,5],[2,1,3,6,4,5]];

Вот одно из соответствующих ограничений

forall(l in products)
   forall(i in path)
     sum(t in XXXX)
     x[i][l][t]==d[l];

Что я пытаюсь сделать здесь, если x - это количество вагонов на каждом [сегменте], содержащем [продукт] в [время]: для каждого из двух продуктов и для каждого сегмента в этом пути продуктов я хочу сумма t в i.getindex () .. время-количествоSegments + i.getindex ().

Заранее спасибо, надеюсь, это несколько понятно.

Редактировать: Я постараюсь прояснить свой вопрос. У нас есть два продукта, 1 и 2. Продукт один путь состоит из путей: 2,1,4,5, а продукт два состоит из путей 2,1,3,6,4,5. Для этого конкретного ограничения, для продукта один, модели необходимо сгенерировать сумму для сегментов 2, 1, 4 и 5. Порядок важен для остальной части модели.

Для сегмента 2 мне нужна сумма на t от 1 до 12 (первый сегмент на пути 15-4 + 1)

Для сегмента 1 мне нужна сумма на t от 2 до 13 (второй сегмент на пути 15-4 + 2)

для сегмента 4, мне нужна сумма на t от 3 до 14 (третий сегмент на пути, так что 15-4 + 3)

Для сегмента 5 мне нужна сумма на t от 4 до 15 (четвертый сегмент на пути 15-4 + 4)

Для второго продукта: Для сегмента 2 мне нужна сумма на t от 1 до 10 (первый сегмент на пути 15-6 + 1)

Для сегмента 1 мне нужна сумма на t от 2 до 11 (второй сегмент на пути 15-6 + 2)

Для сегмента 3 мне нужна сумма на t от 2 до 12 (третий сегмент на пути 15-6 + 3)

для сегмента 6, мне нужна сумма на t от 3 до 13 (четвертый сегмент на пути, так что 15-6 + 4)

Для сегмента 4 мне нужна сумма на t от 4 до 14 (пятый сегмент на пути, так что 15-6 + 5)

Для сегмента 5 мне нужна сумма на t от 2 до 15 (шестой сегмент на пути, так что 15-6 + 6)

Короче говоря, для [i] мне нужна модель, чтобы прочитать массив путей для правильного продукта. Для [l] это довольно просто, я думаю. Для суммирования по [t] мне нужно перейти от моей позиции в массиве пути (индекс + 1) к (общее количество времени сегментов в пути + позиция в массиве пути)

Надеюсь, это немного лучше объясняет мою проблему!

1 Ответ

1 голос
/ 04 апреля 2019

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

dvar boolean x[1..10];

int time=0;
range products=1..2;
{int} paths[products]=[ {2,1,4,5},
                        {2,1,3,6,4,5} ];

minimize (0);

subject to {
forall(p in products)
   sum(t in paths[p]) x[time+t]==0;
}

p будет варьироваться от 1 до 2. Для p == 1, t будет повторяться по paths[1], что является кортежем {2, 1, 4, 5}. И вы можете добавить любую константу time к t при индексации x ... Таким образом, вы получите сумму x[2], x[1], x[4], x[5], как здесь t == 0.

Хитрость в том, что кортежи, находящиеся в массиве paths, не обязательно должны иметь одинаковый размер. Хотя матрица, как и в вашем вопросе, должна быть регулярной: у вас не может быть одной строки с 4 элементами, а другой - с 6.

...