【发布时间】: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