用累积值表示设置时间

2024-02-09

调度问题有很多系列。我正在研究一个问题 我有一系列的工作/任务,需要从一个家庭过渡到另一个家庭 需要重新配置机器(设置时间)。

我在用着cumulatives[2/3]解决这个问题,但我不确定设置时间如何 可以表达。

在这个小例子中,我有 10 项任务属于 3 个不同的系列。任何任务都可以在任何机器上运行,但是从一个系列中的一个任务切换到另一个系列中的另一个任务需要添加设置时间。

:- use_module(library(clpfd)).
:- use_module(library(lists)).

go( Ss, Es, Ms, Tm, Lab ) :-

    Ss = [S1, S2, S3, S4,S5,S6,S7,S8,S9,S10], %Starttimes
    Es = [E1, E2, E3, E4,E5,E6,E7,E8,E9,E10], %Endtimeds
    Ms = [M1, M2, M3, M4,M5,M6,M7,M8,M9,M10], %MachineIds



    domain(Ss, 1, 30),
    domain(Es, 1, 30),
    domain(Ms, 1, 3 ),

    Tasks = [
        %Family 1: Setuptime, Su1 = 4, 
        task(  S1, 6,  E1,  1, M1 ),  %Task T1
        task(  S2, 6,  E2,  1, M2 ),  %Task T2
        task(  S3, 3,  E3,  1, M3 ),  %Task T3
        task(  S4, 7,  E4,  1, M4 ),  %Task T4
        %Family 2: Setuptime, Su2 = 3 
        task(  S5, 5,  E5,  1, M5 ),  %Task T5
        task(  S6, 8,  E6,  1, M6 ),  %Task T6
        task(  S7, 4,  E7,  1, M7 ),  %Task T7
        %Family 3: Setuptime, Su3 = 5 
        task(  S8, 4,  E8,  1, M8 ),  %Task T8
        task(  S9, 4,  E9,  1, M9 ),  %Task T9
        task( S10, 5,  E10, 1, M10 )  %Task T10
    ],

    %All machines has resource capacity = 1
    Machines = [
        machine(  1, 1 ), %M1
        machine(  2, 1 ), %M2
        machine(  3, 1 )  %M3
    ],

    cumulatives(Tasks, Machines, [bound(upper),task_intervals(true)] ),

    maximum( MaxEndTime, Es ),

    %Make the list of options to pass to the labeling predicate
    append( [ [minimize(MaxEndTime)], [time_out( Tm, _)], Lab ], LabOpt ),
    Vars=[S1,M1,S2,M2,S3,M3,S4,M4,S5,M5,S6,M6,S7,M7,S8,M8,S9,M9,S10,M10],
    labeling( LabOpt, Vars). 

一种有效的时间表(但不是最佳的)可以是:

M1: Su1,T1,T2,Su3,T10
M2: Su2,T5,T6,Su3,T8
M3: Su1,T3,T4,Su2,T7,Su3,T9

表达这一点的最佳方式是如何使用cumulatives[2/3]?通过将每个任务的持续时间设为域变量并为其添加额外的约束?


首先,cumulatives/[2,3] 没有表达式设置时间的选项,因此必须发布显式约束,表示“如果不同系列的两个任务在同一台机器上运行,则结束之间必须存在间隙”前置任务和后续任务的开始”。

这可以通过调用进行编码:

setups(Ss, Ms, [6,6,3,7,5,8,4,4,4,5], [1,1,1,1,2,2,2,3,3,3], [4,4,4,4,3,3,3,5,5,5]),

定义为:

% post setup constraints for start times Ss, machines Ms, durations
% Ds, task families Fs, and setup times Ts
setups(Ss, Ms, Ds, Fs, Ts) :-
    (   fromto(Ss,[S1|Ss2],Ss2,[]),
        fromto(Ms,[M1|Ms2],Ms2,[]),
        fromto(Ds,[D1|Ds2],Ds2,[]),
        fromto(Fs,[F1|Fs2],Fs2,[]),
        fromto(Ts,[T1|Ts2],Ts2,[])
    do  (   foreach(S2,Ss2),
            foreach(M2,Ms2),
            foreach(D2,Ds2),
            foreach(F2,Fs2),
            foreach(T2,Ts2),
            param(S1,M1,D1,F1,T1)
        do  (   F1 = F2 -> true
            ;   % find forbidden interval for S2-S1 if on same machine
                L is 1-(T1+D2),
                U is (T2+D1)-1,
                StartToStart in \(L..U),
                (M1#\=M2 #\/ S2 - S1 #= StartToStart)
            )
        )
    ).

其次,如果机器像您的示例中那样可以互换,您可以通过在 Ms 中强制 1 应该出现在 2 之前并且 2 应该出现在 3 之前来打破对称性:

value_order(Ms),

定义为:

value_order(Ms) :-
    automaton(Ms, [source(q0),sink(q0),sink(q1),sink(q2)],
              [arc(q0,1,q1),
               arc(q1,1,q1), arc(q1,2,q2),
               arc(q2,1,q2), arc(q2,2,q2), arc(q2,3,q2)]).

第三,在所有启动时间之前修复所有机器是更好的搜索策略。另一个改进是(a)修复机器,(b)缩小任务间隔,足以对每台机器施加订单,(c)修复开始时间:

    Q1 #= S1/6,
    Q2 #= S2/6,
    Q3 #= S3/3,
    Q4 #= S4/7,
    Q5 #= S5/5,
    Q6 #= S6/8,
    Q7 #= S7/4,
    Q8 #= S8/4,
    Q9 #= S9/4,
    Q10 #= S10/5,
    labeling([minimize(MaxEndTime)/*,time_out( Tm, _)*/|Lab],
             [M1,M2,M3,M4,M5,M6,M7,M8,M9,M10,
              Q1,Q2,Q3,Q4,Q5,Q6,Q7,Q8,Q9,Q10,
              S1,S2,S3,S4,S5,S6,S7,S8,S9,S10]).

通过这些更改,可在约 550 毫秒内获得具有最优性证明的最佳解决方案:

| ?- statistics(runtime,_), go(Ss,Es,Ms,_,[step]), statistics(runtime,R).
Ss = [1,7,1,13,7,12,17,1,5,9],
Es = [7,13,4,20,12,20,21,5,9,14],
Ms = [1,1,2,1,2,2,3,3,3,3],
R = [1621540,550] ? 
yes
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用累积值表示设置时间 的相关文章

  • Prolog 中的分配性检查

    假设我有一个等价关系eq 以及多个二元运算符o 1 o 2 o n 我想找出哪些操作分配给其他操作 假设我有一个可以确定两个表达式是否等价的知识库 一个简单的解决方案是输入所有可能的查询 对于左分配性 eq o 1 Z o 1 X Y o
  • Prolog 中的掩码

    我最近一直在尝试理解 Prolog 并且一直在搞乱 Prolog 中的列表列表 我正在尝试创建一种我想在 p 中的面具 序言 我有一个谓词 它确定 Prolog 中两个列表列表 比如说 L1 和 L2 之间的差异 并将它们保存为列表列表 比
  • 编写 Prolog 谓词的最佳实践是什么,以便它以指定参数的不同方式工作

    我正在尝试实现一些简单的谓词 例如 my length 或 my append 如果我们事先知道我们想要找到列表的长度 或者我们想要附加两个列表 这对我来说很容易 即我知道什么是输入 什么是输出 在 Prolog 中 可以用其他方式做事 如
  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • AllegroGraph 检查现有三元组

    我正在使用 AllegroGraph 4 我有一个三元组存储 并且只有在新的三元组尚不存在时我才会尝试添加它们 这是我的 Prolog 查询 select news alfas news a news tst has annotation
  • SLURM 每个节点提交多个任务?

    我发现了一些非常相似的问题 这些问题帮助我得到了一个似乎有效的脚本 但我仍然不确定我是否完全理解为什么 因此这个问题 我的问题 示例 在 3 个节点上 我想在每个节点上运行 12 个任务 总共 36 个任务 此外 每个任务都使用 OpenM
  • 如何在 GNU Prolog 中使用“long int”?

    所以基本上看来 GNU Prolog 在我的 32 位 x86 Linux 上使用 28 位整数 下面的代码无法编译 foo A A0 is 0xdeadbeef A1 is A0 gt gt 8 A2 is A0 gt gt 16 A3
  • 使 K 不同(基数) google OR-TOOLS

    我想知道 google or tools 中是否存在 Solver AllDifferent x 的泛化 允许指定我允许的不同元素的数量 因此 如果 len x 4 则 AllDifferent x 意味着 len set x 4 但是 如
  • 寻找最大最小值集合

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

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • 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
  • 求解序言中极其简单的方程:A = B + C?

    我有一个非常简单的方程 我希望能够在序言中求解 A B C 我希望能够编写一个谓词来表达这种关系 它可以处理任何一个未实例化的参数 无需推广到更复杂的关系或方程 myEquation A B C something 我可以使用以下语义进行调
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 列表中的连续元素

    我正在阻止一个谓词来编码Prolog 我需要对两个谓词进行编码 如果我打电话 u a b c d e f X 它会给X a b X b c X c d 如果我打电话 v a b c d e f X 它会给X a b X c d X e f
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • Node Js:Redis 作业在完成其任务后未完成

    希望你们做得很好 我在我的 Nodejs 项目中实现了 BullMQ Bull 的下一个主要版本 来安排发送电子邮件的作业 例如 发送忘记密码请求的电子邮件 所以 我编写了如下所示的代码 用户服务 await resetPasswordJo
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 根据一个值找到列表内列表的最小值

    我在序言中有这个列表 dublin london 1000 dublin moscow london 5000 我想计算列表的最小值 这样答案应该是 dublin london 1000 这个问题有一些类似的问题序言中列表列表中的最小值 h

随机推荐

  • 尝试运行 TensorFlow 时 CUDNN_STATUS_NOT_INITIALIZED

    我已经在带有 Cuda 9 0 和 CuDNN 7 0 5 以及普通 Python 2 7 的 Ubuntu 16 04 上安装了 TensorFlow 1 7 尽管它们的 CUDA 和 CuDNN 示例都运行良好 并且 TensorFlo
  • 如何在C++中输出欧元符号

    我试图为一个计算出租车费用的程序输出一个 Eurosign 然后将其转换为美元或欧元 规范的一部分是我必须输出 Eurosign 我已经尝试过 Unicode 但我没有任何运气 任何帮助将不胜感激 谢谢 这是我的代码 void produc
  • Visual Studio 2012“扩展和更新”“无法连接到远程服务器”

    不幸的是 过去几个月的情况就是如此 我无法安装新的或更新的软件包工具 gt 扩展和更新我尝试了一切 但无法找到原因 我试过了 访问 NuGet 并从 下载包 包管理器控制台 安装包 SUCCESS 使用 Web 浏览器访问存储库 Visua
  • Boost asio,单个 TCP 服务器,多个客户端

    我正在创建一个 TCP 服务器 它将使用 boost asio 它将接受来自许多客户端的连接 接收数据并发送确认 问题是我希望能够接受所有客户 但我一次只想与一个客户合作 我希望所有其他事务都保留在队列中 Example 客户端1连接 客户
  • 使用 spring-data-jpa 自定义 ItemReader

    我正在使用现有实体和存储库创建一个 Spring 批处理项目 我需要使用自定义ItemReader用于使用现有 jpa 存储库读取数据的作业 定制阅读器 public class InMemoryReader implements Item
  • 在 INSERT 之后使用 OUTPUT 将标识列的值获取到(非表值)变量中

    给出以下简单的测试表 CREATE TABLE dbo Test Id bigint IDENTITY 1 1 NOT NULL Name varchar 50 NULL 我想在之后将标识列的值放入标量变量中INSERT使用OUTPUT条款
  • 使用 $dialog 多次打开同一个对话框

    我创建这个 plnkr http plnkr co edit fdAdDNU9adtYrY9smQvU p preview在回答这个问题时 AngularJS 在对话框中打开控制器 动态加载模板 https stackoverflow co
  • Android 中已弃用 URLEncodedUtils

    URLEncodedUtils在 Android API 22 中已弃用 我可以在这段代码中使用什么来代替 我需要改变URLEncode Utils Format line public String construct return if
  • Winapi :: 获取可用句柄数

    我想创建长时间运行我的程序的测试 并不时输出可用句柄的计数 我怎样才能用一些 WINAPI 函数来做到这一点 这是一篇关于如何调试句柄泄漏的好文章http blogs technet com b yongrhee archive 2011
  • 将 Base64 jpeg 图像传递给 og:image

    我的网站上有在运行时生成的图像 我使用 html 将其显示 img src 现在 我希望 Facebook 获取此图像 但如果我对 og image 元标记执行相同操作 Facebook 调试器会给我一个错误 有什么解决办法吗 当然 我想避
  • 将一系列值映射到另一个值

    我正在尝试找到一种有效的方法将一系列值映射到另一个值 例如 1 9 gt 49 10 24 gt 54 25 49 gt 59 50 74 gt 50 75 99 gt 49 100 150 gt 40 这里的值不遵循任何常规模式 一种解决
  • 由于其保护级别,文本框无法访问[重复]

    这个问题在这里已经有答案了 课堂作业要求我们创建一份简单的能源账单 第一天生成一个 ID 号 我想将其复制到第二个表格 但我不断收到以下信息 错误 CS0122 Form1 idgen 由于其保护级别而无法访问由于我将引用第一种形式中的许多
  • build.gradle 错误:无法创建tastk ':generateLockfiles'。 Flutter项目中但App运行正常

    我的 Flutter 项目中的 build gradle 文件 android build gradle 有错误 该应用程序运行完全正常 但这个错误对我来说仍然不太好 有人遇到过这个问题 错误吗 这是我完整的 build gradle 文件
  • 如何实现对无缓冲通道的非阻塞写入?

    From 有效的行动 https golang org doc effective go html channels 接收器总是阻塞 直到有数据要接收 如果通道未缓冲 则发送方会阻塞 直到接收方收到该值 But 信号 通知 https go
  • NodeJs - esc 不是函数

    我在尝试渲染时遇到了一个奇怪的问题 ejs文件在此特定行 TypeError home me nodeapp app views default page connection ejs 66 64 div class col s12 l8
  • 如何限制pyTelegramBotAPI中少数用户的访问?

    我正在使用远程机器人 https github com eternnoir pyTelegramBotAPI https github com eternnoir pyTelegramBotAPI 创建一个机器人来向其用户发送照片 关键是我
  • 请求对象传递给 Django-Tables2 Tables 类

    假设我们有两个模型 ModelS 和 Model B 我将使用 Django Tables2 从这些模型中创建一个表 在tables py 中 您可以有两个单独的表类 如下 from models import ModelA ModelB
  • Python-social-auth使用Django服务器主机名和监听端口作为redirect_uri

    我正在将 python social auth 与 Django 一起使用 以使用 Oauth2 google oauth2 向 Google 进行身份验证 在我的模板中我使用了一些东西like https github com omab
  • 如何在 Node.JS Google Cloud 函数中获取访问令牌?

    我在 Google Cloud 上的 Node JS 中有一个云函数 我需要向 Google 发出 GET 请求 并且它需要一个身份验证令牌 使用curl你可以使用生成一个 gcloud auth application default p
  • 用累积值表示设置时间

    调度问题有很多系列 我正在研究一个问题 我有一系列的工作 任务 需要从一个家庭过渡到另一个家庭 需要重新配置机器 设置时间 我在用着cumulatives 2 3 解决这个问题 但我不确定设置时间如何 可以表达 在这个小例子中 我有 10