Minizinc:生成有效的转变

2024-05-18

希望有人能帮助我解决这个问题!

最初的问题是生成有效的班次,如下所述:

我有这样的数组 [m,m,m,o,o,l,l,m,m,m,l,m,m,m] 具有固定长度(S),其中 m 是工作,o 是办公室,我自由了。我需要确保至少每 6m 就有两个 l 在一起 (ll)。 o 不算作工作或免费。例子:

mmlmmlmmmll is not valid (7 ms without two ls)
mmlmmlmmll is valid
mmomomommll is valid

我试图创建一个包含 0(表示 ls)和 1(表示 ms)的数组,但从数组中删除所有 o 和非连续的 ls。因此,对于上面的例子来说:

mmlmmlmmmll -> 111111100
mmlmmlmmll -> 11111100
mmomomommll -> 11111100

这样我就可以使用 slider_sum 或 at_least 约束来解决它。但是,我无法创建这个新数组,因为它的大小与原始数组 (S) 不同。一个有效的选项是在末尾用 0 填充剩余的槽,直到 S。

任何帮助表示赞赏

编辑。这是到目前为止的代码:

enum TypeOfShift = {l,m,o};
enum Staff = {John, Mike, Mary};
array[Staff, 1..30] of TypeOfShift: Roster=[|
m,  m,  m,  l,  l,  o,  m,  m,  m,  m,  l,  l,  l,  m,  m,  m,  m,  m,  m,  l,  l,  m,  m,  m,  m,  m,  l,  l,  l,  l|
l,  l,  l,  l,  l,  m,  m,  m,  o,  o,  l,  l,  l,  m,  m,  m,  m,  m,  l,  l,  l,  m,  m,  m,  m,  m,  l,  l,  m,  m|
m,  m,  l,  l,  m,  o,  m,  m,  m,  m,  l,  l,  l,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  l,  l,  l,  m|];
array[Staff, 1..30] of var 0..2: RosterCalculated = array2d(Staff, 1..30,[if (Roster[i,d]==l) then 0 else (if (Roster[i,d]==o) then 2 else 1 endif) endif | i in Staff, d in 1..30]);
output[if (d==1) then "\n\(i) " ++ " " ++ show(RosterCalculated[i,d]) ++ " " else show(RosterCalculated[i,d]) ++ " " endif | i in Staff, d in 1..30];

这个答案提供了一个简单有效问题中所述问题的解决方案,即如何确定是否给定班次是否有效。 [注意,在这种情况下,不需要(其实是适得其反)将任何数组的内容声明为var $T].


一种选择是:

  • 确定所有的起始位置ll在数组中(数组double_l_pos)
  • 确定每个的位置o在数组中(数组has_o)
  • 确定累计数量o从头开始在数组中(数组cum_has_o)
  • 固定所有的位置ll这样它就会忽略任何o在它之前(数组fixed_double_l_pos)
  • 确定所有之间的距离ll起始位置(数组double_l_distance)
  • 要求距离值不大于6

Example:

include "globals.mzn";

enum TypeOfShift = {l,m,o};
enum Staff = {John, Mike, Mary};

array[Staff, 1..30] of TypeOfShift: Roster=[|
    m,  m,  m,  l,  l, o,  m,  m,  m,  m,  l,  l,  l,  m,  m,  m,  m,  m,  m,  l,  l,  m,  m,  m,  m,  m,  l,  l,  l,  l|
    l,  l,  l,  l,  l,  m,  m,  m,  o,  o,  l,  l,  l,  m,  m,  m,  m,  m,  l,  l,  l,  m,  m,  m,  m,  m,  l,  l,  m,  m|
    m,  m,  l,  l,  m,  o,  m,  m,  m,  m,  l,  l,  l,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  m,  l,  l,  l,  m|];

constraint forall (s in Staff)
(
    let {
        array[int] of TypeOfShift: shifts = [Roster[s, i] | i in 1..30];
        array[int] of int: double_l_pos = [ i - 1 | i in index_set(shifts) where
                                                    i > 1 /\
                                                    shifts[i-1] == l /\
                                                    shifts[i] == l];
        array[int] of int: has_o = [ if el == o then 1 else 0 endif | el in shifts ];
        array[int] of int: cum_has_o = [
                              sum ( j in index_set(shifts) where j <= i) ( has_o[j] )
                              | i in index_set(has_o) ];
        array[int] of int: fixed_double_l_pos = [ pos - cum_has_o[pos] | pos in double_l_pos ];
        array[int] of int: double_l_distance = [fixed_double_l_pos[1]] ++
            [fixed_double_l_pos[i] - fixed_double_l_pos[i-1] - 1 - 1
            | i in index_set(fixed_double_l_pos) where i > 1];
    } in
        forall(dist in double_l_distance) (
            dist <= 6
        )
);

solve satisfy;

这里的一切都是静态计算的,因此即使在实际求解开始之前也可以检测到模型的不一致。


附录:因为这是一个roster问题,您可能需要详细阅读roster https://github.com/MiniZinc/minizinc-benchmarks/tree/master/roster待命排班 https://github.com/MiniZinc/minizinc-benchmarks/tree/master/on-call-rostering模型在MiniZinc基准存储库。这些文件可能包含处理您的问题的更好方法。

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

Minizinc:生成有效的转变 的相关文章

  • 将数组分配给数组

    所以我正在尝试一些数组 但我不明白为什么这不起作用 int numbers 5 1 2 3 int values 5 0 0 0 0 0 values numbers 出现以下错误 Error 1 error C2106 left oper
  • 为什么 JavaScript 中是 [1,2] + [3,4] = "1,23,4" ?

    我想将一个数组的元素添加到另一个数组中 所以我尝试了以下方法 1 2 3 4 它的回应是 1 23 4 到底是怎么回事 The 操作员没有为数组定义 发生的事情是 JavaScript将数组转换为字符串并将它们连接起来 Update 由于这
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • 如何对 PHP 数组中的值进行排序/过滤?

    我需要 foreach 这个数组的值 My CODE 该代码的结果 Array 0 gt Array 0 gt Age Name 1 gt 22 Yrs Value 2 gt Ethnicity Name 3 gt Caucasian Va
  • Javascript - 使数组索引 toLowerCase() 不起作用

    我试图将所有数组索引设置为小写字符串 但它不起作用 我在这里查看了其他答案并尝试了他们的解决方案 例如使用toString 添加之前toLowerCase但它不起作用 这很奇怪 我创建了一个问题的jsfiddlehere https jsf
  • 我可以在类变量中添加没有指定值的 PHP 数组键吗?

    我目前正在努力通过IBM 关于 CakePHP 的教程 http www 128 ibm com developerworks edu os dw os php cake1 html 有一次我遇到了这段代码
  • 向用户显示多条验证消息

    在 MS Access 中 如何将从 SELECT 语句检索到的行存储在数组中 并在一个消息框中显示多行 Dim rSEL rSUM rDes As DAO Recordset Dim vItem id vQnty vSum As Inte
  • 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

    数据库表中已有的演示数据 INSERT INTO csvtbl ID SKU Product Name Model Make Year From Year To VALUES 1 C2AZ 3B584 AR Power Steering P
  • 执行数组内的函数

    是否可以从数组内部执行匿名函数 也在数组内部定义 return execute function logic 或者我应该在外面定义它然后再调用它 从技术上讲 您可以将该函数括在括号中并像这样调用它 return function retur
  • 是否保证 sizeof(T[N]) == N * sizeof(T) ?

    我一直假设 N 个元素类型的数组的大小T 由返回sizeof保证正好是N次sizeof T The 对这个问题的评论 https stackoverflow com questions 46457449 is it always the c
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 选择MySql表数据放入数组中

    我尝试从 mysql 捕获数据并将它们全部放入数组中 认为 users table id name code 1 gorge 2132 2 flix ksd02 3 jasmen skaod2 sql mysql query select
  • 根据数组计数填充复选框

    我是新来的php我已经使用了它的开发php array 我想填充checkboxes根据数组计数 为了做到这一点 我尝试了以下方式 它对我不起作用 有什么方法可以做到这一点 在我的例子中 数组计数 5 所以我相应地需要 5 个复选框
  • 默认数组值

    有没有办法在javascript中为数组分配默认值 ex an array with 24 slots that defaults to 0 您可以使用fill数组上的函数 Array 24 fill 0 Note fill仅在 ECMAS
  • 在Python 3中将二进制字符串转换为字节数组

    尽管有很多相关的问题 但我找不到任何符合我的问题的问题 我想更改二进制字符串 例如 0110100001101001 转换成字节数组 同一个例子 b hi 我试过这个 bytes int i for i in 011010000110100
  • 数组初始化编译时间 - Constexpr 序列

    我正在读书this https stackoverflow com questions 45938798 for loop with variable step size c 45939130关于SO的问题 这个问题本身并不是那么有趣 但我
  • 大小为 8 的无效写入,C Valgrind,字符串数组

    我一直在使用 valgrind 和 gdb 但我不太明白问题是什么 它跳来跳去太多了 我无法在 gdb 中真正追踪它 而在 valgrind 中我没有足够的信息 这是我的 makeargv 函数 它将 strtok 输出的字符串放入数组中
  • 在 Swift 中检查一个数组是否包含另一个数组的所有元素

    我想为数组编写一个扩展来检查一个数组是否包含另一个数组的所有元素 在我的用例中它是字符串对象 但我一直得到 Cannot convert value of type T Generator Element to expected argum
  • 如何按值删除数组中的多个项目?

    我正在尝试做一个removeAll 函数 它将删除具有该特定值 而不是索引 的数组的所有元素 当我们对循环进行任何更改时 棘手的部分就出现了 索引往往会移动 使其很难像我们想要的那样工作 并且每次更改时都重新启动循环 这在大数组上效率非常低
  • 将一维数组转换为二维数组[重复]

    这个问题在这里已经有答案了 我正在开发一个程序 我必须将文本文件中的值读入一维数组 我已经成功获取该一维数组中的数字 m1 1 2 3 4 5 6 7 8 9 但我希望数组是 m1 1 2 3 4 5 6 7 8 9 您可以使用此代码 co

随机推荐

  • 重写 jmeter.properties

    是否可以在不关闭并重新启动JMeter的情况下重新读取jmeter properties 也许有任何额外的类会触发这个过程 有时我需要使用属性的值 并且每次都重新启动 JMeter 并不方便 所以我想自动化此过程 无需从文件中重新读取 jm
  • Swagger for Micronaut 与 Maven

    我想从 Spring Boot 2 切换到 Micronaut 框架 而且我在 Swagger 设置上遇到了困难 在 Spring Boot 2 项目中 我有以下依赖项
  • magento成功页面变量

    我正在尝试捕获一些 magento 成功页面变量以传递给我们的广告公司 到目前为止 我已经得到了这个 但变量没有输出任何内容 数据需要采用以下格式 price1 price2 price3 qty1 qty2 qty3 sku1 sku2
  • 使用特定的类/函数预加载 Jupyter Notebook

    我想预加载一个笔记本 其中包含我在另一个文件中定义的特定类 函数 更具体地说 我想用 python 来做到这一点 比如加载一个配置文件 包含所有相关的类 函数 目前 我正在使用 python 生成笔记本并在服务器上自动启动它们 因为不同的
  • 如何将多个 api 请求中的多个可读流传输到单个可写流?

    期望的行为 实际行为 我尝试过的 重现步骤 研究 期望的行为 将从多个 api 请求接收到的多个可读流传输到单个可写流 API 响应来自 ibm watsontextToSpeech synthesize https cloud ibm c
  • 使用 Android Studio 进行调试永远停留在“等待调试器”状态

    UPDATE The supposed重复是一个关于陷入 等待调试器 执行时Run 而这个问题就陷入了 等待调试器 执行时Debug 产生问题的步骤不同 解决方案也不同 每当我尝试使用Android Studio的调试功能时 运行状态总是停
  • 简单的dom php解析获取自定义数据属性值

    HTML div class something ddsf PHP foreach dom gt find something data rel as this var dump this gt attr 我尝试了这个但错误 在其文档中找不
  • 元组有什么用?

    我现在正在学习 Python 课程 我们刚刚介绍了元组作为数据类型之一 我阅读了它的维基百科页面 但是 我无法弄清楚这种数据类型在实践中会有什么用处 我可以提供一些需要一组不可变数字的示例吗 也许是在 Python 中 这与列表有何不同 每
  • 如何使用AutoMapper按照类中定义的顺序映射对象?

    给定这两个对象 我使用非常不同的对象来更好地阐明 public class Car public string Brand get set public int Speed get set public class Apple public
  • 在 django ORM 中查询时如何将 char 转换为整数?

    最近开始使用 Django ORM 我想执行这个查询 select student id from students where student id like 97318 order by CAST student id as UNSIG
  • 如何用python脚本控制TP LINK路由器

    我想知道是否有一个工具可以让我连接到路由器并关闭它 然后从 python 脚本重新启动它 我知道如果我写 import os os system ssh l root 192 168 2 1 我可以通过 python 连接到我的路由器 但是
  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • 在 Swift 中使用 CommonCrypto 解密时出现问题

    我在一家Swift only加密 解密Extension for String and NSData 并且 crypt 部分的工作基于 Zaph 在链接问题中提供的答案 在 Swift 中使用 CCCrypt CommonCrypt 时出现
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 为什么 Double 不能隐式转换为 Decimal

    我不明白十进制和双精度的转换规则 这样做是合法的 decimal dec 10 double doub double dec 然而令我困惑的是 decimal 是 16 字节的数据类型 而 double 是 8 字节 因此将 double
  • Emma 不生成coverage.ec

    我设置了艾玛 它曾经对我有用 然后我们更改了源代码 现在它没有生成coverage ec根本不 它确实生成coverage em 测试临近结束时 出现错误消息 exec INSTRUMENTATION CODE 0 echo Downloa
  • ESP32:dsb1820 温度传感器给出恒定的负 127 读数

    我正在尝试使用连接到 esp32 微控制器的单个 dsb1820 温度传感器来获取温度读数 传感器连接到 esp32 的 GPIO 4 我打算将温度读数发送到云端 我面临的问题是温度读数总是给出值 127 我在网上某处读到 当 dsb182
  • TortoiseSVN 不要求身份验证?

    我已经在conf文件中设置了一个新的SVN存储库 运行SVNServe anon access none SVNServe 忠实地正确地做到了这一点 但是当我尝试使用 TortoiseSVN 浏览存储库时 它只是说不允许访问 它不应该要求我
  • 将 4 通道图像转换为 3 通道图像

    我正在使用 OpenCV 2 4 6 我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像 下面是我的代码 给出错误 OpenCV 错误 未知函数断言失败 我认为 cvCvtColor 支持 3 通道图像 有没有
  • Minizinc:生成有效的转变

    希望有人能帮助我解决这个问题 最初的问题是生成有效的班次 如下所述 我有这样的数组 m m m o o l l m m m l m m m 具有固定长度 S 其中 m 是工作 o 是办公室 我自由了 我需要确保至少每 6m 就有两个 l 在