考虑此示例问题:
假设建立工厂生产铅笔的成本为1000,生产铅笔的成本为2000。每支铅笔的利润为10,每支笔的利润为12。每个月,工厂可产生100物品(钢笔或铅笔)。如何包括初始成本以最大化工厂的利润?
我能想到的:
<span style="visibility:hidden">value of the input</span>
其中b1和b2是二进制变量,指示是否生成笔或铅笔。但是我不知道如何将它们与x1和x2相关联,例如,如果x1> = 0则b1 = 1,否则b1 = 0
答案 0 :(得分:1)
这是一个非常标准的固定费用问题。我相信从字面上看,有关整数编程的任何书籍都将涵盖这一点。
您只需要实现:
b(i) = 0 => x(i) = 0
“否则”部分不是必需的:目标将解决此问题。
根据您的情况,您可以轻松地将此含义写为线性约束:
x(i) <= 100*b(i)
答案 1 :(得分:1)
这是一个固定成本的整数程序。
让我们介绍以下变量:
具有固定成本的成本函数为:
我们将其转换为以下程序:
max cx - fy
s.t. x<=my
0<=x
y={0,1}
请注意,如果 x = 0 ,则成本函数将设置 y = 0 以避免支付 f 。但是,如果 x> 0 ,则 x <= my 约束将强制 y = 1 。唯一的问题是 m 必须是 x 的上限。我们可以通过仔细考虑 x 可以采用的值,或者将 m 设置为非常大的数值来实现。
我们可以使用cvxpy解决程序,如下所示。请注意,如果 x1 + x2 <= 100 ,则最好什么也不产生。由于这很无聊,所以我将限制从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))