Or tools CP-SAT
Решаю с помощью Google Or-tools на c# следующую классическую задачку - есть длинные заготовки (дорожки), из них надо нарезать нужное количество отрезков (плиты). Соответственно, создаем массив, в котором указывается сколько штук конкретной плиты нужно взять (нарезать) из конкретной дорожки.
// Массив привязок плит к дорожке
IntVar[,] arrSlabOnTrack = new IntVar[slabsCount, tracksCount];
for (int i = 0; i < slabsCount; i++)
{
for (int j = 0; j < tracksCount; j++)
{
arrSlabOnTrack[i,j] = model.NewIntVar(0, varUpperBound, $"arrSlabOnTraсk[{i},{j}]");
}
}
Также создается массив переменных-индикаторов:
IntVar[] arrTrackUsed = new IntVar[tracksCount];
в котором указывается использовалась ли та или иная дорожка(заготовка) для производства ходя бы одной плиты.
Вопрос: как записать это условие для незафиксированного жестко на этапе компиляции числа плит и дорожек, к примеру, если взять дорожку с индексом 2:
if (arrSlabOnTrack[0,2] >0 || arrSlabOnTrack[1,2] >0 || arrSlabOnTrack[2,2] >0 || ... arrSlabOnTrack[N,2] >0 )
{
arrTrackUsed[2] = 1;
}
Где-то прочитал, что для этого нужно использовать model.AddMaxEquality() но у меня с ней ничего не получилось, вполне возможно, я неверно записывал.