【问题标题】:Optimised Weighted Interval Scheduling Algorithms优化加权区间调度算法
【发布时间】:2019-06-20 18:44:50
【问题描述】:

我有 n 个任务要在给定的时间段内安排。每个任务具有最早开始时间、最佳开始时间、最晚结束时间、持续时间和优先权权重。任务不能重叠。要求是安排尽可能多的任务,尽可能接近它们的最佳开始时间,并优先考虑权重较高的任务,而不是所有任务都可以容纳。我已经阅读了间隔调度和加权间隔调度,但我没有遇到过包含最佳开始时间概念的算法。谁能给我指出一个可以做到这一点的 Python 库,或者我可以自己编码的合适算法的描述? 【应用是天文成像的调度,起止时间是每个天体在天空中升起落下的时间,最佳时间是天体处于最大高度的时间;权重是天文学家分配给每个物体的优先级]。

【问题讨论】:

    标签: python-3.x scheduling


    【解决方案1】:

    使用 CP Optimizer (https://pypi.org/project/docplex/) 应该很容易建模和求解。使用此工具,您只需将问题表述为组合优化问题,自动搜索就会解决它(如果实例不是太大,则证明解决方案的最优性)。

    这是我如何在 CP Optimizer 中制定此问题的示例(我给出了一个小实例):

    N = range(20)
    
    EST = [166, 157, 118, 254, 213, 73, 100, 38, 113, 84, 43, 257, 74, 246, 73, 242, 207, 223, 242, 122] 
    OST = [205, 195, 134, 256, 252, 157, 106, 44, 167, 84, 85, 266, 121, 256, 110, 310, 229, 262, 286, 162] 
    LET = [259, 233, 172, 267, 269, 175, 111, 48, 197, 91, 97, 292, 147, 289, 127, 313, 238, 319, 346, 177] 
    D = [9, 7, 5, 1, 9, 9, 4, 2, 3, 2, 9, 8, 3, 1, 7, 2, 3, 4, 4, 2] 
    W = [0.254, 0.811, 0.479, 0.27, 0.968, 0.036, 0.373, 0.887, 0.855, 0.61, 0.855, 0.708, 0.376, 0.434, 0.834, 0.978, 0.354, 0.4, 0.128, 0.208] 
    P = [1.46, 1.47, 9.29, 0.32, 5.43, 5.02, 8.1, 8.35, 7.79, 0.79, 3.86, 4.33, 7.16, 0.86, 5.82, 1.88, 2.16, 0.04, 9.37, 9.36]
    
    # PROBLEM FORMULATION
    
    from docplex.cp.model import *
    model = CpoModel()
    
    # Decision variables: x[i] is the ith observation
    x = [ interval_var(size=D[i], optional=True) for i in N]
    
    # Cost expression
    cost = sum([start_eval(x[i], CpoSegmentedFunction((-W[i],0),[(OST[i],0,W[i])]), P[i]) for i in N])
    
    # Objective: minimize cost
    model.add(minimize(cost))
    
    # Constraints
    model.add([EST[i] <= start_of(x[i], EST[i])] for i in N)
    model.add([end_of(x[i]) <= LET[i]] for i in N)
    model.add(no_overlap(x))
    
    # PROBLEM RESOLUTION
    
    sol = model.solve(trace_log=True, LogPeriod=1000000, TimeLimit=30)
    
    # DISPLAY OF SOLUTION
    
    for i in N:
        s = sol.get_var_solution(x[i])
        if s.is_absent():
            print('Task ' + str(i) + ' not scheduled')
        else:
            print('Task ' + str(i) + ' scheduled on [' + str(s.get_start()) + ',' +  str(s.get_end()) + ')')
    

    在数据中:

    • EST:观测任务的最早开始时间
    • OST:观察任务的最佳(理想)开始时间
    • LET:观察任务的最晚结束时间
    • D:观察任务的持续时间
    • W:观察任务的时间权重(如果安排观察,则到最佳开始时间的距离的权重)
    • P:不执行观察任务的惩罚

    执行如下:

    
     ! ----------------------------------------------------------------------------
     ! Minimization problem - 21 variables, 41 constraints
     ! LogPeriod            = 1000000
     ! Initial process time : 0.00s (0.00s extraction + 0.00s propagation)
     !  . Log search space  : 83.4 (before), 83.4 (after)
     !  . Memory usage      : 476.1 kB (before), 476.1 kB (after)
     ! Using parallel search with 8 workers.
     ! ----------------------------------------------------------------------------
     !          Best Branches  Non-fixed    W       Branch decision
                            0         21                 -
     + New bound is 0
     ! Using iterative diving.
     ! Using temporal relaxation.
     *      92.86000       21  0.04s        1      (gap is 100.0%)
     *      7.209000      176  0.04s        1      (gap is 100.0%)
     *      7.208000      231  0.04s        1      (gap is 100.0%)
     *      5.831000      284  0.04s        1      (gap is 100.0%)
     *      2.114000      470  0.04s        1      (gap is 100.0%)
            2.114000      470          1    1   F        -
     + New bound is 2.113788 (gap is 0.01%)
     ! ----------------------------------------------------------------------------
     ! Search completed, 5 solutions found.
     ! Best objective         : 2.114000 (optimal - effective tol. is 0.0002114)
     ! Best bound             : 2.113788
     ! ----------------------------------------------------------------------------
     ! Number of branches     : 171602
     ! Number of fails        : 9172
     ! Total memory usage     : 4.3 MB (4.2 MB CP Optimizer + 0.0 MB Concert)
     ! Time spent in solve    : 0.06s (0.06s engine + 0.00s extraction)
     ! Search speed (br. / s) : 2860024.7
     ! ----------------------------------------------------------------------------
    Task 0 scheduled on [205,214)
    Task 1 scheduled on [195,202)
    Task 2 scheduled on [134,139)
    Task 3 not scheduled
    Task 4 scheduled on [252,261)
    Task 5 scheduled on [153,162)
    Task 6 scheduled on [106,110)
    Task 7 scheduled on [44,46)
    Task 8 scheduled on [167,170)
    Task 9 not scheduled
    Task 10 scheduled on [85,94)
    Task 11 scheduled on [266,274)
    Task 12 scheduled on [121,124)
    Task 13 not scheduled
    Task 14 scheduled on [110,117)
    Task 15 scheduled on [310,312)
    Task 16 scheduled on [229,232)
    Task 17 scheduled on [262,266)
    Task 18 scheduled on [286,290)
    Task 19 scheduled on [162,164)
    
    

    【讨论】:

    • 以前没有使用过 CP Optimizer,但这看起来真的很有趣。我会检查一下。非常感谢。
    • 刚刚看了看。它似乎很合适,但它只对学生和学者免费,否则价格昂贵:(
    猜你喜欢
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2011-01-22
    • 2012-08-17
    • 1970-01-01
    • 2017-04-09
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多