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背包问题例题


目录
相关文章
|
3月前
|
机器学习/深度学习 数据采集 数据挖掘
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
基于 GARCH -LSTM 模型的混合方法进行时间序列预测研究(Python代码实现)
|
2月前
|
机器学习/深度学习 数据采集 并行计算
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
多步预测系列 | LSTM、CNN、Transformer、TCN、串行、并行模型集合研究(Python代码实现)
251 2
|
2月前
|
算法 安全 新能源
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
基于DistFlow的含分布式电源配电网优化模型【IEEE39节点】(Python代码实现)
148 0
|
5月前
|
存储 机器学习/深度学习 人工智能
稀疏矩阵存储模型比较与在Python中的实现方法探讨
本文探讨了稀疏矩阵的压缩存储模型及其在Python中的实现方法,涵盖COO、CSR、CSC等常见格式。通过`scipy.sparse`等工具,分析了稀疏矩阵在高效运算中的应用,如矩阵乘法和图结构分析。文章还结合实际场景(推荐系统、自然语言处理等),提供了优化建议及性能评估,并展望了稀疏计算与AI硬件协同的未来趋势。掌握稀疏矩阵技术,可显著提升大规模数据处理效率,为工程实践带来重要价值。
207 58
|
3月前
|
机器学习/深度学习 算法 调度
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
【切负荷】计及切负荷和直流潮流(DC-OPF)风-火-储经济调度模型研究【IEEE24节点】(Python代码实现)
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
200行python代码实现从Bigram模型到LLM
本文从零基础出发,逐步实现了一个类似GPT的Transformer模型。首先通过Bigram模型生成诗词,接着加入Positional Encoding实现位置信息编码,再引入Single Head Self-Attention机制计算token间的关系,并扩展到Multi-Head Self-Attention以增强表现力。随后添加FeedForward、Block结构、残差连接(Residual Connection)、投影(Projection)、层归一化(Layer Normalization)及Dropout等组件,最终调整超参数完成一个6层、6头、384维度的“0.0155B”模型
251 11
200行python代码实现从Bigram模型到LLM
|
6月前
|
机器学习/深度学习 人工智能 算法
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
本文介绍了如何使用 Python 和 YOLO v8 开发专属的 AI 视觉目标检测模型。首先讲解了 YOLO 的基本概念及其高效精准的特点,接着详细说明了环境搭建步骤,包括安装 Python、PyCharm 和 Ultralytics 库。随后引导读者加载预训练模型进行图片验证,并准备数据集以训练自定义模型。最后,展示了如何验证训练好的模型并提供示例代码。通过本文,你将学会从零开始打造自己的目标检测系统,满足实际场景需求。
4509 0
Python+YOLO v8 实战:手把手教你打造专属 AI 视觉目标检测模型
|
存储 算法 决策智能
Python算法题解:动态规划解0-1背包问题
Python算法题解:动态规划解0-1背包问题
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
208 102
|
2月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
238 104

推荐镜像

更多