仅限于 N 元解的背包算法

2023-12-01

这段摘自 CRAN 文档的 adagio 函数 knapsack() 的功能符合预期——它用利润向量解决了背包问题p,权重向量w,和容量cap,在所选元素的总权重不超过容量的约束下,选择利润最大的元素子集。

library(adagio)
p <- c(15, 100, 90, 60, 40, 15, 10,  1)
w <- c( 2,  20, 20, 30, 40, 30, 60, 10)
cap <- 102
(is <- knapsack(w, p, cap))

如何向解决方案添加向量长度约束并仍然获得最佳答案?例如上面的练习,但所选子集必须恰好包含三个元素。


一种方法是将问题显式建模为混合整数线性规划问题;以这种方式显式建模的优点是,像“恰好选择三个对象”这样的线性约束很容易建模。下面是 R 中 lpSolve 包的示例,其中背包问题中的每个元素都由混合整数线性规划公式中的二进制变量表示。我们精确选择三个元素的要求是由要求决策变量之和恰好为 3 的约束捕获的。

library(lpSolve)
p <- c(15, 100, 90, 60, 40, 15, 10,  1)
w <- c( 2,  20, 20, 30, 40, 30, 60, 10)
cap <- 102
exact.num.elt <- 3
mod <- lp(direction = "max",
          objective.in = p,
          const.mat = rbind(w, rep(1, length(p))),
          const.dir = c("<=", "="),
          const.rhs = c(cap, exact.num.elt),
          all.bin = TRUE)
# Solution
which(mod$solution >= 0.999)
# [1] 2 3 4

# Profit
mod$objval
# [1] 250

在从最优解中子集化的同时adagio:::knapsack对于当期望子集大小小于标准问题最优解的基数时,函数到期望大小的函数是一个合理的启发式,存在标准背包问题的最优解和大小的最优解的例子- 约束背包问题是不相交的。例如,考虑以下问题数据:

p <- c(2, 2, 2, 2, 3, 3)
w <- c(1, 1, 1, 1, 2, 2)
cap <- 4
exact.num.elt <- 2

在容量为 4 且没有尺寸限制的情况下,标准背包问题将选择利润为 2、重量为 1 的四个元素,得到总利润 8。但是,在尺寸限制为 2 的情况下,最优解是选择利润为 3、重量为 2 的两个元素2、获得利润总额6。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅限于 N 元解的背包算法 的相关文章

  • 从数据框中绘制多条平滑线

    我对 R 比较陌生 我正在尝试绘制从 csv 文件加载的数据框 数据由 6 列组成 如下所示 xval col1 col2 col3 col4 col5 第一列 xval 由一系列单调递增的正整数 例如 10 40 60 等 组成 其他列
  • 将维基百科中的表格加载到 R 中

    我正在尝试从以下 URL 将最高法院法官表加载到 R 中 https en wikipedia org wiki List of Justices of the Supreme Court of the United States http
  • 如何将旋转的 NetCDF 转换回正常的纬度/经度网格?

    我有一个带有旋转坐标的 NetCDF 文件 我需要将其转换为正常的纬度 经度坐标 经度为 180到180 纬度为 90到90 library ncdf4 nc open dat nf 对于尺寸 它显示 1 5 variables exclu
  • R - 基于列名称的子集

    我的数据框有超过 120 列 变量 我想根据列名称创建子集 例如 我想创建一个子集 其中列名称包含字符串 心情 这可能吗 我一般用 SubData lt myData grep whatIWant colnames myData 我很清楚
  • StatET调试工具

    我想我只是很密集 但我似乎无法弄清楚如何在 Eclipse 中的 R 中使用调试工具 StatET 插件 有人有关于这个主题的任何提示或教程吗 StatET 2 00 现在对高级 可视化调试提供实验性支持 需要 Eclipse 3 6 或
  • 无法将“gather”输出的列名称更改为默认名称以外的任何名称

    我正在尝试使用gather in the tidyr包 但我无法更改默认名称的输出列名称 例如 df data frame time 1 100 a 1 100 b 101 200 df long df gt gather foo bar
  • 获取包含矩阵行内最大值的列名称,该矩阵在数组内包含单独的最大值

    例如给出 dim1 lt c P PO C T dim2 lt c LL RR R Y dim3 lt c Jerry1 Jerry2 Jerry3 Q lt array 1 48 c 4 4 3 dimnames list dim1 di
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • 安装 2.15 后 ggplot2 中的 alpha 通道不起作用

    更新到 R 2 15 后 ggplot 中的 alpha 通道似乎不再起作用 plot rnorm 100 rnorm 100 bg cc000055 pch 21 工作得很好但是 qplot rnorm 100 rnorm 100 col
  • 斯皮尔曼相关性和联系

    我正在一小组配对排名上计算斯皮尔曼的 rho 斯皮尔曼因处理领带不当而闻名 例如 取2组8个排名 即使两组中有6个是平局 相关性仍然很高 gt cor test c 1 2 3 4 5 6 7 8 c 0 0 0 0 0 0 7 8 met
  • 如何在R中实现countifs函数(excel)

    我有一个包含 100000 行数据的数据集 我尝试做一些countifExcel 中的操作 但速度慢得惊人 所以我想知道R中是否可以完成这种操作 基本上 我想根据多个条件进行计数 例如 我可以指望职业和性别 row sex occupati
  • 闪亮井板宽度

    library shiny library shinydashboard ui lt dashboardPage dashboardHeader dashboardSidebar dashboardBody wellPanel tags d
  • 识别包含字符串的行的最快方法[重复]

    这个问题在这里已经有答案了 我有一个字符串数据框 尺寸为 30 列 x 500 万行 我想识别包含任何预定义字符串列表的行 有没有比下面我的 apply any 方法更快的方法 这是一个可重现的示例 请注意 此示例中的字符串是随机数 但在我
  • ggplot 的每个方面都有不同的 `geom_hline()`

    这个问题在这里已经有答案了 library tidyverse ggplot mpg aes cty hwy geom point facet grid year fl geom hline yintercept mean mpg hwy
  • 使用非标准评估公式

    我正在创建一个使用的包非标准评价 http adv r had co nz Computing on the language html跟踪列的含义 该包在函数之间传递数据框 这些函数执行同一组列的各种操作 非标准评估对此非常有用 my s
  • rPlot 工具提示问题

    我有一个使用 rCharts 工具提示的简单示例 但似乎不起作用 set seed 1 test lt data frame x rnorm 100 y rnorm 100 rPlot y x data test type point to
  • 如何使用合并或替换来更新 R 中具有多列的表

    我想做一些与这个问题非常相似的事情 如何使用 merge 更新 R 中的表 https stackoverflow com questions 3190118 how to use merge to update a table in r
  • autoplot.microbenchmark 实际绘制了什么?

    根据文档 microbenchmark autoplot 使用 ggplot2 生成更清晰的微基准计时图 凉爽的 让我们尝试一下示例代码 library ggplot2 tm lt microbenchmark rchisq 100 0 r
  • 如何绘制 Voronoi 曲面细分的多边形而不是线段?

    我找到了一种使用 ggplot2 绘制 Voronoi 曲面细分的分段的方法 library deldir library ggplot2 library ggthemes set seed 123 df lt data frame lat

随机推荐

  • c# Visual Studio Project Installer 将文本框中的数据保存到文本文件中

    经过大量研究后 我必须询问你们才能让我的项目最终运行 我想将用户放入 Visual Studio 项目安装程序的文本框中的数据保存到文本文件中 我读过不同的文章 还有这篇文章 C Visual Studio 项目安装程序从文本框检索数据 但
  • Android Studio 与 opencv for android ndk,未找到 opencv 头文件

    我正在使用 Android Studio 进行 Android OpenCV 开发 但是当我编译在 eclipse 中正常的项目时 出现以下错误 D software AndroidStudioProjects CameraMe openC
  • WordPress 上的评论作者链接

    在 WordPress 表单中 当您以访客身份留下评论时 会出现一个网站字段来填写您的网址 如果我们填写该框 我们可以通过调用此函数来获取链接 但是 如果您已登录并且未在您的个人资料中添加该网站 那么当您发表评论时 您的用户名上没有链接 我
  • npm 错误:无法建立隧道套接字,原因=connect ETIMEDOUT

    我有一个使用 Rails 框架并实现 AngularJs 作为前端一部分的应用程序 我已将所有内容推送到 Heroku 并安装了 Heroku Toolbelt 但是当我尝试使用 heroku run rake db migrate 迁移数
  • ASP.NET MVC 和 Ajax,并发请求?

    AJAX 新手来了 目前 在我的 ASP NET MVC Web 应用程序中 我的 AJAX 请求似乎正在批量或排队 我不确定 在前一个请求完成之前 似乎没有任何请求完成 我该如何获得独立返回的请求 我不一定希望有人给我答案 但也许一些可以
  • 任务“:app:checkDebugAarMetadata”执行失败

    我在运行我的应用程序时收到此错误 Execution failed for task app checkDebugAarMetadata gt Could not resolve all files for configuration ap
  • 增量定义?

    无论如何 每次使用它时都有一个定义的增量吗 例如 int a ADEFINE int b ADEFINE a 为 1 b 为 2 您可以使用 COUNTER 尽管这不是标准的 MSVC 和 GCC 都支持它 如果你可以使用boost 预处理
  • p:fileUpload 在哪里保存我的文件?

    我的页面上有一个 p fileUpload 函数 每次上传文件时 我似乎都无法在 web xml 文件中指定的文件夹中找到它 我已将以下 jar 添加到我的库中 primefaces 3 2 jar commons io 2 3 jar c
  • SVG tspan 未与 text-anchor="end" 对齐的问题

    我有一些这样的代码 svg font family Verdana sans serif color 000 key font size 75 overflow visible caphgh font weight bold keynor
  • 这段代码的作用是什么?

    我不太确定这意味着什么或它在做什么 有人可以详细说明吗 Player player Player sender 它获取发送者引用的对象 并尝试将其转换为 Player 类型 Java 对象是强类型的 这意味着您必须声明对象的类型 如果发送者
  • 如何在 TFS 中反序列化和序列化构建过程参数

    我正在尝试使用 TFS 2013 API 创建新的构建定义 我必须引用的流程模板包含几个自定义活动和参数 创建构建定义时 一些属性值需要动态更新 所以我尝试使用以下代码反序列化过程参数 IDictionary
  • 多个自定义滚动条

    我想知道的是是否可以在同一页面上有多个定制的 webkit scrollbars 我制作了一些特定的 div 颜色 例如一个 div 有绿色文本和图像 另一个有蓝色等 所以我想为每个 div 制作一个自定义滚动条 使其与颜色匹配 Q1 可以
  • 如何使用 Google 脚本将日历事件复制(复制)到另一个日历中?

    我在 Google 日历中有几个日历 我正在学习 Google 脚本 并希望创建一个脚本 将事件从我的一个日历复制到另一个日历 并有机会修改参数 例如重复发生 一些代码开始 function myFunction var calendarS
  • 检查列表列表中是否存在某个项目的最佳方法? [复制]

    这个问题在这里已经有答案了 我有这样的示例列表 example list aaa fff gg ff gg 现在 我检查它是否有空字符串 如下所示 has empty False for list1 in example list for
  • bash: /bin/myscript: 权限被拒绝

    我已将文件夹的路径添加到 linux mint 15 中的 bashrc 其中包含我的脚本 据我所知 我的脚本应该像 bash 脚本一样工作 但每次我尝试使用我的脚本之一时 都会出现以下错误 bash bin myscript permis
  • iPhone Facebook Graph API 库

    是否存在使用新 Facebook Graph API 的 iPhone 库 这个库很棒 http www capturetheconversation com technology iphone facebook oauth 2 0 and
  • 处理响应 - SyntaxError:使用模式时出现意外的输入结束:“no-cors”

    我尝试了对 REST API 的 ReactJS 获取调用 并希望处理响应 调用成功 我收到响应 我可以在 Chrome 开发工具中看到该响应 function getAllCourses fetch http localhost 8080
  • MySQL 非主键自增

    我想知道是否 如何可以为每个主键设置第二列自动增量 CREATE TABLE test id INTEGER UNSIGNED NOT NULL subId INTEGER UNSIGNED NOT NULL AUTO INCREMENT
  • 扩展方法和动态对象

    我将把我的问题总结为以下代码片段 List
  • 仅限于 N 元解的背包算法

    这段摘自 CRAN 文档的 adagio 函数 knapsack 的功能符合预期 它用利润向量解决了背包问题p 权重向量w 和容量cap 在所选元素的总权重不超过容量的约束下 选择利润最大的元素子集 library adagio p lt