2015-12-27 6 views
0

Я пытаюсь решить проблему резания, используя генерацию столбцов. Хороший пример имеет Cplex (C++), где каждый шаблон заполняет один кусок запаса. Я пытаюсь расширить это, так что более одного шаблона может заполнить кусок запаса.Cplex C++ add variable column wise (cutstock)

Latex for what I'm going for.

Latex for what I've got now.

Соответствующий фрагмент кода в примере является следующим выражением колонка:

IloModel masterPr(env); 

    IloObjective SheetsUsed = IloAdd(masterPr, IloMinimize(env)); 
    IloRangeArray demandArray = IloAdd(masterPr, 
     IloRangeArray(env, demand, IloInfinity)); 
    IloNumVarArray Patterns(env); 

//GENERATE pattern SOMEHOW 

    Patterns.add(IloNumVar(SheetsUsed(1) + demandArray(pattern)); 

, где шаблоны всех столбцов represting шаблона, используя полный «лист» , Массив спроса - это матрица спроса, с рисунком, представляющим, сколько из каждого элемента находится в этом шаблоне. Как я могу сделать новую переменную x столбцом мудрой, поэтому я могу поместить более одного шаблона на листе?

+0

Одним из вариантов является использование декомпозиции Dantzig-Wolfe (https://en.wikipedia.org/wiki/Dantzig-Wolfe_decomposition), есть несколько примеров того, как это сделать с помощью [cplex] (http: //www-01.ibm.com/support/docview.wss?uid=swg21399997), в частности [с C] (http://www-01.ibm.com/support/docview.wss?uid=swg21399997&aid= 5). Другой вариант - преобразовать ваши входные данные, чтобы проблема выглядела как проблема из примера cplex, например, x_ {new} <- (x, y). –

ответ

0

Я думаю, что ваша проблема в том, что вам нужно понять, как работает столбцовое моделирование в ILOG Concert C++ для CPLEX. В примере вы дали, заявление

Patterns.add(IloNumVar(SheetsUsed(1) + demandArray(pattern)); 

добавляет переменную решение, которое будет иметь объективный коэффициент функции 1, и эта переменная будет отображаться в ограничении называется demandArray[i] с коэффициентом, равным значению pattern[i]. Что вам нужно сделать, это для каждого шаблона, сделать несколько вещей:

  1. Добавление нескольких переменных решения (x в вашей формулировке LaTeX), чтобы соответствовать листам.
  2. Когда вы добавляете переменную решения в массив x, она будет иметь ненулевые значения в некоторых дополнительных ограничениях, которые вам нужно создать, подобно тому, как создается demandArray.
  3. Когда вы добавляете лист, вам нужно будет добавить одну переменную в свою Patterns переменную, соответствующую вашему y в LaTeX.

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