给定一些输入,找到图边的最佳权重以最大化一些输出
Posted
技术标签:
【中文标题】给定一些输入,找到图边的最佳权重以最大化一些输出【英文标题】:Given some input, find the optimal weightings for edges of a graph to maximize some output 【发布时间】:2022-01-05 22:18:35 【问题描述】:我有一个有向图,它通过配方(边)描述项目(节点)之间的关系。
食谱的简单示例:2 Iron Ore => 1 Iron Ingot
。
我想为每个配方找到一个权重(即每个配方应该应用的次数),这样给定一些起始项目数,它会产生指定项目的最大数量。
我如何才能找到每个食谱的权重?
注意:所有权重都必须是非负数(可以是小数)。任何加权都不会导致需要的输入超过可用数量。
这是我要解决的主要问题,但在此之后,我要解决的下一个问题是考虑能源使用情况。每个配方要么使用一定量的能量,要么产生一定量的能量。
我如何确保在找到权重时,能源生产减去能源消耗是非负的?
提前感谢您的任何建议:)
【问题讨论】:
可以使用多种配方制作相同的产品吗? 同一个项目有不同的食谱吗?否则我不清楚这个问题是什么。 能源生产减去能源消耗是非负数你想如何处理产生的能源大于消耗的能源的情况? @Dave 是的,同一个项目可以有多个食谱。 @c0der 是的,同一个项目可以有多个食谱。如果产生的能量多于消耗的能量,这是一个有效的情况。 【参考方案1】:我已经设法通过放弃图形结构并将问题视为linear programming problem 来解决这个问题。
如果将问题视为max flow problem,则可能可以使用图形结构,但我还没有研究过。
这是求解最大铁锭的 LP 的一个小例子:
Maximize
iron_ingot: 30 recipe_iron_ingot + 50 recipe_iron_alloy_ingot + 65 recipe_pure_iron_ingot
Subject To
iron_ore: 30 recipe_iron_ingot + 20 recipe_iron_alloy_ingot + 35 recipe_pure_iron_ingot <= 70380
copper_ore: 20 recipe_iron_alloy_ingot <= 28860
Bounds
0 <= recipe_iron_ingot
0 <= recipe_iron_alloy_ingot
0 <= recipe_pure_iron_ingot
End
这表示每分钟输入 70380 铁矿石、每分钟 28860 铜矿石和无限量的水。它分析了制作铁锭的 3 种不同配方。
结果是:
0×铁锭配方 1443×铁合金锭配方 1186.29 × 纯铁锭配方
相当于每分钟 149258.85 个铁锭。
这还没有考虑到电力生产/消耗,但应该很容易通过将电力作为输入/输出来添加,就像对待物品的方式一样。
【讨论】:
最好的答案是你自己找到的那些以上是关于给定一些输入,找到图边的最佳权重以最大化一些输出的主要内容,如果未能解决你的问题,请参考以下文章