Нужно переделывать, чтобы избежать несостоятельности

Я провожу оптимизацию в лесной промышленности, где ряд компаний, C, может вычесть некоторые пиломатериалы из некоторого ассортиментного набора A из набора урожайных площадок I. Параметр x[I,J,V,T,C,A] переменные представляют поток из зоны заготовки I на лесопилку J с использованием транспортного средства V в момент времени T для компании C с ассортиментом A.

Проблема у меня в том, что каждая лесопилка должна соответствовать минимальной потребности, d_minus. Это сделано в:

# The total flow into a node at time period t must exceed the minimum demand.
subject to Constraint2 {j in J, t in T, p in T, c in C, a in A: p <> t}:
    sum{v in V, i in I} x[i,j,v,p,c,a] >= d_minus[j,t,c,a];

Проблема в том, что автомобили V имеют определенную грузоподъемность, смоделированную в:

# The flow must not exceed the total capacity for each vehicle and time period  
subject to Constraint6 {v in V, t in T}:
   sum{i in I, j in J, c in C, a in A} x[i,j,v,t,c,a] <= capacity[v];

Это приводит к тому, что компилятор жалуется на невозможные границы в constraint2. Например

presolve: constraint Constraint2[1,1,6,1,3] cannot hold:
body >= 1000 cannot be <= 273; difference = 727

Я использую 4 автомобиля и вместимость 40 для каждого автомобиля (я пробовал также использовать 400 и 1000, но ошибка осталась). Параметр d_minus находится между 500 и 1000.

Я думаю, что параметры не должны быть слишком узкими. Используя емкость 1000, они должны удовлетворить потребность в автопарке из 3 человек, на который я бы рассчитывал. Я склонен считать, что ограничения "для всех" - это то, что ограничивает решение, вызывая ошибку. Я пытался использовать "для всех t в T, j в J" для Constraint2, но затем он не может найти эти индексы для d_minus. У кого-нибудь есть подсказка?

С уважением

1 ответ

Решение

Я предлагаю использовать solexpand команда для отображения ограничения Constraint2[1,1,6,1,3] после предварительного разрешения:

solexpand Constraint2[1,1,6,1,3];

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

Другие вопросы по тегам