适合从记录中提取 OneToMany 关系的约束编程

2024-05-06

也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题。想象一个项目表(学生与母亲一起做某事的学校项目)。每个项目都有一名或多名儿童参与。对于每个孩子,我们存储其姓名及其母亲的姓名。但对于每个项目,只有一个包含所有母亲的单元和一个包含所有孩子的单元。两个单元不一定以相同的方式排序。

Example:

+-----------+-----------+------------+
|           |           |            |
|   Project |   Parents |   Children |
|           |           |            |
+-----------+-----------+------------+
|           |           |            |
|   1       |   Jane;   |   Brian;   |
|           |   Claire  |   Stephen  |
|           |           |            |
+-----------+-----------+------------+
|           |           |            |
|   2       |   Claire; |   Emma;    |
|           |   Jane    |   William  |
|           |           |            |
+-----------+-----------+------------+
|           |           |            |
|   3       |   Jane;   |   William; |
|           |   Claire  |   James    |
|           |           |            |
+-----------+-----------+------------+
|           |           |            |
|   4       |   Jane;   |   Brian;   |
|           |   Sophia; |   James;   |
|           |   Claire  |   Isabella |
|           |           |            |
+-----------+-----------+------------+
|           |           |            |
|   4       |   Claire  |   Brian    |
|           |           |            |
+-----------+-----------+------------+
|           |           |            |
|   5       |   Jane    |   Emma     |
|           |           |            |
+-----------+-----------+------------+

我希望这个例子能够直观地说明问题。正如我所说,两个单元格仅包含由分隔符分隔的名称,但不一定以类似的方式排序。因此,对于技术应用,您可以将数据转换为:

+-------------+-----------+----------+
|   Project   |   Name    |   Role   |
+-------------+-----------+----------+
|   1         |   Jane    |   Mother |
+-------------+-----------+----------+
|   1         |   Claire  |   Mother |
+-------------+-----------+----------+
|   1         |   Brian   |   Child  |
+-------------+-----------+----------+
|   1         |   Stephen |   Child  |
+-------------+-----------+----------+
|   2         |   Jane    |   Mother |
+-------------+-----------+----------+
|   2         |   Claire  |   Mother |
+-------------+-----------+----------+
|   2         |   Emma    |   Child  |
+-------------+-----------+----------+
|   2         |   William |   Child  |
+-------------+-----------+----------+
|             |           |          |
|                                    |
|              And so on             |

每个项目的家长和孩子人数都是相等的。因此,对于每一笔交易,我们都有 n 个母亲和 n 个孩子,并且每个母亲恰好属于一个孩子。有了这些限制,就可以从只涉及一个孩子(即 4 和 5)的项目开始,通过逻辑推理将每位母亲分配给她的所有孩子。

Results:

简有艾玛、史蒂芬和詹姆斯;

克莱尔有布莱恩和威廉;

索菲亚有伊莎贝拉

我想知道如何使用约束编程来解决这个问题。此外,数据集可能是不确定的,我想知道是否可以隔离记录,当手动解决时(即,当手动完成母子分配时),会打破不确定性。


我不确定我是否理解问题的所有要求,但这是 MiniZinc 中的约束规划模型(http://www.minizinc.org/ http://www.minizinc.org/)。完整模型在这里:http://hakank.org/minizinc/one_to_many.mzn http://hakank.org/minizinc/one_to_many.mzn .

稍后注意:项目约束的第一个版本不正确。我已经删除了不正确的代码。请参阅原始答案的编辑历史记录。

enum mothers = {jane,claire,sophia};
enum children = {brian,stephen,emma,william,james,isabella};      

% decision variables

% who is the mother of this child?
array[children] of var mothers: x;


solve satisfy;

constraint
  % All mothers has at least one child
  forall(m in mothers) (
    exists(c in children) (
      x[c] = m
    )
  )
;

constraint
% NOTE: This is a more correct version of the project constraints.
% project 1
(
  ( x[brian] = jane /\ x[stephen] = claire) \/
  ( x[stephen] = jane /\ x[brian] = claire)
) 
/\
% project 2
(
  ( x[emma] = claire /\ x[william] = jane) \/
  ( x[william] = claire /\ x[emma] = jane) 
)
/\
% project 3
(
  ( x[william] = claire /\ x[james] = jane) \/
  ( x[james] = claire /\ x[william] = jane) 
)
/\
% project 4
( 
  ( x[brian] = jane /\ x[james] = sophia /\ x[isabella] = claire) \/
  ( x[james] = jane /\ x[brian] = sophia /\ x[isabella] = claire) \/
  ( x[james] = jane /\ x[isabella] = sophia /\ x[brian] = claire) \/
  ( x[brian] = jane /\ x[isabella] = sophia /\ x[james] = claire) \/
  ( x[isabella] = jane /\ x[brian] = sophia /\ x[james] = claire) \/
  ( x[isabella] = jane /\ x[james] = sophia /\ x[brian] = claire) 
)
/\

% project 4(sic!)
( x[brian] = claire) /\

% project 5
( x[emma] = jane)
;


output [
  "\(c): \(x[c])\n"
  | c in children
];

唯一的解决方案是

brian: claire
stephen: jane
emma: jane
william: claire
james: jane
isabella: sophia

Edit2:这是一个更通用的解决方案。看http://hakank.org/minizinc/one_to_many.mzn http://hakank.org/minizinc/one_to_many.mzn对于完整的模型。

include "globals.mzn"; 

enum mothers = {jane,claire,sophia};
enum children = {brian,stephen,emma,william,james,isabella};      

% decision variables
% who is the mother of this child?
array[children] of var mothers: x;

% combine all the combinations of mothers and children in a project
predicate check(array[int] of mothers: mm, array[int] of children: cc) =
  let {
    int: n = length(mm);
    array[1..n] of var 1..n: y;
  } in
  all_different(y) /\
  forall(i in 1..n) (
     x[cc[i]] = mm[y[i]]
  )
;    

solve satisfy;

constraint
% All mothers has at least one child.
forall(m in mothers) (
  exists(c in children) (
    x[c] = m
  )
)
;


constraint
% project 1    
check([jane,claire], [brian,stephen]) /\
% project 2
check([claire,jane],[emma,william]) /\
% project 3
check([claire,jane],[william,james]) /\
% project 4
check([claire,sophia,jane],[brian,james,isabella]) /\
% project 4(sic!)
check([claire],[brian]) /\
% project 5
check([jane],[emma])
;

output [
 "\(c): \(x[c])\n"
 | c in children
];

该模型使用以下谓词来确保考虑母亲与孩子的所有组合:

predicate check(array[int] of mothers: mm, array[int] of children: cc) =
   let {
     int: n = length(mm);
     array[1..n] of var 1..n: y;
  } in
  all_different(y) /\
  forall(i in 1..n) (
    x[cc[i]] = mm[y[i]]
  )
;    

它使用全局约束all_different(y)为了保证mm[y[i]]是其中一位母亲mm,然后将第 i 个孩子分配给该特定母亲。

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

适合从记录中提取 OneToMany 关系的约束编程 的相关文章

  • Prolog - 删除非唯一元素

    我有一个谓词来检查元素是否是列表的成员 并且看起来如下 member X X member X T member X T 当我打电话时 member 1 2 3 1 4 我明白了 是的 现在我必须使用它来编写谓词 该谓词将从列表列表中删除所
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • 删除外键约束

    如果我在创建过程中没有命名外键 如何删除它 create table abc id number 10 foreign key id references tab roll even alter table abc drop foreign
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 使用约束对 UIView 框架进行动画处理

    我在 UIView 中有一个元素 它有一个约束 规定它应该始终距离视图底部 10 像素 然后 我尝试为该视图的高度设置动画 使其看起来从屏幕上滑下 根据约束 元素应始终距视图底部 10 像素 当我像这样添加视图时 这是正确的 printVi
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • SWI-Prolog 中的约束编程

    我想要一个包含三个元素 A B 和 C 的列表 L 并具有以下约束 use module library clpfd L A B C L ins 1 3 A B C 但是 它给出了一个错误 Syntax error Operator exp
  • 我可以定义一个具有与每个值的键对应的值约束的 Typescript 映射吗?

    In 这个游乐场 https www typescriptlang org play code KYDwDg9gTgLgBASwHY2FAZgQwMbDgQQCMBnGKHGfbGBCJOAbwCg44YBPMYALjlKmQBzANwtE
  • 制作具有行和列约束的随机存在/不存在矩阵(因此是布尔值)

    我正在尝试在 R 中创建一个随机矩阵 它需要是一个存在 不存在矩阵 以便矩阵中的所有值都为 0 或 1 但我还需要指定行和列总计 例如 5x5 表 其中 行总计为 r1 4 r2 2 r3 3 r4 5 r5 3 列总计为 c1 5 c2
  • 求解序言中极其简单的方程:A = B + C?

    我有一个非常简单的方程 我希望能够在序言中求解 A B C 我希望能够编写一个谓词来表达这种关系 它可以处理任何一个未实例化的参数 无需推广到更复杂的关系或方程 myEquation A B C something 我可以使用以下语义进行调
  • 在 Prolog、尾递归中计算斐波那契数列

    我想在 Prolog 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • SQL 删除自动命名约束

    我使用脚本在表上创建了一些约束 但未指定约束名称 结果 我最终受到了像这样的限制FK DOC OBGS kntr 54E63309例如 是否可以在不指定确切的约束名称的情况下删除该约束 例如 类似这样的东西 不起作用 ALTER TABLE
  • 带有泛型类声明的命名空间约束

    我想知道是否 如果可以的话如何 可以将命名空间定义为泛型类声明中的约束参数 我所拥有的是这样的 namespaceMyProject Models Entities namespaceMyProject Tests BaseTest 现在我
  • 如何删除非空约束?

    假设创建了一个表 如下所示 create table testTable colA int not null 您将如何删除非空约束 我正在寻找类似的东西 ALTER TABLE testTable ALTER COLUMN colA DRO
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 限制实体框架中子实体的数量

    底线在前 有没有一种简洁的方法可以限制可以属于实体框架中父级的子实体的数量 我现在使用的是4 3 1 问题 我正在开发一个 ASP NET MVC3 站点 它通过使用实体框架的数据访问层访问数据 我有一个 SearchList 实体 它与搜
  • 向带有检查约束 SQL 的表添加列

    我想向表中添加一列 然后添加一个检查约束以确保其大于 0 我似乎无法让它在 oracle sl Developer 中运行 Alter TABLE store101 add column Base salary Number 7 2 con

随机推荐

  • 在 Mojarra 2.2.5 的复合组件中使用 Omnifaces EL 函数

    升级到 JSF Mojarra 2 2 5 后 在使用 Omnifaces 的 el 函数 formatNumber 时出现以下异常 这仅发生在复合组件内 普通 Facelet 工作正常 javax el E LException 找不到函
  • 带有 --rule 选项的 ESLint CLI

    我在使用 ESLint CLI 时遇到问题 rule option This is what I tried eslint rule no console error fix dry run 导致出现以下错误 选项 规则 的值无效 预期类型
  • 如何使用 RSpec & Rails 4 测试子域约束

    我正在尝试编写一个测试子域约束的 控制器测试 但是 我无法让 RSpec 设置子域 并且如果子域不准确则返回错误 我正在使用 Rails 4 2 6 和 RSpec 3 4 路线 rb namespace frontend api do c
  • Spring实体应该在服务中转换为Dto吗?

    对此发表评论后question https stackoverflow com questions 34058238 spring service and repository layer convention 34066805 nored
  • 在 Emacs Paredit 中交换括号和方括号

    如何在 paredit 模式下定义交换括号和方括号的命令 所以任务就是把它变成这样 例如 blah a b c 进入这个 blah a b c 使用 paredit 模式 移至表达式的开头 a 进而 C M SPC
  • 在 bootstrap 4 中将页脚刷新到页面底部

    我正在使用引导程序4 我的模板结构是这样的 div div div div
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • Ruby 中@@ 和@ 有什么区别? [复制]

    这个问题在这里已经有答案了 我刚刚开始学习 Ruby 一直无法找到关于 和 在类变量方面的区别的很好的解释 如果有人可以提供一个基本的直观示例 那就太好了 另外它们可以互换吗 前缀为的变量 是一个类变量 前缀为 是一个实例变量 在这个答案中
  • 使用护照库访问 Microsoft Graph API 时,CompactToken 解析失败,错误代码:80049217

    我在用 passport azure ad oauth2 npm 模块 以获取访问令牌 然后我可以将其传递给 MS Graph API passport use new AzureAdOAuth2Strategy clientID proc
  • 如何在模块中使用“before_action”

    我想在模块中使用 before action 不幸的是 我无法让它发挥作用 我正在谷歌搜索 但我发现的一切都无法解决问题 我的模块文件如下所示 module ShowController include SimpleController b
  • 在 Elastic 搜索中加载示例数据集时出错

    您好 我正在尝试加载示例数据集参考弹性搜索文档 https www elastic co guide en elasticsearch reference current exploring your data html但是当我尝试运行指示
  • 如何正确实现TBitmap的扫描线访问?

    我正在尝试根据以下方式访问位图的扫描线关于内河码头的文章 http edn embarcadero com article 29173 使用像这样的扫描线 for y 0 to n do begin line bitmap scanline
  • 不使用 Web 服务器编写简单的 Microsoft 图形客户端

    我正在寻找编写一个脚本来更新 Office365 中的通讯组列表 我正在学习 MS Graph API 并且已经让 python REST 示例可以工作 看来所有示例 Graph API 代码 无论语言或平台如何 都假设我正在以一种或另一种
  • 如何将 Tesseract 导入 Angular2 (TypeScript)

    我正在尝试将 Tesseract 导入 Angular2 TypeScript 我可以看到它保存到 node modules 文件夹中 但是在使用时 import Tesseract from types tesseract js it s
  • MassTransit AzureServiceBus 生成的队列

    我有一个托管在 Azure Service Fabric 解决方案中的 MT 设置的工作配置 我有一个发送消息的 API 和一个读取消息的无状态应用程序 在无状态应用程序中 我告诉它使用类型的消息TestMessage具有以下内容 cont
  • Facebook 自定义消息共享

    当我点击网站上的 Facebook 分享按钮时 我需要添加自定义消息 默认情况下 文本显示 对此说些什么 当我点击 Facebook 分享按钮时 我想将此消息更改为自定义消息 有没有办法用 sharer php 做到这一点 就像参数 t c
  • 按两个字段对 Python 列表进行排序 [重复]

    这个问题在这里已经有答案了 我从排序的 csv 创建了以下列表 list1 sorted csv1 key operator itemgetter 1 我实际上想按两个标准对列表进行排序 首先按字段 1 中的值 然后按字段 2 中的值 我该
  • 在 CASE 语句中使用 CAST 时出现数据转换错误

    运行以下命令时出现错误 将数据类型 nvarchar 转换为 float 时出错 declare completeCommand nvarchar max x paramVal nvarchar 100 paramName nvarchar
  • C# 数据类型到 SQL Server 数据类型

    如何将 C 数据类型 转换 为 SQL Server 数据类型 SqlDbType是已知的 i e C gt String SQL Server gt N String 尝试这个 它是一个 Extension 类 因此您要在文件上添加以下方
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含