algorithm - 如何从给定的产品及其属性中找到最小的成本?
问题描述
我的熔化材料应该达到所需的性能。将有 2 套材料 1) 废料 2) 铁合金 目标:以最低成本达到每个元素的目标值 For Ex. 经过 1000 Kg 混合后,我们希望达到以下特性 Carbon - 2.4% Silicon - 2.1 % p - 0.015% S - 0.015%
现在,从给定的一组材料中,我们已经定义了我们可以从 CRC(即废料)中获得多少碳,我们可以从增碳剂(铁合金)中获得 78% 的碳。这意味着如果我们使用 100 公斤 CRC,我们可以获得 1.1 碳,但我们使用 5 公斤增碳剂我们可以获得 3.9 碳。所以我们拥有每种材料的所有元素值。此外,我们有每种材料的价格。像CRC是25卢比/公斤。增碳剂为1500 / kg。所以相应地我们需要以这样的方式混合材料,它应该以最低成本达到目标值,比如达到 2.4% 的碳,如果我们使用 100 公斤废料,我们可以获得 1.1% 的碳,需要 1.4 我们可以从 1.8 公斤的增碳剂中获得花费 2500 + 2700 = 5200 卢比。可以是任意数量的组合,我们需要从中找到可能的成本最低的解决方案,但条件是要求材料应该是可数的,就像答案应该是 701.5 一样,但它不应该是 701.115,因为在实际混合时没有人会测量 115 克。所以我们需要找到尽可能低的成本,为此应该使用多少公斤的材料?这是一个元素的示例,但我们应该实现所有目标元素。
输入数据:废料及其元素值及其成本
CRC 废料 C% - 1.5 Si% - 0.9 成本:25 / kg
生铁 C% - 1.9 Si% - 1.1 成本:28 / kg
MS 废料 C% - 1.4 Si% - 0.9 成本:23.5 / kg
废钢 c% - 1.8 Si% - 1.5 成本:29 / kg
铁合金
增碳剂 C% - 80 Si% 0 成本:1000 / kg
硅铁 C% - 0 Si %- 65 S% 10 成本:1200 / kg
锰铁 c% - 0 S% - 20 P% - 15 成本:500 / kg
铜 cu% - 98 成本:1500 / kg
所需值在上面定义。现在,我们需要找到 1000 公斤的废料混合物,并以成本最佳的方式实现铁合金的属性使用。
是否有任何算法可用于此类问题?或者有什么方法可以帮助我找到租赁成本?
谢谢你。
解决方案
所有这些都可以描述为一个线性程序。一旦你有了这个,你可以把它插入你最喜欢的求解器,如果可行的话,你可以得到一个解决方案。
您要最小化的优化目标是总成本:
f = w_CRC * cost_CRC + w_pigIron * cost_pigIron + ...
w_...
是每种材料的权重,代表优化变量。成本是常数。
然后添加以下约束来模拟您的需求:
w_CRC + w_pigIron + w_MS + ... = totalWeight
w_CRC >= 0, w_pigIron >=0, w_MS >= 0 ...
w_CRC * C_CRC + w_pigIron * C_pigIron + ... = desiredCWeight
w_CRC * Si_CRC + w_pigIron * Si_pigIron + ... = desiredSiWeight
C_
和Si_
是元素在相应材料中的比例,desiredXWeight = totalWeight * desiredXProportion
。
如果您想确保您的结果是“不错”的数字,您可以添加完整性约束并使其成为整数线性程序。例如,如果您想允许权重到小数点后一位,您可以将权重替换w_X
为0.1 * u_X
整数权重因子并求解u_X
。然后,您得到实际重量w_X = 0.1 * u_X
。但是,我假设原始公式已经为您提供了足够好的数字,其中大多数权重可能为零。此外,通过施加完整性约束,您可能会使问题变得不可行。因此,可能有必要使这些完整性约束变软。您可以通过将优化目标更改为
f = (... what we had before...) + a * ((w_CRC - 0.1 * u_CRC)^2 + (w_pigIron - 0.1 * u_pigIron)^2 + ...)
在这里,您将添加整数变量u_X
并使您的权重w_X
接近表示的权重。该常数a
表示您希望执行此约束的程度。
推荐阅读
- sql - UPDATE 查询卡在执行 regexp_replace 函数
- python - 在 SQLAlchemy 中,如何在使用乐观锁更新后获取受影响的行?
- cs-cart - 我们如何在安装后使 cs cart api 工作?
- xamarin - 如何在 Xamarin MAC 平台中更改选取器背景颜色
- c++ - 为 opengl 纹理加载图像时,stb_image 不会垂直翻转
- tcp - 在 TCP 中快速重传后,接收方发送的 ACK 号是多少?
- android - 将字节数组复制到分配中的Android渲染脚本问题
- c# - 如何使用 POCO 类反序列化包含数字的 JSON 属性?
- javascript - 在 react/redux 中调用 store.subscribe 中的函数
- java - 谷歌地图 API:如何使标记可点击?