Как взять максимум по всем столбцам суммы по всем строкам в MathProg - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь решить проблему оптимизации, когда переменные, которые я пытаюсь оптимизировать, находятся в матрице (продавец X shop, переменная равна 1, если этот продавец назначен этому магазину). У каждого магазина есть прибыль.

Вот как я это определяю:

set SalesPeople;
set Shops;

param profit{Shops} >=0;

var a{i in SalesPeople, j in Shops}, binary;

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

subject to cond3: max{i in SalesPeople} sum{j in Shops} profit[j]*a[i,j] >= 10; 

Можно ли это сделать? Если да, то каков правильный синтаксис?

Я только начал изучать MathProg, так что это немного сбивает с толку.

1 Ответ

0 голосов
/ 05 июля 2018

ограничение

 max{i in SalesPeople} sum{j in Shops} profit[j]*a[i,j] >= 10; 

не является линейным, поэтому MIP-решатель не может принять это. К сожалению, эта конкретная форма требует дополнительных двоичных переменных. Если ограничение было

 max{i in SalesPeople} sum{j in Shops} profit[j]*a[i,j] <= 10;

мы могли бы написать:

 cond3{i in SalesPeople}: sum{j in Shops} profit[j]*a[i,j] <= 10; 

Для вашего случая нам нужно сделать что-то вроде:

 var d{i in SalesPeople}, binary; 
 cond3{i in SalesPeople}: sum{j in Shops} profit[j]*a[i,j] >= 10*d[i];
 sumd: sum{i in SalesPeople} d[i] >= 1; 

Последнее ограничение также может быть записано как:

 sumd: sum{i in SalesPeople} d[i] = 1; 

Эта конструкция по существу говорит: « хотя бы один i должен иметь: sum{j in Shops} profit[j]*a[i,j] >= 10».

...