约束编程:多个工人的调度

2023-12-02

我是约束编程的新手。我想这是一个简单的问题,但我无法解决它。问题是这样的:

  • 我们有多台机器 (N),每台机器的资源都是有限的(比如说内存,所有机器的资源可以相同。)
  • 我们有 T 个任务,每个任务都有一个持续时间,并且每个任务都需要一定量的资源。
  • 只要不超出其资源,一台机器可以同时处理多个任务。
  • 一项任务不能在机器之间拆分,并且必须一次性完成(即没有暂停)。

我们如何将任务分配给机器以最小化结束时间或使用的机器数量?

看起来我应该能够通过累积谓词来实现这一点,但它似乎仅限于将一组任务调度给具有有限全局资源的一个工作人员,而不是可变数量的工作人员。

我刚刚学习 CP 和 MiniZinc。关于如何概括累积的任何想法?或者,是否有我可以理解的现有 MiniZinc 模型可以执行类似的操作(或足够接近?)

Thanks,

PS:我没有任何具体数据,因为这在很大程度上是一个假设/学习练习。假设您有 10 台机器和 10 个任务,其持续时间(以小时为单位):2,4,6,5,2,1,4,6,3,2,12,内存要求(GB):1,2,4, 2,1,8,12,4,1,10。每台机器都有 32 GB 的 RAM。


这是一个似乎是正确的模型。然而,它根本不使用“累积”,因为我想尽可能多地可视化(见下文)。

主要思想是 - 对于每个时间步长 1..max_step - 每台机器必须只有

输出部分以不同的方式显示解决方案。请参阅下面的评论。

该模型是稍微编辑过的版本http://hakank.org/minizinc/scheduling_with_multiple_workers.mzn

更新:我还应该提到,该模型允许机器上使用不同大小的 RAM,例如有些机器有 64GB,有些机器有 32GB。这在我网站上的模型中得到了演示 - 但进行了评论。由于模型使用 value_precede_chain/2 - 这确保了机器按顺序使用 - 建议按 RAM 大小递减的顺序对机器进行排序(因此首先使用较大的机器)。

(另外,我在 Picat 中对问题进行了建模:http://hakank.org/picat/scheduling_with_multiple_workers.pi )

include "globals.mzn"; 
int: num_tasks = 10; 
int: num_machines = 10;

array[1..num_tasks] of int: duration = [2,4,6,5,2,1,4,6,3,12]; % duration of tasks

array[1..num_tasks] of int: memory   = [1,2,4,2,1,8,12,4,1,10];  % RAM requirements (GB)
int: max_time = 30; % max allowed time

% RAM for each machine (GB)
array[1..num_machines] of int: machines_memory = [32 | i in  1..num_machines];


% decision variables
array[1..num_tasks] of var 1..max_time: start_time; % start time for each task
array[1..num_tasks] of var 1..max_time: end_time;   % end time for each task
array[1..num_tasks] of var 1..num_machines: machine; % which machine to use
array[1..num_machines,1..max_time] of var 0..max(machines_memory): machine_used_ram;

var 1..num_machines: machines_used = max(machine);
var 1..max_time: last_time = max(end_time);

% solve :: int_search(start_time ++ machine ++ array1d(machine_used_ram), first_fail, indomain_split, complete)  minimize last_time;
solve :: int_search(start_time ++ machine ++ array1d(machine_used_ram), first_fail, indomain_split, complete) minimize machines_used;

constraint
  forall(t in 1..num_tasks) (
    end_time[t] = start_time[t] + duration[t] -1
  ) 
  % /\ cumulative(start_time,duration,[1 | i in  1..num_tasks],machines_used)
  /\
  forall(m in 1..num_machines) (
     % check all the times when a machine is used
     forall(tt in 1..max_time) (
        machine_used_ram[m,tt] = sum([memory[t]*(machine[t]=m)*(tt in start_time[t]..end_time[t]) | t in 1..num_tasks]) /\ 
        machine_used_ram[m,tt] <= machines_memory[m]

        % sum([memory[t]*(machine[t]=m)*(tt in start_time[t]..end_time[t]) | t in 1..num_tasks]) <= machines_memory[m]
     )

  )

  %  ensure that machine m is used before machine m+1 (for machine_used)
  /\ value_precede_chain([i | i in 1..num_machines],machine)
;

output [
  "start_time: \(start_time)\n",
  "durations : \(duration)\n",
  "end_time  : \(end_time)\n",
  "memory    : \(memory)\n",
  "last_time : \(last_time)\n",
  "machine   : \(machine)\n",
  "machines_used: \(machines_used)\n",
]
++
[ "Machine memory per time:\n    "]
++
[ show_int(3,tt) | tt in 1..max_time ]
++
[
  if tt = 1 then "\n" ++ "M" ++ show_int(2, m) ++ ": "  else " " endif ++
 show_int(2,machine_used_ram[m,tt])
  | m in 1..num_machines, tt in 1..max_time
]
++ ["\n\nTime / task: machine(task's memory)\n  Task "] ++
[
  show_int(7,t)
  | t in 1..num_tasks
]
++ 
[
  if t = 1 then "\nTime " ++ show_int(2,tt) ++ " " else " " endif ++
    if tt in fix(start_time[t])..fix(end_time[t]) then
      show_int(2,fix(machine[t])) ++ "(" ++ show_int(2,memory[t]) ++    ")"
    else 
       "      " 
    endif 
   | tt in 1..fix(last_time), t in 1..num_tasks
 ] 
;

该模型有两种“模式”:一种是最小化时间(“最小化last_time”),另一种是最小化所使用的机器数量(“最小化machines_used”)。

最小化时间的结果是:

start_time: [11, 8, 3, 8, 11, 8, 9, 7, 8, 1]
durations : [2, 4, 6, 5, 2, 1, 4, 6, 3, 12]
end_time  : [12, 11, 8, 12, 12, 8, 12, 12, 10, 12]
memory    : [1, 2, 4, 2, 1, 8, 12, 4, 1, 10]
last_time : 12
machine   : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
machines_used: 1
Machine memory per time:
       1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
M 1: 10 10 14 14 14 14 18 31 31 31 32 30  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 2:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 3:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 4:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 5:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 6:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 7:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 8:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M 9:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
M10:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

 Time / task: machine(task's memory)
  Task       1      2      3      4      5      6      7      8      9     10
 Time  1                                                                 1(10)
 Time  2                                                                 1(10)
 Time  3                1( 4)                                            1(10)
 Time  4                1( 4)                                            1(10)
 Time  5                1( 4)                                            1(10)
 Time  6                1( 4)                                            1(10)
 Time  7                1( 4)                              1( 4)         1(10)
 Time  8         1( 2)  1( 4)  1( 2)         1( 8)         1( 4)  1( 1)  1(10)
 Time  9         1( 2)         1( 2)                1(12)  1( 4)  1( 1)  1(10)
 Time 10         1( 2)         1( 2)                1(12)  1( 4)  1( 1)  1(10)
 Time 11  1( 1)  1( 2)         1( 2)  1( 1)         1(12)  1( 4)         1(10)
 Time 12  1( 1)                1( 2)  1( 1)         1(12)  1( 4)         1(10)
 ----------
 ==========

第一部分“每次机器内存”显示每台机器 (1..10) 每个时间步 (1..30) 的负载情况。 第二部分“时间/任务:机器(任务的内存)”以“机器(机器的内存)”的形式显示每个时间步(行)和任务(列)所使用的机器以及任务的内存。

使用模型的第二种方法是最大限度地减少使用的机器数量,给出此结果(经过编辑以节省空间)。 IE。一台机器足以在允许的时间内(1..22 个时间步长)处理所有任务。

 start_time: [19, 11, 3, 9, 20, 22, 13, 7, 17, 1]
 durations : [2, 4, 6, 5, 2, 1, 4, 6, 3, 12]
 end_time  : [20, 14, 8, 13, 21, 22, 16, 12, 19, 12]
 memory    : [1, 2, 4, 2, 1, 8, 12, 4, 1, 10]
 last_time : 22
 machine   : [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
 machines_used: 1
 Machine memory per time:
       1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
 M 1: 10 10 14 14 14 14 18 18 16 16 18 18 16 14 12 12  1  1  2  2  1  8  0  0  0  0  0  0  0  0
 M 2:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0
 ....
 Time / task: machine(task's memory)
   Task       1      2      3      4      5      6      7      8      9     10
 Time  1                                                                 1(10)
 Time  2                                                                 1(10)
 Time  3                1( 4)                                            1(10)
 Time  4                1( 4)                                            1(10)
 .....
 ----------
 ==========
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

约束编程:多个工人的调度 的相关文章

  • Scheduling and emailing PeopleSoft Query results

    You could E Mail the Query results by embedding the paramters in a nVision Layout Create a Tabular nVision Layout Add th
  • 如何在 MiniZinc 中安装 Google 的 CP 求解器 OR-Tools?

    我目前正在研究 MiniZinc 并且我一直在使用 MiniZinc 中集成的两个求解器来运行我的模型 Gecode 和 Chuffed 我一直在 IDE 中运行它 但我知道它也可以在 bash 中运行 使用minizinc命令 但我想测试
  • 使用 Ruby on Rails 安排发送电子邮件任务的最佳方式是什么?

    我想安排一项日常任务 每天早上 7 点 我希望发送一封电子邮件 无需人工干预 我正在研究 RoR 框架 我想知道最好的方法是什么 我听说过 BackgrounDRB OpenWFEru 调度程序或基于 Cron 的东西 但我是新手 不明白哪
  • 在 Windows 上通过计划任务加载 URL 的推荐方法

    我有一个托管在 Windows 机器上的网页 我需要确保每天至少加载一次 我当前的计划是创建一个计划任务 打开 Internet Explorer 并点击 URL C Program Files Internet Explorer iexp
  • 为什么每秒进行一次非自愿上下文切换?

    操作系统是 RHEL 6 2 6 32 我已经隔离了一个核心 并在其上运行一个计算密集型线程 proc thread id status 每秒显示一次非自愿上下文切换 有问题的线程是 SCHED NORMAL 线程 我不想更改它 如何减少非
  • 如何实现一个实用的光纤调度器?

    我了解使用协程作为基础和实现玩具调度程序的基础知识 但我认为这是对整个异步调度程序过于简单化的看法 我的想法中缺少了一大堆漏洞 如何防止 cpu 运行空闲 等待的调度程序 一些光纤只是休眠 另一些则等待操作系统的输入 您需要将 io 操作复
  • MiniZinc 数组中字符串值的索引

    问题 给定一个 MiniZinc 字符串数组 int numStats set of int Stats 1 numStats array Stats of string statNames 使用从 MiniZinc 数据文件加载的数据 n
  • 如何安排 C# Windows 服务每天运行一个方法? [复制]

    这个问题在这里已经有答案了 可能的重复 如何安排 C Windows 服务每天执行任务 我正在创建一个 C Windows 服务 但我没有找到让计时器每天在 App Config 文件中指定的特定时间触发方法的最佳方法 例如 每天早上 6
  • 多数独人工智能方法

    我正在概念化一个求解器的变体sudoku called 多重数独 其中多个板重叠 如下所示 如果我正确理解游戏 那么您必须以这样的方式解决每个网格 即任何两个或多个网格之间的重叠都是每个网格解决方案的一部分 我不确定我应该如何思考这个问题
  • Quartz线程并行执行还是顺序执行?

    我们有一个基于石英的调度程序应用程序 每分钟运行大约 1000 个作业 这些作业均匀分布在每分钟的几秒内 即每秒大约 16 17 个作业 理想情况下 这 16 17 个作业应该同时触发 但是我们的第一个语句 仅记录作业的执行方法的执行时间
  • 如今,设置线程亲和性而不是将其留给操作系统的充分理由是什么?

    在这里搜索 线程亲和力 的答案 我看到很多人对此感兴趣 但除了可能获得稳定的 QueryPerformanceTimer 结果之外 没有什么理由 假设有一个现代操作系统和一个带有现代 4 6 核 CPU 的现代 2 4 插槽工作站 服务器类
  • 以低优先级启动进程(使用 Runtime.exec / ProcessBuilder.start)

    我需要在低优先级下启动一个 CPU 密集型系统进程 这样它就不会减慢我的服务器速度 我怎样才能在 Linux 上做到这一点 这与这个问题类似 使用 Runtime exec ProcessBuilder start 以低优先级启动 Java
  • 在 MiniZinc 中我该如何解决这个错误?

    在 MiniZinc 中 如何编译此代码而不出现错误 未找到具有此签名的函数或谓词 round var float var int D 1 var int F constraint F round D 2 该消息仅意味着 MiniZinc
  • OptaPlanner 是否支持连续变量的优化和约束?

    我正在阅读文档中矛盾的内容 一方面 这段话似乎表明连续计划变量是可能的 规划值范围是一个可能的规划值的集合 规划变量 该集合可以是离散的 例如第 1 2 3 行 或 4 或连续 例如 0 0 和 1 0 之间的任何双精度值 另一方面 在定义
  • PHP:运行计划作业(cron 作业)

    我的网络酒店上有一个网站 我想在其上运行一些计划任务 您会推荐哪些方法来实现这一目标 到目前为止 我想到的是在每个页面的顶部包含一个脚本 然后让该脚本检查是否该运行该作业 这只是我正在思考的一个简单例子 if alreadyDone 0 t
  • 进程友善度(优先级)设置对 Linux 没有影响

    我编写了一个测试程序 其中仅包含一个无限循环 其中包含一些 内部计算 并且不执行 I O 操作 我尝试启动该程序的两个实例 其中一个具有高 尼斯值 另一个具有低尼斯值 sudo nice n 19 taskset 1 test sudo n
  • Linux 中的调度:在计算机空闲时运行任务(= 无用户输入)

    我想跑折叠 home http folding stanford edu 我的 Ubuntu 8 10 机器上的客户端仅在空闲时运行 因为该程序消耗大量 RAM 我所说的 空闲 是指没有用户活动 键盘 鼠标等 时的状态 由于 F H 具有最
  • php 的睡眠函数

    作为使用 cron 作业的可能替代方案 我找到了 sleep 函数 我以前从未使用过这个 如果我告诉我的脚本在一种循环内运行 并且在该循环内我有这样的指令 sleeps for 86400 seconds or one day sleep
  • 用 Chronos 取代 Celerybeat

    成熟到什么程度Chronos http airbnb github io chronos 它是像 celery beat 这样的调度程序的可行替代品吗 现在 我们的调度实现了一个定期的 心跳 任务 该任务检查 未完成的 事件 并在过期时触发
  • 适合从记录中提取 OneToMany 关系的约束编程

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

随机推荐

  • 在 Windows 上开发 Python 和 Django 应用程序时的 .gitignore

    我应该改变什么 gitignore当我在 Windows 上使用 PTVS 开发 Python Django 应用程序时 文件是什么 GitHub 有一个不错的收集 gitignore模板 当我启动 Django 项目时 我抓住了Pytho
  • Android 中的电话号码格式

    在我的应用程序中 我有一个 editText 它将接受用户的电话号码 我的目标是 一旦用户输入电话号码 它就应该被格式化 就像通过在文本更 改侦听器上应用一样 格式就像XXX XXX XXXX 我将代码写为 ePhone addTextCh
  • Python isDisjoint() 运行时

    Python 2 7 的算法运行时是多少isDisjoint other 集合的方法 它比简单地做更快吗intersection other 然后检查len gt 0那个返回的交集 这两种情况的复杂性都是O min len s len t
  • python 2.7 的非 ASCII 标识符

    我知道在 python 3 x 中我可以使用非 ASCII 标识符 PEP 3131 x1 2 x2 4 x x2 x1 print x python 2 7有这样的功能吗 也许 有人将它移植到 2 x 分支吗 不 Python 2 中没有
  • 调用 C# 代码时,PowerShell $null 不再为 null

    在 PowerShell 中 我们可以定义 C 代码并执行它 将 null 传递到以下最简单的函数中表明 not null 被传递到函数中 Add Type TypeDefinition public static class foo pu
  • 用于访问另一个域上的文件的 CORS 标头

    我正在尝试在 Codepen 上创建一个音频可视化程序 我使用 apache 创建了自己的 Ubuntu Web 服务器 它允许我直接访问以修改服务器的标头和配置 虽然浏览器可以访问不同域上的文件 但它需要特殊的 CORS 标头来读取音频中
  • 无法连接到 android 5.1 上的本机本地套接字

    我有命令行工具 它发送广播并等待结果 服务器代码 错误处理省略 int makeAddr const char name struct sockaddr un pAddr socklen t pSockLen int nameLen str
  • 某些象形文字语言中的字计数器?

    是否有任何可用的库用于某些象形文字语言的字数统计 例如 中文 日文 韩文 我发现 MS Word 可以有效地计算这些语言的文本 我可以在 NET 应用程序中添加对 MS Word 库的引用来实现此功能吗 或者还有其他解决方案可以达到这个目的
  • 类型错误:第一个参数必须是可调用的,defaultdict

    错误来自publishDB defaultdict defaultdict 我想制作一个像这样的数据库 subject1 student id assignemt1 marks assignment2 marks finals marks
  • 耙子中止! ActiveRecord::Base:Class 的未定义方法“migration_error=”

    我正在 Ruby on Rails 上开发项目 到目前为止 我使用 Rails 4 一切都很好 然后我遇到了 gem 的无能问题 我决定回滚到 Rails 3 更改了 Gemfile 删除了 Gemfile lock 所有 Rails 安装
  • Play WS API:限制请求速率

    我正在使用异步 Play WS Scala API 来查询 RESTful 服务 我想知道如何处理List包含要通过以下方式调用的请求 URLWSClient 但每秒不得超过 1 个请求 该服务允许每个客户端每秒 仅 1 个请求 从逻辑的角
  • 尝试使用 Github Actions 复制存储库时出现身份验证错误

    我有一堆使用 Azure Pipelines 进行 CI CD 的存储库 我现在正在尝试将其移植到 Github Actions 这是我正在做的第一个工作 https github com Azure AzureAuth tree fix
  • 快速跨平台 C/C++ 图像处理库

    有哪些用于图像处理的跨平台和高性能图像库 调整大小和查找颜色 色调直方图 无需图形用户界面 这是针对 C C 的 到目前为止我已经研究过 OpenCV GIL 作为 Boost 的一部分 DevIL CImg 我的问题 我上面列出的性能如何
  • 将回形针图像复制到 Rails 4 中的新记录

    我的网站用于发布专辑评论 称为 Pin 图 引脚模型具有以下属性 艺术家 年份 标题 排名 描述和 图像 该图像使用 Paperclip 并存储在 Amazon S3 上 如果重要的话 我试图允许用户查看其他用户发布的评论 并单击链接以更简
  • java中的超链接

    有没有什么方法可以在Java中的JTextArea中创建可点击的超链接 如果您绝对想使用 jTextArea 可以执行此操作的一种方法是获取 User MouseClick x y 位置 然后从那里进行处理 然而 更简单的方法是使用 JEd
  • 如何在android中获取画布中屏幕尺寸的大小?

    我能够在正常活动中获取屏幕尺寸 但我需要在画布视图中获取屏幕尺寸并根据它进行操作 上面的任何片段都会有所帮助 谢谢 我得到了 widthPixels heightPixels 使用这个 DisplayMetrics metrics getB
  • 在 WooCommerce 中以编程方式对保存的信用卡收费

    我正在 WooCommerce 中以编程方式创建订单 并且需要向默认保存的信用卡收费 我正在使用 WooCommerce stripe 插件 并已弄清楚如何设置正确的付款方式 但无法弄清楚如何实际向卡收费 下面是我到目前为止的代码 orde
  • Grails 使用 config.properties 值到 BuildConfig.groovy 中

    我有一个config properties文件下conf目录 并在上面的文件中有一个条目 如下所示 grails tomcat version 2 2 4 我如何使用这个值BuildConfig groovy file Suppose pl
  • iPhone - 用于文本转语音功能的 API [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道iPhone是否有支持文本转语音功能的API 我环顾四周但没有找到任何东西 所以只是想确认一下 期待中感谢 我曾经遇到过这个问题 并在 iP
  • 约束编程:多个工人的调度

    我是约束编程的新手 我想这是一个简单的问题 但我无法解决它 问题是这样的 我们有多台机器 N 每台机器的资源都是有限的 比如说内存 所有机器的资源可以相同 我们有 T 个任务 每个任务都有一个持续时间 并且每个任务都需要一定量的资源 只要不