【问题标题】:Algorithm for calculating the most cost-effective chemical mix计算最具成本效益的化学混合物的算法
【发布时间】:2020-12-18 16:00:49
【问题描述】:

问题

我有四种不同的化学物质,我知道每种化学物质中下列化合物的比例如下:

|------------------|---------|---------|---------|---------|---------|
| Name             | ZrO2    | Al2O3   | SiO2    | Na2O    |  Price  |
|------------------|---------|---------|---------|---------|---------|
| AZS              | 30%     | 50%     | 13%     | 1.8%    | 328.95  |
|------------------|---------|---------|---------|---------|---------|
| Fine salt        | 25%     | 30%     | 43%     | 0.2%    | 203.95  |
|------------------|---------|---------|---------|---------|---------|
| ZDCF             | 63%     | 1%      | 33%     | 0.4%    | 789.47  |
|------------------|---------|---------|---------|---------|---------|
| AB fines         | 0%      | 95%     | 1%      | 4%      | 263.16  |
|------------------|---------|---------|---------|---------|---------|
| HJO              | 90%     | 1%      | 1%      | 0.2%    | 1315.79 |
|------------------|---------|---------|---------|---------|---------|

我需要将它们混合在一起以获得具有给定目标内容(表示为范围)的混合物:

|------------------|---------|---------|---------|
| Compound         | Min     | Target  | Max     |
|------------------|---------|---------|---------|
| Zr02             | 32%     | 33%     | 34%     |
|------------------|---------|---------|---------|
| Al203            | 49%     | 50%     | 52%     |
|------------------|---------|---------|---------|
| Si03             | 15%     | 16%     | 17%     |
|------------------|---------|---------|---------|
| Na20             | 1.3%    | 1.6%    | 2%      |
|------------------|---------|---------|---------|
  • 我需要找到最便宜的化学品组合,让我得到一个范围内所有值的混合物。
  • 如果可以在不使用更昂贵的混合物的情况下达到目标混合物,我不必使用混合物中的所有化学物质。

这里是代码沙箱的链接,上面的值在 typescript 中定义:https://codesandbox.io/s/cost-effective-mix-imvz5?file=/src/index.ts:2162-2169

我知道没有单一的解决方案,而是我需要生成一个包含所有可能组合的结果集,过滤掉没有目标混合物的组合,最后按价格对剩余的混合物进行排序。我只是不确定如何以编程方式表达这一点。

谢谢!

【问题讨论】:

  • 你有混合部分数据和总和的例子吗?
  • 第二张表代表了所需的示例,即混合物中的所有四种化合物都需要在第二张表中列出的范围内。
  • 不是缺少信息吗?如果我计算一份 AZS 和一份 Fine Salt,我怎么知道两者加起来的 ZrO2 百分比?换句话说,百分比表示什么? (体积百分比,重量百分比,分子计数?)如果体积,我们是否不需要知道 AZS 和细盐的体积之间的比率?如果重量,...与重量比相同吗?如果分子计数,......同样的事情?
  • 百分比表示每公吨的重量含量,例如AZS 含有 300 公斤的 Zr02

标签: javascript algorithm


【解决方案1】:

有趣的问题,似乎属于线性规划 (LP) 领域。使用jsLPSolver,并使用问题中提供的数据配置model 变量,我们得到以下代码...

<script src="https://unpkg.com/javascript-lp-solver/prod/solver.js"></script>

<script>
var model = {
    "optimize": "cost",
    "opType": "min",
    "constraints": {
        "Zr02": {"min": 0.32, "max": 0.34},
        "Al203": {"min": 0.49, "max": 0.52},
        "Si02": {"min": 0.15, "max": 0.17},
        "Na20": {"min": 0.013, "max": 0.02}
    },
    "variables": {
        "AZS": {
            "Zr02": 0.30,
            "Al203": 0.50,
            "Si02": 0.13,
            "Na20": 0.018,
            "cost": 328.95
        },
        "Fine Salt": {
            "Zr02": 0.25,
            "Al203": 0.30,
            "Si02": 0.43,
            "Na20": 0.002,
            "cost": 203.95
        },
        "ZDCF": {
            "Zr02": 0.63,
            "Al203": 0.01,
            "Si02": 0.33,
            "Na20": 0.004,
            "cost": 789.47
        },
        "AB Fines": {
            "Zr02": 0.00,
            "Al203": 0.95,
            "Si02": 0.01,
            "Na20": 0.04,
            "cost": 263.16
        },
        "HJO": {
            "Zr02": 0.90,
            "Al203": 0.01,
            "Si02": 0.01,
            "Na20": 0.002,
            "cost": 1315.79
        }
    },
};

var results = solver.Solve( model );
console.log( results );

let constraintResults = {};
for ( let v in results ) {
  if ( !( v === 'bounded' || v === 'feasible' || v === 'result' ) ) {
    for ( let c in model.constraints ) {
      constraintResults[ c ] = ( constraintResults[ c ] || 0.0 ) + model.variables[ v ][ c ] * results[ v ];
    }
  }
}
console.log( constraintResults );

</script>

不知道你的问题的最终目的,我不得不指出......

免责声明:您必须独立验证并确认此方法的结果以确定最低成本。对于因您使用本程序而导致的任何间接、偶然、特殊、后果性或惩罚性损害,或任何直接或间接产生的利润或收入损失,或其他无形损失,我概不负责。

请注意,MS Excel 有各种可用的求解器算法,可能值得在 MS Excel 中使用相同的约束和变量来交叉验证 jsLPSolver 的使用...

【讨论】:

  • 喜欢免责声明,谢谢。这似乎是合理的选择。
  • 我把免责声明放在那里,虽然 jsLPSolver 是开源的,而且似乎有合理的追随者,加上相当数量的分叉增加了信心,但我不确定有多少人使用它的人实际上了解底层算法。另外,解决方案可能会吐出局部最小值而不是全局最小值,尽管您的 LP 问题是相当连续的,因此可以肯定地说它是全局最小值。 Wrt Excel Solver,一个很好的资源是ablebits.com/office-addins-blog/2016/06/22/…
猜你喜欢
  • 1970-01-01
  • 2013-04-19
  • 2022-01-13
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多