我正在寻找一种能够找到最便宜,最有效的资源购买方式的算法。
示例数据(让我们以含有矿物质的岩石为基础)
Rock A (Contains 300 units of iron, 200 units of copper, 500 units of silver)
Rock B (Contains 150 units of iron, 400 units of copper, 100 units of silver)
Rock C (Contains 180 units of iron, 300 units of copper, 150 units of silver)
Rock D (Contains 200 units of iron, 350 units of copper, 80 units of silver)
Rock E (Contains 220 units of iron, 150 units of copper, 400 units of silver)
Rock F (Contains 30 000 units of iron, 150 units of copper, 400 units of silver)
每个单位花费1.因此,岩石花费了内部单位的总和。
例:
First case, needs 2600 units of Copper
Second case needs 5000 units of Iron
Third case needs 4600 units of Silver
我可以使用什么算法来估算哪些类型的岩石需要支付最低单价(尽可能低损失)。
那个案例我想出了一个算法,可以计算出每个项目浪费的比例与所需材料的比率 在铁的情况下,仍然比率可能导致我获得摇滚.F.因为那将是最便宜的比例。但是石头的整体价值很大。由于我不需要30 000单位的铁,因此可以获得价值较低的宝石。
其次,方式更复杂。是结合所有3个案例,并获得最佳的石头组合,以最低的价格(浪费)满足所有要求。
答案 0 :(得分:3)
这是无界的背包问题,但不是最大化,而是需要最小化。您需要的资源量是" weight"而成本就是"价值"。
这些是重写的属性:
m[0] = 0
m[w] = min(v[i] + m[w - w[i]]) for w[i] < w
其中m[j]
是j
资源量的解决方案,v[i]
是i
岩石的成本。
这是一些伪代码:
m[0] = 0
for i = 1 to W: # W is your target amount of resource i.e. 2600, 500, 4600
minv = max_value_possible
# rocks is the vector with the <cost,resource> pairs of each rock e.g.<650,150>
# for Rock B, iron
for r in rocks:
if r.second < i: minv = min(minv, m[i - r.second] + r.first)
m[i] = minv
您正在谈论的贪婪方法会给您一个不理想的解决方案。
答案 1 :(得分:0)
在我看来,如果你遵循你的第一个想法,这将是最好的方式。矿物相对于总量的百分比可以得到最好的结果:
例如,如果您搜索矿物质铁:
摇滚A:300/1000 = 30%铁
岩石F:30000/30550 = 98.2%铁