Ограничение Pyomo ›100000 OR 0

Все,

Я работаю над кодом, в котором требуется покупать / продавать минимум 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 не помогают. Любая помощь / руководство приветствуются.


person Marxai    schedule 05.04.2020    source источник
comment
Привет, Марксай! Поскольку это вопрос о формулировке вашей модели, возможно, вам удастся задать его на или.stackexchange.com, а не на этом специфическом для программирования эквивалент. Например, посмотрите этот пост, который должен ответить на ваш вопрос :) or.stackexchange.com/questions/76/   -  person ruaridhw    schedule 06.04.2020


Ответы (2)


По сути, вы пытаетесь добиться, чтобы члены model.Amount[ProductCount] принимали прерывистые значения (ноль или больше или равные 100000). Для этого сначала вам нужно будет определить двоичную переменную: 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 - достаточно большое число (может быть реалистичной верхней границей для вашей переменной model.Amount[ProductCount]).

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

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

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

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

person gmavrom    schedule 06.04.2020

чтобы еще больше упростить решение. Я добавил переменную route_selected

 model.route_selected = pe.Var(<a set, for me its routes == r>, domain=pe.Binary, initialize=0, within=pe.Binary)

 model.route_selected = pe.Var(model.R, domain=pe.Binary, initialize=0, within=pe.Binary)

это моя зависимая переменная выглядит

# Variable to solve, this is the variable that will be changed by solver to find a solution
# for each route, port, cust, year combination what should be supplied amount
model.x_rpcy = pe.Var(self.model.R, self.model.P, self.model.C, self.model.Y, domain=pe.NonNegativeIntegers, initialize=0)

а затем добавил это ограничение

for y in self.model.Y:
    for r in self.model.R:
            lhs = sum(self.model.x_rpcy[r, p, c, y] for p in self.model.P for c in self.model.C)
                vessel_size = 1000
                self.model.const_route.add(lhs == vessel_size * self.model.route_selected[r])
                
    model.const_route.add(lhs == vessel_size * model.route_selected[r]) 
person GKV    schedule 22.06.2021