Да, это проблема целочисленного программирования. Вы можете написать это как:
minimize |x1 - x2| + |x2 - x3| + ... + |xn-1 - xn|
subject to x1 + x2 + x3 + ... + xn == c,
xi == Ai1*yi1 + Ai2*yi2 + ... + Aip*yip, i=1,...,n,
yi1 + yi2 + ... + yip == 1, i=1,...,n,
yij binary for i=1,...,n j=1,...,p,
xi integer for i=1,...,n,
здесь Aij — известные входные данные, описывающие, какие целые числа может принимать конкретное значение xi. Ниже приведен конкретный пример с 3 переменными (n=3), где каждое xi может принимать одно из двух целых значений (p=2). То есть x1 может быть 1 или 3, x2 может быть 3 или 4, x3 может быть 2 или 3.
minimize |x1 - x2| + |x2 - x3|
subject to x1 + x2 + x3 == 8,
x1 == 1*y11 + 3*y12,
x2 == 3*y21 + 4*y22,
x3 == 2*y31 + 3*y32,
y11 + y12 == 1,
y21 + y22 == 1,
y31 + y32 == 1,
yij binary i=1,2,3 j=1,2
xi integer i=1,2,3
Вы можете переформулировать приведенную выше задачу как MIP (программа смешанных целых чисел), создав новый набор переменных u для представления целевой функции.
minimize u1 + u2 + ... + un
subject to ui >= xi - xi+1, i=1,...,n-1,
ui >= xi+1 - xi, i=1,...,n-1,
x1 + x2 + x3 + ... + xn == c,
xi == Ai1*yi1 + Ai2*yi2 + ... + Aip*yip, i=1,...,n,
yi1 + yi2 + ... + yip == 1, i=1,...,n,
yij binary for i=1,...,n j=1,...,p,
xi integer for i=1,...,n,
ui real for i=1,...,n-1,
Вы можете использовать любой стандартный решатель MIP для решения вышеуказанной проблемы.
person
codehippo
schedule
21.09.2011