将项目分配给具有功能的组

2023-12-10

我有一个问题,我要将变量分配给集合。每个集合都有可以分配给它的变量的限制,并且每个变量都可以分配给总集合的某个子集。

Example:

  • a可以成套A or B
  • b可以成套B
  • c可以成套A or B
  • d可以成套A

因此,我们可以有A: a, d; B: b, c or A: c, d; B: a,b(集合内变量的顺序并不重要)。

我目前正在使用 z3 执行以下操作(此处使用solver编写,也可以使用Solver表示)。通过下面的代码,如果a_in_A = True那么变量a已在集合中A.

solve(If(a_in_B, 1, 0) + If(b_in_B, 1, 0) + If(c_in_B, 1, 0) <= 2,
      If(a_in_A, 1, 0) + If(c_in_A, 1, 0) + If(d_in_A, 1, 0) <= 2, 
      If(a_in_A, 1, 0) + If(a_in_B, 1, 0) == 1, 
      If(b_in_B, 1, 0) == 1, 
      If(c_in_A, 1, 0) + If(c_in_B, 1, 0) == 1, 
      If(d_in_A, 1, 0) == 1)

我可以对集合中的变量进行加权,如下所示。在这种情况下,我们只剩下A: a, d; B: b, c作为一种解决方案,尽管这可以扩展。

solve(If(a_in_B, 4, 0) + If(b_in_B, 3, 0) + If(c_in_B, 3, 0) <= 6,
      If(a_in_A, 4, 0) + If(c_in_A, 3, 0) + If(d_in_A, 3, 0) <= 7, 
      If(a_in_A, 4, 0) + If(a_in_B, 4, 0) == 4, 
      If(b_in_B, 3, 0) == 3, 
      If(c_in_A, 3, 0) + If(c_in_B, 3, 0) == 3, 
      If(d_in_A, 3, 0) == 3)

但是,我还想输入其他功能,例如c必须在之后成套出现a。因此,我们将只剩下解决方案A: a, d; B: b, c。我如何将这些要求添加到 z3 求解器表达式中(或完全采用另一种方式)?


与任何编程任务一样,可以有多种方法来解决这个问题。我认为以下是 z3py 中最惯用的方法。内部使用注意事项Set类型,它在内部由数组建模。我选择整数作为集合的元素,但如果您愿意,可以将其设为枚举类型(或其他一些基本类型):

from z3 import *

s = Solver()

a, b, c, d = Ints('a b c d')
allElems = [a, b, c, d]
s.add(Distinct(allElems))

# We have 2 sets
A, B = Consts ('A B', SetSort(IntSort()))
allSets = [A, B]

# Generic requirement: Every element belongs to some set:
for e in allElems:
    belongs = False;
    for x in allSets:
        belongs = Or(belongs, IsMember(e, x))
    s.add(belongs)

# Capacity requirements
sizeA, sizeB = Ints('sizeA sizeB')
s.add(SetHasSize(A, sizeA))
s.add(SetHasSize(B, sizeB))
s.add(sizeA <= 2)
s.add(sizeB <= 2)

# Problem specific requirements:
s.add(Or(IsMember(a, A), IsMember(a, B)))
s.add(IsMember(b, B))
s.add(Or(IsMember(c, A), IsMember(c, B)))
s.add(IsMember(d, A))

# c must be in a set that's after a's set
s.add(Implies(IsMember(a, A), IsMember(c, B)))
s.add(Not(IsMember(a, B))) # otherwise there wouldn't be a place to put c!

r = s.check()
if r == sat:
    print(s.model())
else:
    print("Solver said: " + r)

请注意如何使用来说明基数/容量要求sizeA, sizeB变量。您可以概括并编写辅助函数来自动执行大部分操作。

您最初的问题定义相当模糊,但我希望上述内容能让您了解如何继续。特别是,我们可以很容易地表达这样的要求:c属于“之后”集合a因为我们只有两套:

s.add(Implies(IsMember(a, A), IsMember(c, B)))
s.add(Not(IsMember(a, B))) # otherwise there wouldn't be a place to put c!

但是如果您有两个以上的集合,您可能需要编写一个辅助函数来遍历这些集合(就像我在“通用要求”部分中所做的那样)来自动执行此操作。 (本质上,你会说如果A是在一个特定的集合中,那么c属于“后来”的一组。当你来到最后一组时,你需要说a不在里面,不然就没地方放了c in.)

当我运行上面的程序时,它打印:

[A = Lambda(k!0, Or(k!0 == 1, k!0 == 4)),
 b = 5,
 a = 1,
 d = 4,
 sizeB = 2,
 c = 3,
 sizeA = 2,
 B = Lambda(k!0, Or(k!0 == 3, k!0 == 5)),
 Ext = [else -> 5]]

这可能有点难以阅读,但您很快就会习惯它!重要部分是:

a = 1
b = 5
c = 3
d = 4

上面应该是不言自明的。因为我们想用整数表示元素,所以 z3 选择了这些。 (注意我们说Distinct以确保它们不相同。)如果需要,您可以在此处使用枚举排序。

下一部分是集合的表示A and B:

A = Lambda(k!0, Or(k!0 == 1, k!0 == 4)),
B = Lambda(k!0, Or(k!0 == 3, k!0 == 5)),

这句话的意思是A包含元素1 and 4 (i.e., a and d), 尽管B包含元素3 and 5 (i.e., b and c)。你基本上可以忽略Lambda部分和有趣的样子k!0符号,并按如下方式读取:任何值1 OR 4属于A。同样对于B.

The sizeA and sizeB变量应该是不言自明的。

你可以忽略Ext价值。它由 z3 用于内部目的。

希望这向您展示如何使用内置支持以声明性方式构建更复杂的约束Sets.

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

将项目分配给具有功能的组 的相关文章

  • 测量数组的“无序”程度

    给定一个值数组 我想找到总 分数 其中每个元素的分数是数组中出现在其之前的具有较小值的元素的数量 e g values 4 1 3 2 5 scores 0 0 1 1 4 total score 6 O n 2 算法很简单 但我怀疑可以通
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 用于查找列表/集合中唯一元素的代码

    根据上面阴影部分的面积应该代表 A XOR B XOR C XOR A AND B AND C 如何将其翻译成Python代码 代码必须与上述表达式中提供的集合操作密切相关 至少这是首选 该代码必须足够通用 能够处理 3 个以上的列表 UP
  • 为什么我们需要检测链表中的循环

    我看到很多关于如何检测链表中的循环的问答 但我想了解的是我们为什么要这样做 换句话说 检测链表中的循环的实际用例是什么 在现实生活中 您可能永远不需要检测链表中的循环 但是执行此操作的算法很重要 我在现实生活中多次使用它们 例如 我经常会递
  • 列出所有组合的组合[重复]

    这个问题在这里已经有答案了 我试图列出 6 人组成的 3 人小组的所有可能组合 A B C D E F 组的顺序并不重要 这对的顺序并不重要 可能的组合 B D C E G H B C D E G H B E C D G H 我只能写这么多
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • java中的Anagram算法

    我想做字谜算法但是 这段代码不起作用 我的错在哪里 例如 des 和 sed 是字谜 但输出不是字谜 同时我必须使用字符串方法 不是数组 public static boolean isAnagram String s1 String s2
  • 算法 - 树中所有节点的最大距离

    所以 找到树中两个节点之间的最长路径相当容易 但我想要的是找到从节点出发的最长路径x到树中的另一个节点 对于所有x 这个问题也可以用以下方式表达 计算从给定的树中可以生成的所有有根树的高度 One way of course is to j
  • 将 n 个可变高度图像拟合为 3 个(相似长度)列布局

    我正在寻找类似于的 3 列布局piccsy com http piccsy com 给定许多宽度相同但高度不同的图像 有什么算法可以对它们进行排序以使列长度的差异最小 最好使用 Python 或 JavaScript 非常感谢您提前的帮助
  • 埃拉托斯特尼筛法是生成 1 到 N 素数的最佳算法吗?

    我在一次采访中被问到这个问题 我使用埃拉托色尼筛子概念和数组实现了一种算法 有没有更好的方法来解决这个问题 对于不知道筛子的人 请点击以下链接 http en wikipedia org wiki Sieve of Eratosthenes
  • 为什么使用 no-op 来填补 paxos 事件之间的空白是合法的?

    我正在学习Paxos算法 http research microsoft com en us um people lamport pubs paxos simple pdf http research microsoft com en us
  • 仅使用两个变量交换两个数字

    它如何执行交换 a a b b a b a b a 我不同意把它换成书 书中的选项包括 a和b的值的补集 否定和b 希望这些选项也不能满足它 正确的算法应该是 a a b b a b a a b
  • 读取4个点的坐标。他们做一个正方形吗?

    我计算点之间的距离 如果距离相等 则点构成一个正方形 否则不 仅当我按以下顺序读取坐标 A x y B x y C x y D x y 或相反时 我的代码才有效 但是如果我这样读 例如 A x y B x y D x y C x y 它将不
  • 如何在大空间尺度上加速A*算法?

    From http ccl northwestern edu netlogo models community Astardemo http ccl northwestern edu netlogo models community Ast
  • 创建将 n 个用户放入 k 个组的所有可能方法

    给定 n 个用户 u 1 u 2 u n 和 k 个组 g 1 g 2 g k 创建所有组的所有可能组合 基本上 最后每个组合都是一个Map 其中第一个Integer是用户ID 第二个Integer是组ID 例如 u 1 g 1 u 2 g
  • Haar级联正例图像大小调整

    我正在迈出第一步 为自定义对象识别创建 haar 级联 我花了时间获取大量数据并编写了一些预处理脚本以将视频转换为帧 我的下一步是裁剪感兴趣的对象 以创建一些积极的训练示例 我有几个问题 我确实在网上寻找答案 我有点困惑 我读到我应该致力于
  • javascript - 找到在一定限制下给出最大总和的子集(子集总和)

    我有一个包含一些整数值的数组 我需要获取它们的子集 该子集给出小于给定值的最大总和 假设我有这个数组 40 138 29 450 我想获得该数组的一个子集 使总和最大化 但低于用户给出的限制 比如说 250 在这种情况下 它应该返回 139
  • 具有最小刻度的图表的漂亮标签算法

    我需要手动计算图表的刻度标签和刻度范围 我知道漂亮刻度的 标准 算法 参见 我也知道这个Java实现 http erison blogspot nl 2011 07 algorithm for optimal scaling on char
  • 二分查找问题? [复制]

    这个问题在这里已经有答案了 可能的重复 实施二分查找有哪些陷阱 https stackoverflow com questions 504335 what are the pitfalls in implementing binary se
  • 正则表达式等价

    有没有办法找出两个任意正则表达式是否等价 对我来说看起来很复杂的问题 但可能有一些 DFA 简化机制之类的 要测试等价性 您可以计算的表达式并进行比较

随机推荐

  • 在 DatePIcker 中设置 MinDate 和 MaxDate

    创建应用程序 其中我显示 DatePicker 现在我想设置 DatePicker 的 MinDate 是前两年 最大日期仅是未来两年 选择应基于当前日期 假设当前日期是 23 11 2016 因此 datepicker 应显示日期直到 2
  • iPhone 无法通过 WiFi 连接到本地 HTTP 服务器

    使用以下命令时 我无法打开在 iPhone 6s iOS 9 2 中的 MacBook 上运行的 HTTP 服务器提供的静态 HTML 页面 无论是在 Safari 还是 Chrome 浏览器中 http ipNumberOfMyServe
  • PHP 禁用输出缓冲

    我已经关掉了输出缓冲在 PHP 中通过设置output buffering off在 php int 中 但是当运行这样的简单代码时
  • 二维数组传递给函数

    我一直在读这个question但我无法获得解决问题的结果代码 我应该如何改变它才能使其发挥作用 void print2 int array int n int m main int array 4 1 2 3 4 5 6 7 8 int a
  • 使用通用参数执行远程通用 Powershell 脚本

    我需要编写一个 Powershell 脚本 我们称之为 控制器脚本 它能够调用传递通用参数的通用远程 Powershell 脚本 控制器脚本接受主机名 凭据 远程脚本路径和远程脚本参数 作为哈希表 作为参数 相反 远程脚本可以是接受任何字符
  • 有没有办法找出哪些STL头文件没有被直接包含?

    我们的产品使用C 作为编程语言 使用 C STL 的一个恼人的问题是我们忘记包含必要的头文件 因为该文件可能已包含在其他一些 STL 头文件中 构建会通过 例如 在使用Xcode的Mac平台上 如果我使用std auto ptr不包括mem
  • 如何实现自旋锁以避免阻塞

    考虑以下代码 Below block executed by thread t1 synchronized obj obj wait 0 This block executed by thread t2 synchronized obj o
  • FbChatBot 将消息标记为已读

    我正在开发 Facebook 聊天机器人 我想将消息标记为已读 这样当我们的 Facebook 页面的版主查看消息部分时 他们就不会看到那么多未读消息 即使 Facebook 聊天机器人已经回复了该用户他们不需要单击该消息只是将其标记为 已
  • 以编程方式禁用屏幕超时

    从这篇文章来看 Android 在应用程序运行时禁用屏幕超时 我可以通过禁用屏幕超时 getWindow addFlags WindowManager LayoutParams FLAG FULLSCREEN WindowManager L
  • 如何形成 dbPedia iSPARQL 查询(针对维基百科内容)

    假设我需要从维基百科获取有关所有山脉的内容 我的目标是显示初始段落和相应文章中的图像 例如罗莎山 and 文森特金字塔 我开始了解 dbpedia 并通过一些研究发现它直接提供对 wiki 数据库的实时查询 我有两个问题 1 我发现很难如何
  • memcpy 错误:分段错误(核心转储)

    我正在尝试使用 memcpy 和以下代码将一个字符串复制到 c 中的另一个字符串 include
  • 是否可以使用非特殊文件夹作为FolderBrowserDialog的根文件夹?

    FolderBrowserDialog RootFolder 属性仅限于中定义的特殊文件夹环境 特殊文件夹枚举器 然而 在我的应用程序中 我们需要显示此对话框 但根路径需要可配置 并且通常是自定义文件夹 与枚举器中的任何特殊文件夹无关 如何
  • 我可以将 NUnit 3 测试添加到 Visual Studio 2015 负载测试中吗?

    我有一个用 C 编写的测试自动化框架 其中单元测试用NUnit 不是MS测试 我创建了一个新的Visual Studio 负载测试配置 我希望能够将这些 NUnit 测试添加到负载测试中 但是 Visual Studio 2015 没有列出
  • PHP不会输出新行[重复]

    这个问题在这里已经有答案了 我已经尝试了在 PHP 中输 出换行符的所有方法 为什么以下不起作用 这应该在 hello 和 bar 之间输出换行符 但事实并非如此 我也尝试过 r n 而不是 n 如果您将其用作命令行脚本 那么这将起作用 我
  • 由 mysql 数据库填充的 UIscroll 单元格中的图像

    我被困在某处 我使用 PHP 动态地从 MYSQL 数据库中提取图像 直到我达到从 URL 检索照片名称的程度为止 一切都正常 我想在 UIScroll View 上动态插入缩略图 以便用户可以水平滚动以查看所有图像 照片描述 照片摘要 我
  • 使用 C# 在 VisualBrush 中设置图像运行时

    实际上我将设计时从资源中获取的图像设置为xaml像这样的文件
  • Android:如何:将现实世界的纬度和经度坐标绘制到不同角度的静态图像?

    我已经将纬度和经度坐标 当前 转换为像素坐标 然后我也成功地将电流绘制成静态图像 但问题是静态图像角度与现实世界地图不成比例 这是经纬度到像素的转换 感谢 Dan S 在这里回答将给定的纬度标记为静止图像 public final stat
  • 将参数从 java 程序传递到 bash 脚本,该脚本使用参数调用另一个 java 程序

    我想在我的 java 程序中执行 shell 脚本 传递如下所示的参数 Runtime getRuntime exec test sh param1 param2 param3 test sh 将调用另一个传递字符串参数的 java 程序
  • 我可以使用 __init__.py 定义全局变量吗?

    我想定义一个在包的所有子模块中都可用的常量 我以为最好的地方是在 init py根包的文件 但我不知道该怎么做 假设我有几个子包 每个子包都有几个模块 如何从这些模块访问该变量 当然 如果这是完全错误的 并且有更好的选择 我想知道 你应该能
  • 将项目分配给具有功能的组

    我有一个问题 我要将变量分配给集合 每个集合都有可以分配给它的变量的限制 并且每个变量都可以分配给总集合的某个子集 Example a可以成套A or B b可以成套B c可以成套A or B d可以成套A 因此 我们可以有A a d B