传知代码-改进贪心算法(NGSOR)

news/2025/2/28 20:20:37/文章来源:https://www.cnblogs.com/chuanzhi-tech/p/18605508

一、算法背景及意义

(一)背包问题背景

背包问题是组合优化领域中的经典问题,具有广泛的实际应用场景,如资源分配、项目投资决策等。扩展简化折扣{0 - 1}背包问题(ESD{0 - 1}KP)是背包问题的一种变体,它在传统背包问题的基础上增加了一些复杂的约束条件,如物品的折扣系数以及每个项集中多个物品的选择情况,使得问题的求解更加困难。

(二)算法研究意义

  • 理论意义:NGSOR算法为ESD{0 - 1}KP提供了一种有效的求解方法,通过将问题转化为与多选择背包问题(MCKP)相关的形式,并结合特定的计算价值密度和选择物品的策略,丰富了背包问题的求解算法理论。
  • 实际意义:在实际应用中,能够帮助决策者在面对复杂的资源分配和项目选择问题时,更准确地找到满足约束条件且价值最大化的方案,提高决策效率和资源利用效率。

二、算法概述

原文链接

(一)总体思路

NGSOR算法主要通过计算物品的价值密度,并根据价值密度从高到低的顺序选择物品,同时考虑物品的折扣系数和背包容量限制,逐步构建满足条件的最优物品组合。

(二)关键步骤

  1. 计算价值密度
    • 对于每个项集中的物品,考虑不同的选择组合情况,计算出相应的价值和重量,进而得到价值密度。
  2. 选择物品
    • 根据价值密度对所有可能的物品选择进行排序。
    • 依次尝试选择每个物品,并检查选择后的物品组合是否满足背包容量限制。如果满足且总价值更大,则更新当前的最优物品组合。

三、算法详细步骤

(一)计算价值密度

  1. calculate_value_density函数中:
    • 首先获取物品价值系数数组P、质量系数数组W和折扣系数数组d的长度n
    • 初始化一个形状为(7*n, 2)的二维数组E,用于存储价值密度和原始索引信息。
    • 对于每个项集(索引为i0n - 1):
      • 计算所有可能的物品选择组合的价值Ps,包括单个物品选择以及不同物品组合的情况。
      • 计算相应的重量Ws,考虑了折扣系数的影响。
      • 将计算得到的价值密度Ps / Ws存储在E数组的对应行(7*i7*i + 7)的第一列,同时将原始索引i存储在第二列。
  2. 最终返回E数组,其中包含了所有物品选择组合的价值密度和原始索引信息。

(二)NGSOR算法主函数

  1. NGSOR函数中:
    • 获取物品价值系数数组P和质量系数数组W的长度n
    • 调用calculate_value_density函数计算价值密度数组E
    • E数组与一个包含从17*n的索引数组进行列拼接,得到一个新的数组,用于后续排序和索引操作。
    • 对新数组E按第一列(价值密度)进行降序排序,得到排序后的索引数组H
    • 初始化决策变量数组X为全零数组,形状为(3*n, 1),用于表示物品的选择情况。同时初始化一些变量用于记录当前最优解的总价值、总重量以及对应的物品选择数组。
  2. 然后进入循环:
    • 对于每个可能的物品选择(索引为i07*n - 1):
      • 根据排序后的索引H[i]计算物品所在项集索引t1和在项集中的选择情况索引t2,以及原始物品索引item_index
      • 复制当前决策变量数组X得到T,并根据t2的值设置对应项集中物品的选择情况selection
      • 计算选择T后的总重量Q,通过遍历每个项集,检查是否有物品被选择,如果有则计算相应的重量并累加。
      • 如果总重量Q满足背包容量限制C
        • 计算选择T后的总价值current_value,通过将对应项集中物品的价值与选择情况相乘并累加得到。
        • 如果current_value大于当前最优总价值best_value,则更新最优解相关变量,包括最优物品选择数组best_X、最优总价值best_value和最优总重量best_weight
  3. 最后返回最优总价值best_value、最优总重量best_weight和最优物品选择数组best_X

四、算法复杂度分析

(一)时间复杂度

  1. calculate_value_density函数中:
    • 有一个外层循环遍历n个项集,内部对于每个项集计算价值和重量组合需要常数时间(不考虑数组操作的时间复杂度),所以这部分时间复杂度为$O(n)$。
  2. NGSOR函数中:
    • 计算价值密度的calculate_value_density函数调用时间复杂度为$O(n)$。
    • 对价值密度数组E进行排序操作的时间复杂度通常为$O(7n log(7n))$,这里简化为$O(n log n)$(忽略常数系数)。
    • 循环部分有7n次迭代,每次迭代内部计算物品选择情况、总重量和总价值的操作时间复杂度为$O(n)$(主要是遍历项集的操作),所以循环部分时间复杂度为$O(n^2)$。
    • 综合来看,算法的时间复杂度主要由循环部分决定,为$O(n^2)$。

(二)空间复杂度

  1. calculate_value_density函数中:
    • 使用了一个形状为(7*n, 2)的数组E,所以空间复杂度为$O(n)$(忽略常数系数)。
  2. NGSOR函数中:
    • 使用了数组EHXbest_X等,其中E的大小为$O(n)$,H的大小为$O(n)$(排序后的索引数组),Xbest_X的大小为$O(n)$(因为是与项集数量相关的数组),所以空间复杂度为$O(n)$。

五、测试示例

  1. 在主函数中:
    • 使用np.random.seed(0)设置随机数种子,确保结果的可重复性。
    • 定义项集数量n5,随机生成价值系数数组P(形状为(n, 3))、质量系数数组W(形状为(n, 3))和折扣系数数组d[1, 0.8, 0.7]),以及背包最大载重C100
  2. 调用NGSOR函数并输出结果,包括最优总价值Optimal Value、最优总重量Optimal Weight和最优物品选择数组Optimal Selection(重塑为(n, 3)的形状)。

通过上述文档,可以清晰地了解NGSOR算法的复现过程,包括算法的背景意义、详细步骤、复杂度分析以及测试示例。
Description

部署方式

  • python 3.8以上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/852014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程控制、分享屏幕软件有哪些?首选ToDesk稳定又安全

随着现如今人们常用设备的增多,查看或操作另外设备中画面信息的需求也随之加增。虽然近几年应用市场上的远程控制和屏幕分享软件已有很多,但各有利弊且也并非全部都是安全、易用的;针对选择困扰,本篇内容,小编就为大家简要讲解几款比较知名远程共享屏幕产品的特点。ToDesk…

记录_信号完整性上机报告

《信 号 完 整 性》实验报告实验工程图:2.1阻抗突变处的反射:一、 实验目的本实验旨在研究信号在遇到传输线阻抗突变时产生的反射现象。通过设置不同阻抗的传输线,模拟和分析信号反射系数的变化,观察反射对信号波形的影响。实验的核心目标是理解阻抗突变如何影响信号传播,…

分享一个类似mqttx的mqtt测试工具MQTTSHARP

工具名称:MQTTSharp v1.0 使用环境:NET8初步实现了以下功能 1、多线程连接和接收数据 2、接收数统计 3、多线程发送 4、接收分主题和汇总两张展示方式 下一版将增加 1、离线接收 2、断线重连 3、发送统计 4、其他样式美化下载地址https://files.cnblogs.com/files/weipt/MQTTS…

推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue

推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue 很多同学都是用过 Elasticsearch 的 GUI 工具 Kibana ,但 Kibana 相对比较重,这篇文章,笔者推荐推荐一款轻量级且强大的 Elasticsearch GUI : elasticvue 。1 下载安装 进入: https://github.com/cars10/elasticv…

Android 设置沉浸式状态栏

原文地址: Android 设置沉浸式状态栏-Stars-One的杂货小窝标题所说的沉浸式状态栏实际就是底部有背景图,而状态栏是沉浸效果(可以在背景图上面展示的),如下面的这种效果:官方API实现 官方新版本出了个api,名为enableEdgeToEdge(),方便我们使用 这种方法主要适用Activity的整个背…

工作CASE_1 Hold Lot 已经Release但是Hold记录为空

HOLD LOT已经Release,但是对应HOLD记录的Release时间是空的说明: DWT_HOLD_LOT 的Hold Lot Hold Event(Hold,EditHoldComment,Release),且每个Event都为一条记录,每条记录都有对应的RELEASE_EVENT_TIME,HOLD_SYS_ID,HOLD_RELEASE HOLD LOT已经Release,但是对应HOLD记录的…

数字加密的基本原理和典型应用场景

一、数字加密的概念 1.1 加密概念 数据加密技术是指一条消息通过加密密钥和加密函数转换成无意义的密文,接收者通过解密函数和解密密钥将密文还原成明文。这样,我们就可以保护数据不被非法窃取和读取。提高计算机安全水平的基础是掌握数据加密的本质,数据加密由明文(未加密报…

obj文件如何转换成3DTiles文件?用这款软件帮你轻松搞定

概述 在三维数据处理中,OBJ文件是一种常见的三维模型文件格式,而3DTiles作为Cesium等三维平台广泛使用的数据格式,凭借其高效的流式加载能力,成为三维可视化领域的标配。如果你正面临将OBJ文件转换为3DTiles文件的挑战,不妨试试GISBox免费GIS工具箱。这款强大的工具不仅功…

数字图像处理 (四)

图像压缩 原因:减少表示图像所需数据量,去除多余数据 图像冗余(表达数据的信息多余)编码冗余 编码符号数多余实际所需 像素间冗余 领域像素间相关性 心里视觉冗余 视觉感知的重要程度信源编码:通过减少冗余数据来实现数据压缩的过程客观保真度准则-----图像质量(相似度)…

转载:【AI系统】感知量化训练 QAT

本文将会介绍感知量化训练(QAT)流程,这是一种在训练期间模拟量化操作的方法,用于减少将神经网络模型从 FP32 精度量化到 INT8 时的精度损失。QAT 通过在模型中插入伪量化节点(FakeQuant)来模拟量化误差,并在训练过程中最小化这些误差,最终得到一个适应量化环境的模型。…

基于AI的图片背景移除工具 - 无需联网+永久免费 (附下载地址)

背景介绍​ 继上一篇文章发布以来(在浏览器里就可以运行的本地AI模型 - 一键去除图片背景AI_基于webgpu的去背景ai演示), 有不少朋友反馈虽然一键去除图片背景工具很好用, 但对于一些小白用户来说, 自己启动本地服务器太过复杂, 并且需要远程加载模型资源, 导致很容易载入失败.…

Patroni中对主备切换、故障转移和命令行的流程整理

Patroni中对主备切换、故障转移和命令行的流程整理 1. 主备切换 主备切换(Switchover)是高可用性(High Availability,HA)系统中的一个重要操作,常见于数据库集群或分布式系统中。在主备架构中,通常有一个主节点和一个或多个备节点,备节点会复制主节点的数据并保持同步。…