Добавление логических ограничений в PuLP

#python #optimization #linear-programming #pulp

Вопрос:

Я пытаюсь добавить сплавы в сталь, чтобы довести содержание углерода в стали до определенного диапазона при минимальных затратах. Но одно ограничение заключается в том, что в реальной жизни машина может добавлять не менее 50 кг сплава. Поэтому, если мы добавляем определенный сплав, то это может быть либо 50/60/70 кг и т. Д., Либо 0 кг, если мы не добавляем этот конкретный сплав. Как бы я добавил ограничение для того же самого?

Заранее спасибо!

Ниже приведена функция, которую я написал:

 def optimizer_pd(test):

    # declare problem
    prob = LpProblem("Minimize Alloy Cost",LpMinimize)

    # percentage of carbon in each alloy
    percs = ele_percs['carbon']
    
    # alloy_vars is a list of all possible alloys
    
    # constraints
    prob  = lpSum([percs[i] * alloy_vars[i] for i in alloys]) >= minimum_carbon
    prob  = lpSum([percs[i] * alloy_vars[i] for i in alloys]) <= maximum_carbon


    # objective function
    prob  = lpSum([costs[i] * alloy_vars[i] for i in alloys])
    
    # solving
    sol = prob.solve()
    
    # results
    var_dict = {}
    for var in prob.variables():
        var_dict[var.name] = var.value()

    return var_dict
 

Ответ №1:

Добро пожаловать на сайт.

В будущем вы получите лучшие ответы, если представите минимальный воспроизводимый пример того, что вы пытаетесь сделать. Но, это достаточно ясно из того, что вы публикуете.

Таким образом, для этого вам нужно будет ввести дополнительную вспомогательную или «индикаторную» двоичную переменную, индексируемую вашими сплавами. Эта переменная да/нет указывает на обязательство использовать по крайней мере минимальное количество сплава. (По сути, вам нужно разбить свое требование на 2 переменные….)

Затем вам нужно будет использовать ограничение «big M» на количество для использования (или просто использовать максимальное значение). В псевдокоде:

 use[alloy] ∈ {0,1}
amount[alloy] ∈ non-negative reals
min[alloy], max[alloy] are fixed min/max parameters
 

Ограничение минимального использования:

 amount[alloy] >= use[alloy] * min[alloy]   for each alloy
 

Ограничение максимального использования:

 amount[alloy] <= use[alloy] * max[alloy] (or big M)  for each alloy
 

Введите несколько цифр, чтобы убедиться, что вы «верите в это» 🙂

Комментарии:

1. Это сработало идеально! Спасибо