计划优化

时间:2019-04-26 15:10:35

标签: optimization julia julia-jump

我正在尝试解决有关调度的线性编程问题。每个任务都有开始时间r,解决任务的时间p和权重w。我必须最小化以下功能(C是任务的结束时间):

function to minimize

下面提供的数据结果(C数组)为:

-----结果-----

12.0 - C[1]  
15.0 - C[2]   
16.0 - C[3]   
29.0 - C[4] 

当我们一个接一个地执行任务时,这是正确的。如何检查所有可能的排列并选择最佳排列?就我而言,应该先执行最后一个任务。

 function findTimetable(timeForTask :: Array{Int}, weightForTask :: Array{Int}, momentForTask:: Array{Int} )
        model :: Model = Model(with_optimizer(GLPK.Optimizer))
        _size = size(timeForTask)[1]
        @variable(model, C[1: _size] >= 0, Int)

        @objective(model, Min, sum(weightForTask[i] * C[i] for i = 1 : _size))

        for i = 1 : _size
             @constraint(model, C[i] >= momentForTask[i] + timeForTask[i])
        end
        for i = 1 : _size - 1
            @constraint(model, C[i+1] >= C[i]  + timeForTask[i+1] )
        end

        println(model)
        optimize!(model)
        println(primal_status(model))
        println(objective_value(model))
        println("-----RESULT-----")
        for i in 1:_size
            println(value(C[i]))
        end
    end


  timeForTask = [2, 3, 1, 13] #p
  weightForTask  = [1, 1, 10, 2000] #w
  momentForTask  = [10, 9, 8, 1] #r

  findTimetable(timeForTask, weightForTask, momentForTask)

谢谢。

1 个答案:

答案 0 :(得分:0)

一种标准技术是引入一个二进制矩阵y_ij,如果y_ij = 1,则任务i优先于任务j。然后您可以添加限制

y_ij+y_ji = 1              for all i,j
C_j >= C_i+p_j-M(1-y_ij)   for all i,j

其中M是足够大的常数(例如,对于发布日期r_i和处理时间p_i,M = max_i r_i + sum_i p_i)。