找到最便宜的物品以获得一定数量资源的算法

时间:2014-12-29 22:40:15

标签: algorithm math

我正在寻找一种能够找到最便宜,最有效的资源购买方式的算法。

示例数据(让我们以含有矿物质的岩石为基础)

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个案例,并获得最佳的石头组合,以最低的价格(浪费)满足所有要求。

2 个答案:

答案 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

Knapsack problem

您正在谈论的贪婪方法会给您一个不理想的解决方案。

答案 1 :(得分:0)

在我看来,如果你遵循你的第一个想法,这将是最好的方式。矿物相对于总量的百分比可以得到最好的结果:

例如,如果您搜索矿物质铁:

摇滚A:300/1000 = 30%铁

岩石F:30000/30550 = 98.2%铁