【问题标题】:How to add PuLP constraints over time ranges which aren't modeled as variables如何在未建模为变量的时间范围内添加纸浆约束
【发布时间】:2020-08-21 04:11:55
【问题描述】:

我目前正在研究一个涉及大量参数和决策变量的复杂调度问题。简而言之,我正在尝试根据容量、复杂性、可用时间和潜在完成时间为任务安排资源。

我有一个矩阵 Av,j,t 确定在时间 t 分配给项目 v 上的作业 j 的数量,以及变量 Sv,j 和 Ev,j 确定每个项目的开始和结束时间按项目工作。从数学上讲,这些约束都是有意义的,但我在建模一些特别是遇到了很多麻烦。

为确保作业分配只发生在作业的开始和结束期间,我实施了约束:

pulp.lpSum([A[t][v][j] for t in [t0 for t0 in T if t0 >= S[v][j]]]) == P[v][j]
pulp.lpSum([A[t][v][j] for t in [t0 for t0 in T if t0 <= S[v][j] - 1]]) == 0
pulp.lpSum([A[t][v][j] for t in [t0 for t0 in T if t0 >= E[v][j] + 1]]) == 0

其中 Pv,j 是任务使用单个资源所花费的总时间。我对这种约束的主要问题是开始和结束时间是模型变量,而 T(时间集)不是。试图在模型中强制执行这个约束被证明是有问题的,因为 Sv,j 在设置约束时并没有真正“初始化”,所以这个约束实际上并没有像集合那样做任何事情

[t0 for t0 in T if t0 >= S[v][j]]

不随型号而改变。我还设置了一个指标来跟踪作业完成情况 Xv,j,t,如果 t > Ev,j 则为 1,否则为 0。我尝试以多种方式强制执行这一点,但它们都依赖于 T 中 t 的集合之和,当模型调整时它们不会调整。

有人对我如何强制这些集合根据模型本身进行调整有任何想法吗?

【问题讨论】:

    标签: python mathematical-optimization pulp


    【解决方案1】:

    所有约束都必须是线性的。您尝试指定的是非线性的,因此不允许。

    相反,您需要建模如下:

                           t   1 2 3 4 5 6 7 8 9 10 11
       job is executing  x(t)  0 0 0 0 1 1 1 1 0 0 0 
       job is starting   s(t)  0 0 0 0 1 0 0 0 0 0 0 
        
    

    这可以建模为:

       s(t) >= x(t)-x(t-1)
       sum(t, s(t)) <= 1      (one start allowed)
       sum(t, x(t)) = joblen
    

    获取开始和结束时间:

       S = sum(t, t*s(t));
       E = S + joblen - 1
    

    这是一种相当标准的方法。你的教科书中可能会提到。

    【讨论】:

    • 非常感谢,真的很感激你的洞察力——我被模型的数学困住了,以至于我错过了约束条件下必要的线性条件:)
    猜你喜欢
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    相关资源
    最近更新 更多