0-1背包问题动态规划模型的Python解法

简介: 1.01背包问题背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V01背包即每种物品的数量为1,可以选择放或者不放😊




1.01背包问题


背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V


01背包即每种物品的数量为1,可以选择放或者不放😊


2.Python解决方案


算法代码:


import numpy as np
# 0-1背包算法
def knapsack(v, w, n, capacity):
    i = 0
    capacity = capacity + 1  # 初始化背包容量最大值
    m = np.zeros((n, capacity))  # 初始化
    x = np.zeros(n)
    for i in range(n):
        for j in range(capacity):
            if (j >= w[i]):
                m[i][j] = max(m[i - 1][j], m[i - 1][j - w[i]] + v[i])
            else:
                m[i][j] = m[i - 1][j]
    print('动态规划装载表:\n', m)
    capacity = capacity - 1
    for i in range(n - 1, 0, -1):
        if (m[i][capacity] == m[i - 1][capacity]):
            x[i] = 0
        else:
            x[i] = 1
            capacity -= w[i]
    x[0] = 1 if (m[1][capacity] > 0) else 0
    weight = 0
    value = 0
    print('装载的物品编号为:')
    for i in range(len(x)):
        if (x[i] == 1):
            weight = weight + w[i]
            value = value + v[i]
            print(' ', i + 1)
    print('装载的物品重量为:')
    print(weight)
    print('装入的物品价值为:')
    print(value)
    return m
file_name = ['input_assgin02_01.dat', 'input_assgin02_02.dat', 'input_assgin02_03.dat',
             'input_assgin02_04.dat', 'input_assgin02_05.dat']
# 循环读取文件数据
for file_name in file_name:
    a = np.loadtxt(file_name)
    n = int(a[0][0])  # 读取物品数量
    capacity = int(a[0][1])
    print('--------------------------------------------------------------------------------------------------')
    print('{0}文件中的测试结果:'.format(file_name))
    print('物品数量为:\n', n, '\n背包载重量为:\n', capacity)
    w = [0] * n  # 初始化物品重量列表
    value = [0] * n  # 初始化物品价值列表
    a = np.loadtxt(file_name, skiprows=1, dtype=int)
    for i in range(n):
        w[i] = int(a[i][0])  # 读取物品重量列表
        value[i] = int(a[i][1])  # 读取物品价值列表
    print('物品的重量列表为:\n', w, '\n物品的价值列表为:\n', value)
    knapsack(value, w, n, capacity)


数据文件,以input_assgin02_01.dat文件为例:


5 10
2 6
2 3
6 5
5 4
4 6


第一行的5和10分别是物品数量和背包载重量

随后的5行为物品的重量和价值

程序会得出动态规划装载表及最终的运算结果:


--------------------------------------------------------------------------------------------------
input_assgin02_01.dat文件中的测试结果:
物品数量为:
 5 
背包载重量为:
 10
物品的重量列表为:
 [2, 2, 6, 5, 4] 
物品的价值列表为:
 [6, 3, 5, 4, 6]
动态规划装载表:
 [[ 0.  0.  6.  6.  6.  6.  6.  6.  6.  6.  6.]
 [ 0.  0.  6.  6.  9.  9.  9.  9.  9.  9.  9.]
 [ 0.  0.  6.  6.  9.  9.  9.  9. 11. 11. 14.]
 [ 0.  0.  6.  6.  9.  9.  9. 10. 11. 13. 14.]
 [ 0.  0.  6.  6.  9.  9. 12. 12. 15. 15. 15.]]
装载的物品编号为:
  1
  2
  5
装载的物品重量为:
8
装入的物品价值为:
15


3.01背包问题例题


目录
相关文章
|
23小时前
|
机器学习/深度学习 人工智能 算法框架/工具
使用Python实现深度学习模型:智能家电控制与优化
使用Python实现深度学习模型:智能家电控制与优化
37 20
使用Python实现深度学习模型:智能家电控制与优化
|
6天前
|
机器学习/深度学习 数据采集 TensorFlow
使用Python实现深度学习模型:智能心理健康评估
使用Python实现深度学习模型:智能心理健康评估
26 2
使用Python实现深度学习模型:智能心理健康评估
|
2天前
|
机器学习/深度学习 数据可视化 算法框架/工具
使用Python实现深度学习模型:智能家庭安防系统
使用Python实现深度学习模型:智能家庭安防系统
13 1
|
3天前
|
机器学习/深度学习 数据可视化 搜索推荐
使用Python实现深度学习模型:智能睡眠监测与分析
使用Python实现深度学习模型:智能睡眠监测与分析
15 2
|
4天前
|
机器学习/深度学习 搜索推荐 TensorFlow
使用Python实现深度学习模型:智能饮食建议与营养分析
使用Python实现深度学习模型:智能饮食建议与营养分析
23 3
|
5天前
|
机器学习/深度学习 测试技术 数据处理
KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
Kolmogorov-Arnold网络(KAN)作为一种多层感知器(MLP)的替代方案,为深度学习领域带来新可能。尽管初期测试显示KAN在时间序列预测中的表现不佳,近期提出的可逆KAN混合模型(RMoK)显著提升了其性能。RMoK结合了Wav-KAN、JacobiKAN和TaylorKAN等多种专家层,通过门控网络动态选择最适合的专家层,从而灵活应对各种时间序列模式。实验结果显示,RMoK在多个数据集上表现出色,尤其是在长期预测任务中。未来研究将进一步探索RMoK在不同领域的应用潜力及其与其他先进技术的结合。
26 4
|
5天前
|
机器学习/深度学习 搜索推荐 算法框架/工具
使用Python实现深度学习模型:智能运动表现分析
使用Python实现深度学习模型:智能运动表现分析
25 1
|
3天前
|
Python
Python编程中的异常处理:理解与实践
【9月更文挑战第14天】在编码的世界里,错误是不可避免的。它们就像路上的绊脚石,让我们的程序跌跌撞撞。但是,如果我们能够预见并优雅地处理这些错误,我们的程序就能像芭蕾舞者一样,即使在跌倒的边缘,也能轻盈地起舞。本文将带你深入了解Python中的异常处理机制,让你的代码在面对意外时,依然能保持优雅和从容。
138 73
|
3天前
|
人工智能 数据挖掘 数据处理
揭秘Python编程之美:从基础到进阶的代码实践之旅
【9月更文挑战第14天】本文将带领读者深入探索Python编程语言的魅力所在。通过简明扼要的示例,我们将揭示Python如何简化复杂问题,提升编程效率。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开一扇通往高效编码世界的大门。让我们开始这段充满智慧和乐趣的Python编程之旅吧!
|
2天前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从零基础到实战应用
【9月更文挑战第15天】本文将引导读者从零开始学习Python编程,通过简单易懂的语言和实例,帮助初学者掌握Python的基本语法和常用库,最终实现一个简单的实战项目。文章结构清晰,分为基础知识、进阶技巧和实战应用三个部分,逐步深入,让读者在学习过程中不断积累经验,提高编程能力。