python 回溯法 子集树模板 系列 —— 3、0-1背包问题

简介:

问题

给定N个物品和一个背包。物品i的重量是Wi,其价值位Vi ,背包的容量为C。问应该如何选择装入背包的物品,使得放入背包的物品的总价值为最大?

分析

显然,放入背包的物品,是N个物品的所有子集的其中之一。N个物品中每一个物品,都有选择不选择两种状态。因此,只需要对每一个物品的这两种状态进行遍历。

解是一个长度固定的N元0,1数组。

套用回溯法子集树模板,做起来不要太爽!!!

代码

'''0-1背包问题'''

n = 3            # 物品数量
c = 30           # 包的载重量
w = [20, 15, 15] # 物品重量
v = [45, 25, 25] # 物品价值

maxw = 0  # 合条件的能装载的最大重量
maxv = 0  # 合条件的能装载的最大价值
bag = [0,0,0] # 一个解(n元0-1数组)长度固定为n
bags = []     # 一组解
bestbag = None # 最佳解


# 冲突检测
def conflict(k):
    global bag, w, c
    
    # bag内的前k个物品已超重,则冲突
    if sum([y[0] for y in filter(lambda x:x[1]==1, zip(w[:k+1], bag[:k+1]))]) > c:
        return True
    
    return False


# 套用子集树模板
def backpack(k): # 到达第k个物品
    global bag, maxv, maxw, bestbag
    
    if k==n: # 超出最后一个物品,判断结果是否最优
        cv = get_a_pack_value(bag)
        cw = get_a_pack_weight(bag)
        
        if cv > maxv : # 价值大的优先
            maxv = cv
            bestbag = bag[:]
            
        if cv == maxv and cw < maxw: # 价值相同,重量轻的优先
            maxw = cw
            bestbag = bag[:]
    else:
        for i in [1,0]: # 遍历两种状态 [选取1, 不选取0] 
            bag[k] = i  # 因为解的长度是固定的
            if not conflict(k): # 剪枝
                backpack(k+1)


# 根据一个解bag,计算重量
def get_a_pack_weight(bag):
    global w
    
    return sum([y[0] for y in filter(lambda x:x[1]==1, zip(w, bag))])
    
    
# 根据一个解bag,计算价值
def get_a_pack_value(bag):
    global v
    
    return sum([y[0] for y in filter(lambda x:x[1]==1, zip(v, bag))])
    
    
# 测试
backpack(0)
print(bestbag, get_a_pack_value(bestbag))

效果图

709432-20170530112751930-1678270843.jpg

本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/6920056.html ,如需转载请自行联系原作者
相关文章
|
19天前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
3月前
|
SQL 前端开发 JavaScript
Python 教程之 Django(10)模板
Python 教程之 Django(10)模板
34 0
|
3月前
|
Python
Python 采集77个教学课件PPT模板
Python 采集77个教学课件PPT模板
25 0
|
1月前
|
机器学习/深度学习 算法 数据挖掘
请解释Python中的决策树算法以及如何使用Sklearn库实现它。
决策树是监督学习算法,常用于分类和回归问题。Python的Sklearn库提供了决策树实现。以下是一步步创建决策树模型的简要步骤:导入所需库,加载数据集(如鸢尾花数据集),划分数据集为训练集和测试集,创建`DecisionTreeClassifier`,训练模型,预测测试集结果,最后通过`accuracy_score`评估模型性能。示例代码展示了这一过程。
|
20小时前
|
机器学习/深度学习 算法 数据挖掘
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享-2
PYTHON银行机器学习:回归、随机森林、KNN近邻、决策树、高斯朴素贝叶斯、支持向量机SVM分析营销活动数据|数据分享
15 1
|
5天前
|
机器学习/深度学习 存储 算法
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
PYTHON集成机器学习:用ADABOOST、决策树、逻辑回归集成模型分类和回归和网格搜索超参数优化
26 7
|
5天前
|
机器学习/深度学习 数据可视化 算法
PYTHON用决策树分类预测糖尿病和可视化实例
PYTHON用决策树分类预测糖尿病和可视化实例
14 0
|
机器学习/深度学习 算法 Python
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户
16 0
|
6天前
|
BI 开发者 数据格式
Python代码填充数据到word模板中
【4月更文挑战第16天】
|
6天前
|
机器学习/深度学习 算法 Python
python在Scikit-learn中用决策树和随机森林预测NBA获胜者
python在Scikit-learn中用决策树和随机森林预测NBA获胜者
17 0