将分层定价编写为线性程序

时间:2018-10-24 14:26:27

标签: linear-programming

有没有一种方法可以编写将分层定价用作线性程序的成本函数?

supplier   volume A   price A   volume B   price B
1          0          $1        300        $2
2          0          $3        500        $1.50

按分层定价,对于供应商1,我的意思是第一公斤300公斤的价格为$ 1,第二公斤200kg的价格为$ 2。 (如果我不超过300公斤,则所有装置的成本均为2美元)。这是我当前正在查看的成本函数。

cost = P1a * V1 + P1b * V1 + P2a * V2 + P2b * V2

s.t     V1+V2 = 1000
        V2 < 8000, V1 < 800
where
P1a = first price bracket for supplier 1
P1b = second price bracket for supplier 1
V1 = volume for supplier 1

如果是达到B量时所有量都变成B价格的情况,那么我可以添加一个二进制变量,使函数看起来像这样

cost = u * P1a * V1 + v * P1b * V1 + x * P2a * V2 + y * P2b * V2

s.t     u+v = 1, x+y = 1

u,v,x,y = 1 if price bracket is used, 0 if price bracket isnt used

有没有办法做类似的事情?

编辑: V1和V2都是整数,并且有一个设定的上限,例如800kg。还有一个需求约束,可以说V1 + V2 = 1000。

1 个答案:

答案 0 :(得分:0)

这是可行的,只要有一个常量M>=0,它是体积变量V1V2的通用上限(例如,如果有约束{{1 }})。 假设存在这样的V1+V2 <=M,让我们介绍两个二进制变量Mb_1,它们分别表示b_2V1>= 300是否(表示值为1) :

V2>=500

现在,我们引入非负变量300 * b_1 <= V1 <= 300 * (1 - b_1) + M* b_1 500 * b_2 <= V2 <= 500 * (1 - b_2) + M* b_2 ,该变量将把a_1, h_1分解为小于300的部分(由V1表示)和包含超出部分的部分(由变量{表示) {1}}):

a_1

使用二进制变量的最后两个约束强制h_1仅在V1= a_1 + h_1 h_1 <= M b_1 300 b_1 <= a_1 <= 300 时为正,而h1V1 >= 300时始终为300。 让我们分别对a_1做同样的事情

V1 >= 300

那么成本函数将是

V2

让我指出,此解决方案可能在边界(例如边界)上不正确当使用V2= a_2 + h_2 h_2 <= M b_2 500 b_2 <= a_2 <= 500 时,因为二进制变量$1 * a_1 + $2 * h_1 + $3 * a_2 + $1.5 * h_2 ` 可能会达到值0,从而达到V1=300。 但是,如果卷b_1a_1=0, h_1>0始终是整数值,例如,可以解决此问题。看到 here

* J.Doe评论的附录

如果V1是整数,则边界问题将由V2处理,而不是上面V1的定义条件。

否,301 b_1 <=V_1 <=301 (1-b_1)+ M b_1无效,因为这意味着b_1,如果h_1 < = M b_1 - a_1意味着V1 = a_1 + h_1 <= M b_1-这是不正确的。

是的,V1 = 0是第一个方括号右上方的多余音量。

如果我们有多个价格范围,我们将需要另外2个变量:一个代表数量,该数量代表当前价格范围和下一个价格范围之间的数量V1 >=300所占的份额。 第二个变量应该是二进制指示符变量,如果交易量h_1在当前价格范围和下一个价格范围之间,则该变量应为V1