Ограничение Pyomo> 100000 ИЛИ 0 - PullRequest
0 голосов
/ 05 апреля 2020

Все,

Я работаю над кодом, в котором есть требование купить / продать минимум 100 000 пакетов. Если это невозможно, то это должно быть обнулено.

Я попробовал несколько вещей для этого, включая:

def objective_rule(model):
      return sum(model.Prices[ProductCount]*model.Amount[ProductCount]*(model.Amount[ProductCount]>100000) for ProductCount in model.Products)

Но это медленнее, чем ожидалось. Я хотел бы установить явное ограничение. Что-то похожее на:

def minTradesize_Constraint(model):
    return ((model.Amount[ProductCount]>=100000)| \
                   (model.Amount[ProductCount]==0.00) for ProductCount in model.Products)

Я смотрел на функции индикатора, но непрерывные аппроксимации Pyomo не помогают. Любая помощь / руководство приветствуется.

1 Ответ

0 голосов
/ 06 апреля 2020

По сути, вы пытаетесь добиться, чтобы термины model.Amount[ProductCount] принимали прерывистые значения (ноль или больше или равный 100 000). Для этого сначала вам нужно определить двоичную переменную: model.y = pyomo.Var(model.Products, within=pyomo.Binary).

Затем вам нужно будет добавить следующие ограничения:

def minTradesize_Constraint1(model):
    return (model.Amount[ProductCount] >= 100000 * y[ProductCount] for ProductCount in model.Products)

def minTradesize_Constraint2(model):
    return (model.Amount[ProductCount] <= M * y[ProductCount] for ProductCount in model.Products)

, где M достаточно большое число (может быть реалистичной c верхней границей для вашей model.Amount[ProductCount] переменной).

В результате этой формулировки, если y[ProductCount] равно нулю, то член model.Amount[ProductCount] также будет равен нулю , Если сейчас модель хочет, чтобы переменная model.Amount[ProductCount] принимала положительные значения, ей нужно будет установить двоичный код y[ProductCount] в 1, следовательно, вынудив model.Amount[ProductCount] стать больше или равным 100 000.

Примечание: Я сформулировал ограничения в том же стиле, что и в своем ответе. Однако, если я правильно понимаю вашу модель, я бы сказал, что первое ограничение, например, должно быть:

def minTradesize_Constraint1(model, ProductCount):
    return (model.Amount[ProductCount] >= 100000 * y[ProductCount]

, а часть for ProductCount in model.Products должна быть добавлена ​​при создании ограничения Pyomo.

...