生成具有总和约束的排列

2024-03-05

I have n可变长度的集合,并希望从每个集合中获取总和在一定范围内的所有项目排列。例如在R我们可以做的:

set1 <- c(10, 15, 20)
set2 <- c(8, 9)
set3 <- c(1, 2, 3, 4)

permutations <- expand.grid(set1, set2, set3)
permutations$sum <- rowSums(permutations)
final <- permutations[permutations$sum >= 25 & permutations$sum <= 29, ]

# final:
#    Var1 Var2 Var3 sum
# 3    20    8    1  29
# 5    15    9    1  25
# 8    15    8    2  25
# 11   15    9    2  26
# 14   15    8    3  26
# 17   15    9    3  27
# 20   15    8    4  27
# 23   15    9    4  28

这对于少量的集合来说是很好的,但是随着集合数量的增加,增长速度会很快(阶乘)。

是否可以生成适合约束的排列,而无需计算所有可能性?

在此示例中,不存在包含 10 个的最终组合set1,因为无论选择哪个其他数字,所得的总和都太小。这对于缩小问题的范围可能很有用。例如,如果我知道min(set1) + max(set2) + max(set3) < 25 == TRUE,那么我可以确保不包括min(set1)在任何排列中。

我如何概括这一点,并使用约束来防止生成无效排列?


我认为你所要求的是相当具体的鞋拔子,不太可能“容易实施”(有效)。另一种看待它的方法是在运行实验时进行调节(假设这是试验设计)。

我写了一个lazyExpandGrid.R https://gist.github.com/r2evans/e5531cbab8cf421d14ed这在概念上类似于惰性expand.grid,这意味着它不会预先评估所有可能的组合。如果需要,代码可以稍后插入到这个答案中,但是 github-gist 相当可靠(而且不短)。

使用它,您应该能够执行以下操作:

set1 <- c(10, 15, 20)
set2 <- c(8, 9)
set3 <- c(1, 2, 3, 4)

iter <- lazyExpandGrid(set1, set2, set3)

while (is.data.frame(item <- iter$nextItem())) {
  p <- sum(item)
  if (p < 25 || 29 < p) next
  print(item) # but really, do something more interesting here
}
#   Var1 Var2 Var3
# 3   20    8    1
#   Var1 Var2 Var3
# 5   15    9    1
#   Var1 Var2 Var3
# 8   15    8    2
#    Var1 Var2 Var3
# 11   15    9    2
#    Var1 Var2 Var3
# 14   15    8    3
#    Var1 Var2 Var3
# 17   15    9    3
#    Var1 Var2 Var3
# 20   15    8    4
#    Var1 Var2 Var3
# 23   15    9    4

买者自负:该功能大部分可用,但肯定有一些方法可以改进。例如,使用is.data.frame(item <- iter$nextItem())实际上是一个isTruthy测试(名称来自shiny);目前它返回 1 行data.frame直到什么都没有剩下,然后返回FALSE。现在看来,这肯定是可以改进的,只是我没有这个需要。如果您有想法、错误等,请随时在 github gist 页面上发表评论。

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

生成具有总和约束的排列 的相关文章

随机推荐

  • GWT 模块的模块标记中的 rename-to 是什么意思?

    GWT 模块中模块标记的 rename to 属性是什么意思 是可选的吗 它 导致编译器表现得好像模块的名称与长的 完全限定的名称不同 http code google com webtoolkit doc latest DevGuideO
  • 在 MySql 中提取具有特定模式的子字符串

    我有一个文本字段 如下所示 option A sum A g3et B 我想获取里面的文字 没有重复项 获得意义 A B 不可能出现双重like的情况 我知道这是一种在数据库中保存数据的可怕方法 我无法更改数据的保存方式 我只需要从本专栏中
  • 红宝石。合并嵌套哈希而不覆盖

    我有一个嵌套哈希 X 1 2 3 gt X O 2 3 gt X O X 3 gt X O X O 我想合并给定的嵌套哈希 X 1 2 3 gt X O 2 3 gt X O 2 X gt X O O X 这样 X 1 2 3 gt X O
  • 如何更改Windows Phone应用程序中按钮的背景颜色?

    我正在使用 C 和 silverlight 4 开发 Windows Phone 7 应用程序 我是 silverlight 的新手 我的应用程序中有两个用于不同目的的按钮 我想在单击按钮时动态更改按钮的颜色 所以我使用下面的代码 Inco
  • 办公自动化、VSTO 和 Open XML SDK 之间有什么区别?

    办公自动化 VSTO 和 Open XML SDK 之间有什么区别 我们需要所有这些还是其中一些已经过时了 办公自动化是指使用 COM 互操作以编程方式操作 Office 程序 或更常见的是通过 Office 程序操作 Office 文档
  • 默默忽略remove()

    实体 A 引用 多对一 实体 B 具有从 B 到 A 的反向 映射 引用 此外 还存在 A 到 C 的引用以及 C 到 A 的反向引用 当我发出entityManager remove A 然后flush 时 不会生成 删除 但也没有例外
  • ld:找不到 AudioUnit 框架

    我正在添加另一个项目 即使我添加了所需的所有库 我也会收到此错误 这是错误详细信息 Ld Users alialzahrani Library Developer Xcode DerivedData IMS3 ezltqoccjhjpvua
  • 如何在 React.js 中预加载图像?

    如何在 React js 中预加载图像 我有下拉选择组件 其工作方式类似于菜单 但我必须预加载项目的图像图标 因为有时它们在第一次打开时不可见 我努力了 https github com sambernard react preload h
  • 使用 xslt 从 xml 转换而来的平面文件中的行数

    下面是我用来将 xml 转换为平面文件的 xsl 它还满足各种其他所需条件
  • iOS7 深色键盘和浅色键盘之间的切换

    In iOS7 we have both a dark and a light keyboard Is it possible for me to change between these in my app by code textfie
  • 当任何包含公式的单元格发生更改时触发宏

    我有一个包含大约 50 个单元格 包含公式 的工作表 这些单元格根据外部工作簿中的单元格而变化 当这些单元格中的任何一个更改其值时 我想触发某个宏 Worksheet change 事件不起作用 并且 Worksheet Calculate
  • C# RichEditBox 性能极慢(加载 4 分钟)

    The RichEditBoxC 中的控件 我使用 VS 2005 性能较差 我将包含 45 000 行彩色文本的 2 5 MB RTF 文件加载到控件中 需要 4 分钟 我将相同的 RTF 加载到 Windows XP 写字板的 RTF
  • Python Flask 从像 render_template 这样的变量渲染文本

    我知道烧瓶功能render template 我必须给出模板的文件名 但现在我想渲染模板的字符串 即模板的内容 这就说得通了 但我现在不想解释原因 如何简单地渲染模板的文本 您可以使用render template string http
  • 什么是滑动窗口算法?例子?

    在解决几何问题时 我遇到了一种称为滑动窗口算法的方法 确实找不到任何学习材料 详细信息 该算法是关于什么的 我认为它更多的是一种技术而不是算法 这是一种可用于各种算法的技术 我认为通过以下示例可以最好地理解该技术 想象一下我们有这个数组 5
  • 更改 div 与背景图像之间的 Flex 间距

    hi i am remaking the google chrome home page but i cant seem to do the part at the bottom of the page were the most used
  • typeof 在 IE 中返回“未知”

    我有一个窗口 在关闭之前我会刷新底层页面 if opener typeof opener Refresh undefined opener Refresh 如果我离开原来的打开页面 这段代码会抛出一个 没有权限 error 调试代码发现ty
  • 如何在禁用状态下自定义 mat-form-field

    我正在尝试自定义角度材料 mat form field 我可以使用以下命令自定义下划线边框 ng deep mat form field ripple background color yellow 现在我正在尝试将禁用状态下的下划线边框自
  • 从其他线程访问 VT 数据是否安全?

    从辅助线程更改 Virtual TreeView 数据是否安全 如果是 我应该使用关键部分 甚至是同步方法 吗 我担心当我从另一个线程写入 VT 的数据记录时 主线程同时调用其重绘 并且此刷新将导致同时读取同一记录 我想补充一下 我在应用程
  • 为评估为 true 的 IN 条件元素设置限制

    table t Id price Date 1 30 2021 05 09 1 24 2021 04 26 1 33 2021 04 13 2 36 2021 04 18 3 15 2021 04 04 3 33
  • 生成具有总和约束的排列

    I have n可变长度的集合 并希望从每个集合中获取总和在一定范围内的所有项目排列 例如在R我们可以做的 set1 lt c 10 15 20 set2 lt c 8 9 set3 lt c 1 2 3 4 permutations lt