最大化支付&保持低于X的成本

时间:2017-11-08 17:31:55

标签: algorithm knapsack-problem minimize maximize

假设我有100个节点,每个节点由(支付,成本)

组成

是否存在一种算法来查找产生最多支出的X节点,而成本不会高于Y量?

我是解决算法问题的新手,我不确定是否有一个简单的排序算法,或者以某种方式从中得出加权树(不确定这会有什么帮助)。或者粗暴强迫它是唯一的方法?

示例
我们希望从3个节点获得最佳支付,而不需要超过20个成本

节点[] =(10,8),(7,8),(6,7),(5,3),(11,14)

最佳结果 :( 10,8),(7,8),(5,3)
支付= 22
成本= 19


如果您不知道答案,我仍然会感谢您能否指出我在术语方面的正确方向,例如它可能属于哪种算法类别,或者我应该研究什么。谢谢!

2 个答案:

答案 0 :(得分:0)

这是一个名为0/1 knapsack problem的着名问题,您可以使用大量方法来解决它。最简单 - 也是最有效的解决方案之一 - 是一种动态编程算法,一次只考虑一个元素。考虑到这个术语,我认为您应该能够在Stack Overflow上找到一些很好的资源,或者更广泛地在互联网上找到。

答案 1 :(得分:0)

您可以使用Integer Programming来解决问题。这是使用PuLP库的Python的完整解决方案:

import pulp

# Input parameters
nodes = [(10, 8), (7, 8), (6, 7), (5, 3), (11, 14)]

# Cost limit
max_cost = 20

# Create an LP problem object with maximization objective
problem = pulp.LpProblem("Knapsack", pulp.LpMaximize)

# Define decision variables
choices = pulp.LpVariable.dicts("choice", range(len(nodes)), lowBound = 0, upBound = 1, cat = pulp.LpInteger)

# Define optimization function (sum of payoffs)
problem += sum([nodes[i][0] * choices[i] for i in range(len(nodes))])

# Add cost constraint (sum of costs below max_cost)
problem += sum([nodes[i][1] * choices[i] for i in range(len(nodes))]) <= max_cost, "CostConstraint"

# Solve the problem
problem.solve()

# Print the solution
solution = [int(choices[i].value()) for i in range(len(nodes))] 
print(solution)

代码打印:

[1, 1, 0, 1, 0]