感谢您的时间。
我有一个线性程序,不知道如何表达一种约束形式,即使它是可能的。也许这里有人知道解决方案。
公司组装并销售由3种成分a,b和c组成的混合物,a = b = c。
每种成分可以来自2个工厂:f1和f2
每种成分的成本一整天都在波动,每个工厂之间都有所不同
每个工厂以夫妇名单的形式提供每种成分的成本:(成本,可用安装)。
我想表达的约束(不影响现有的目标函数),我不知道它是怎么回事:
避免选择比我的售价更高的制造成本。
例如,在时间t,成本可能是:
- for ingredient a :
f1 : (10$, 5.1), (11$, 10.2), (13$, 20.5)
f2 : (11$, 1.), (12$, 15.2), (13$, 6.9)
- for ingredient b :
f1 : (15$, 8.3), (16$, 20.), (18$, 10.7)
f2 : (15$, 4.2), (16$, 15.1), (18$, 19.3)
- for ingredient c :
f1 : (31$, 2.), (34$, 3.5), (37$, 14.9)
f2 : (30$, 4.7), (32$, 9.2), (35$, 12.4)
我想获得两个输入常量的最佳重新分区:maximumAllowedQuantity和maximumAllowedCost。
但目前我只处理maximumAllowedQuantity,我也想处理maximumAllowedCost(这是我的问题的目的)。
由每个成本的金额组成的结果解决方案将在输出变量中:
amountAF1_1, amountAF1_2, amountAF1_3
amountAF2_1, amountAF2_2, amountAF2_3
amountBF1_1, amountBF1_2, amountBF1_3
amountBF2_1, amountBF2_2, amountBF2_3
amountCF1_1, amountCF1_2, amountCF1_3
amountCF2_1, amountCF2_2, amountCF2_3
例如使用提供的示例数据,并且输入maximumAllowedQuantity = 15(没有maximumAllowedCost约束导致我不知道如何制定它,这就是我要求的),基于当下的某些目标(例如:我更愿意以相同的总成本公平划分工厂之间的金额,而不是偏向一家工厂),
我可以得到:
amountAF1_1 = 5.1, amountAF1_2 = 4.9, amountAF1_3 = 0.
amountAF2_1 = 0., amountAF2_2 = 5., amountAF2_3 = 0.
amountBF1_1 = 5., amountBF1_2 = 0., amountBF1_3 = 0.
amountBF2_1 = 4.2, amountBF2_2 = 5.8, amountBF2_3 = 0.
amountCF1_1 = 2., amountCF1_2 = 3.5, amountCF1_3 = 2.
amountCF2_1 = 4.7, amountCF2_2 = 2.8, amountCF2_3 = 0.
我可以总结成本:
5.1a at 10$, 4.9a at 11$, 5.0a at 12$,
9.2b at 15$, 5.8b at 16$,
4.7c at 30$, 2.0c at 31$, 2.8c at 32$, 3.5c at 34$, 2.0c at 37$
如果我们按成本分解产生的混合物,我们得到:
4.7 mixtures at 10 + 15 + 30 = 55$,
0.4 mixtures at 10 + 15 + 31 = 56$,
1.6 mixtures at 11 + 15 + 31 = 57$,
2.5 mixtures at 11 + 15 + 32 = 58$,
0.3 mixtures at 11 + 16 + 32 = 59$,
0.5 mixtures at 11 + 16 + 34 = 61$,
3.0 mixtures at 12 + 16 + 34 = 62$,
2.0 mixtures at 12 + 16 + 37 = 65$,
此处最高费用为65美元 但如果我的售价是60美元,为了避免亏钱: 如何添加约束maximumAllowedCost = 60 $?
nb:我们不能简单地采用之前的结果(没有maximumAllowedCost约束)并以成本>去除金额。 60美元,因为如果总量较小,我的目标函数将以成本< = 60给出另一个重新分配:这里9.5(15 - 0.5 - 3.0 - 2.0)而不是之前的15。 ...
由于
答案 0 :(得分:1)
让我重申你的问题。每个工厂f
都会为您提供i
成分的出价列表(价格数量对)。让我们将j
出价写入(和索引)为
(price[j, f, i], quantity[j, f, i])
听起来您的目标是决定接受哪些出价,但要受制于获利的限制。
让x[j, f, i]
代表您从工厂j
购买的成分i
的出价数量f
。您无法购买负数量的原料,而且您购买的产品数量不能超过工厂提供的数量,因此我们有
0 <= x[j, f, i] <= quantity[j, f, i] for all j, f, i
x
是您的决策变量。
您接受j
出价的费用为price[j, f,i] * x[j, f, i]
。
因此,您为所有工厂支付的成本总成本由
给出sum_{j, f, i} price[j, f, i]*x[j, f, i]
让m
表示您使用这些成分创建的混合物的量。 m
将是一个决策变量。混合物由每种成分的相等份数组成。因此,您可以创造的混合物的数量受到最稀缺成分的限制。那是
m <= sum_{j, f} x[j,f,i] for all i
你出售一个单位的混合物赚60美元(比方说)。因此,您的收入为60*m
。
您赚取的利润是收入 - 成本或
60*m - sum_{j, f, i} price[j, f, i]*x[j, f, i]
为确保制造成本低于或等于您的销售价格,您只需确保您的利润是非负的。或
60*m - sum_{j, f, i} price[j, f, i]*x[j, f, i] >= 0
这些是你的约束,你可以把它放在你喜欢的任何目标上。例如,您可能希望最大化您的利润,同时尽可能在工厂之间平均分配您的购买。
要执行此操作,请y[f]
表示从工厂f
购买的数量。然后
y[f] == sum_{j, i} x[j, f, i] for all f
对于每对工厂f1, f2
,我们可以计算购买数量的差异z[f1, f2]
z[f1, f2] >= y[f1] - y[f2] for all factory pairs (f1, f2)
z[f1, f2] >= y[f2] - y[f1] for all factory pairs (f1, f2)
这为我们提供了以下线性程序
minimize -p + sum_{all factory pairs f1, f2} z[f1, f2]
x,m,y,z,p
subject to p == 60*m - sum_{j, f, i} price[j, f, i]*x[j, f, i]
y[f] == sum_{j, i} x[j, f, i] for all f
m <= sum_{j, f} x[j, f, i] for all i
z[f1, f2] >= y[f1] - y[f2] for all factory pairs (f1, f2)
z[f2, f1] >= y[f2] - y[f1] for all factory pairs (f1, f2)
x[j, f, i] <= quantity[j, f, i] for all j, f, i
0 <= x[j, f, i] for all j, f, i
0 <= m
0 <= y[f] for all f
0 <= p