有没有一种方法可以编写将分层定价用作线性程序的成本函数?
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。
答案 0 :(得分:0)
这是可行的,只要有一个常量M>=0
,它是体积变量V1
和V2
的通用上限(例如,如果有约束{{1 }})。
假设存在这样的V1+V2 <=M
,让我们介绍两个二进制变量M
和b_1
,它们分别表示b_2
和V1>= 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
时为正,而h1
在V1 >= 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_1
和a_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
。