Как сформулировать начальные инвестиции в линейное программирование? - PullRequest
0 голосов
/ 26 декабря 2018

Рассмотрим примерную задачу:

Предположим, что стоимость создания фабрики для создания карандаша равна 1000, а для создания ручки - 2000. Прибыль для каждого карандаша равна 10, а прибыль для каждой ручки -12. За каждый месяц фабрика может производить 100 изделий (ручкой или карандашом).Как я могу включить начальную стоимость, чтобы максимизировать прибыль фабрики?

Я могу думать о:

Maximize 10x1 + 12x2 - (1000b1 + 2000b2)
x1+x2 <= 100

Где b1 и b2 - двоичные переменные, указывающие, нужно ли генерировать ручкуили карандаш.Но я не знаю, как связать их с x1 и x2, так что, например, если x1> = 0, то b1 = 1, иначе b1 = 0

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Это целочисленная программа с фиксированной стоимостью.

Давайте введем следующие переменные:

  • x : непрерывное количество единиц произведенного товара
  • y : переменная ноль-1, указывающая, понесены ли постоянные затраты
  • c : выручка за единицу продукции X
  • f : постоянные затраты на производство ненулевого количества X независимо от количества произведенных единиц
  • m : большое число

Функция затрат с фиксированными затратами:

Fixed cost cost function

Мы преобразуемэто в следующую программу:

max cx - fy
s.t.   x<=my
       0<=x
       y={0,1}

Обратите внимание, что если x = 0 , то функция стоимости установит y = 0 , чтобы избежать оплаты F .Однако, если x> 0 , то ограничения x <= my </em> y = 1 .Единственная проблема заключается в том, что m должно быть верхней границей x .Мы можем достичь этого либо тщательно продумав, какие значения может принимать x , либо установив m в очень большое число.

Мы можем решить программу с помощью cvxpyследующее.Обратите внимание, что если x1 + x2 <= 100 </em>, то лучше ничего не производить.Поскольку это скучно, я увеличил лимит с 100 до 300.

#!/usr/bin/env python3

import cvxpy as cp

b1 = cp.Variable(boolean=True)
b2 = cp.Variable(boolean=True)

x1 = cp.Variable()
x2 = cp.Variable()

m = 100000 #A very large number

obj = 10*x1+12*x2 - 1000*b1 - 2000*b2

cons = []
cons += [x1>=0]
cons += [x2>=0]
cons += [x1+x2<=300]
cons += [x1<=m*b1]
cons += [x2<=m*b2]

prob = cp.Problem(cp.Maximize(obj), cons)

objval = prob.solve()

print("Objective value: {0}".format(objval))
print("x1 = {0}".format(x1.value))
print("x2 = {0}".format(x2.value))
print("b1 = {0}".format(b1.value))
print("b2 = {0}".format(b2.value))
0 голосов
/ 26 декабря 2018

Это очень стандартная проблема фиксированного заряда .Я верю, что буквально любая книга по целочисленному программированию будет освещать это.

Вам нужно только реализовать:

b(i) = 0 => x(i) = 0

Часть «иначе» не нужна: цель позаботится об этом.

В вашем случае вы легко можетезапишите это значение как линейное ограничение:

x(i) <= 100*b(i)
...