Algorithm 如何对调度和资源分配问题建模

Algorithm 如何对调度和资源分配问题建模,algorithm,parallel-processing,job-scheduling,constraint-programming,resource-scheduling,Algorithm,Parallel Processing,Job Scheduling,Constraint Programming,Resource Scheduling,我想实现以下作业/资源调度问题: 边编码优先关系的作业的DAG 如果作业没有优先关系,它们可以并行执行 多个资源池,每个池包含一个或多个类似的资源 作业可能依赖于一个或多个池中的一个或多个资源。例如,作业J1说:“我需要来自池P1的2个资源和来自池P2的7个资源。” 一份工作可能会表示它需要的资源与其前一份工作完全相同。也就是说,作业J2可能会说“我需要来自池P1的1个资源,但它必须是作业J1分配的资源之一。”作为一种简化,我假设作业J2必须是此类约束的J1的直接继承者 资源依赖项可以是读或写

我想实现以下作业/资源调度问题:

  • 边编码优先关系的作业的DAG
  • 如果作业没有优先关系,它们可以并行执行
  • 多个资源池,每个池包含一个或多个类似的资源
  • 作业可能依赖于一个或多个池中的一个或多个资源。例如,作业J1说:“我需要来自池P1的2个资源和来自池P2的7个资源。”
  • 一份工作可能会表示它需要的资源与其前一份工作完全相同。也就是说,作业J2可能会说“我需要来自池P1的1个资源,但它必须是作业J1分配的资源之一。”作为一种简化,我假设作业J2必须是此类约束的J1的直接继承者
  • 资源依赖项可以是读或写,也可以是读或写,或者“不在乎”
  • 当作业J1表示它从池P1写入资源时,其后续作业J2对“与J1从P1获得的相同资源”具有读取依赖关系。在这两者之间,由于资源是有状态的,因此资源不可用于其他写入作业
  • 我不知道每项工作的执行时间提前,也没有工作的优先级或最后期限要求
我正在寻找:

  • 一种在形式域中表达此问题的方法
  • 一种离线可调度性测试,用于回答作业图是否可以在给定的需求和约束下执行的问题
  • 一种在线调度算法的建议

  • 如果没有资源池,但每种类型只有一个资源,那么问题可能会简单得多。我熟悉图论的基础知识和简单的数据流分析算法。

    我想我应该通过引入“命名资源”的概念来修改您的描述,其中命名资源是名称和未命名资源的集合。然后作业可以依赖于命名和未命名的资源,并且每个命名资源必须从使用它的第一个作业开始到使用它的最后一个作业结束的时间保持驻留状态

    正式地说,我们有

    • n个作业J={0,1,…,n-1}
    • 不可改变的、可传递的优先关系≺ 论J
    • 一组资源类型R
    • 一组名称X
    • 从R到a的地图ℕ 指示可用资源(其中ℕ = {0,1,2,…}是自然数)
    • 从J到U的地图ℕR表示未命名的所需资源(ℕR是从R到的映射ℕ)
    • 从J到2X的映射Y表示命名的资源需求(2X是X的子集)
    • 从X到Z的地图ℕR表示命名资源的组成
    为了检查计划的可行性,没有理由并行运行作业。因此,我们需要的是
    • 对于所有作业j1≺ j2,我们有π(j1)<π(j2)[<是一个线性扩展]
    • 对于{0,1,…,n-1}中的每个时间t,使用的资源不会超过可用的资源。形式上(urgh),对于每个命名的资源x&in;x,让sx和ex是{π(j)| j&in;j&wedge;x&in;Y(j)}的最小值和最大值[即,每个作业的时间取决于x]。然后对于所有的t,我们想要
    ∑x&in;x[sx≤ T≤ ex]Z(x)+U(π-1(t))≤ A,

    其中[条件]是艾弗森括号(如果满足条件,则为1,否则为0),并且≤ 是向量的标准偏序

    为了测试时间表的可行性,我会将类似于这个公式的东西输入CP-SAT解算器(例如)


    为了在线计划,我会使用Dijkstra的一个变体,它使用离线测试来查看启动依赖项已完成的作业是否安全。这将恢复并行性,因为启动多个作业可能没问题。

    抱歉,我太早按了enter键。谢谢你的回复。我正在仔细研究,但我有一些不同下面有一些问题。请您澄清一下:ℕR是从R到的映射ℕ", "2X是X的子集,“