任务调度以最小化等待时间算法

时间:2016-10-22 20:28:41

标签: algorithm scheduled-tasks

我完全陷入了任务调度问题。

这是要求: 实现一种调度算法,该算法将作业添加到常规队列并以这样的方式推送它们,使得队列中所有作业的平均等待时间最小化。除非最小化平均等待时间,否则不会推动新工作。 假设您的程序在0秒开始工作。第i个作业的请求来自requestTimei,让我们假设需要jobProcessi秒来处理它。

def jobScheduling(requestTime, jobProcess, timeFromStart):

    requestTimeAndDuration={}
    for i in range(len(requestTime)):
        job=[]
        job.append(requestTime[i])
        job.append(jobProcess[i])
        requestTimeAndDuration[i]=job

    taskProcessed=[]
    previousEndTime=0
    while (requestTimeAndDuration):
        endTimes={}
        for k,v in requestTimeAndDuration.items():
            if(len(taskProcessed)==0):
                previousEndTime=0
            else:
                previousEndTime=taskProcessed[-1][1]
            #print previousEndTime
            if(v[0]<=previousEndTime):
                endTimes[k]= previousEndTime+v[1]
            else:
                endTimes[k]= v[0]+v[1]

        endTimesSorted = sorted(endTimes.items(), key=lambda endTimes: endTimes[1])
        nextJobId = endTimesSorted[0][0]
        nextJobEndTime = endTimesSorted[0][1]
        nextJob=[]
        nextJob.append(nextJobId)
        previousEndTime=0
        if(len(taskProcessed)>0):
            previousEndTime=taskProcessed[-1][1]
        nextJobStarTime = nextJobEndTime-jobProcess[nextJobId]
        nextJob.append(nextJobEndTime)
        nextJob.append(nextJobStarTime)
        taskProcessed.append(nextJob)
        del requestTimeAndDuration[nextJobId]
print taskProcessed

我的算法尝试按照结束时间对任务进行排序,结束时间是根据previousEndTime + currentJobProcess计算的 requestTime = [0,5,8,11],jobProcess = [9,4,2,1]

  • 迭代1:

    任务= [[0,9],[5,4],[8,2] [11,1]] PreviousEndTime = 0 //自从我们开始以来,没有先前的任务0 + 9 = 9,5 + 4 = 9,8 + 2 = 10,11 + 1 = 12 endTime = {0:9,1:9,2:11,3:12} //执行任务0并将其从任务中删除

  • 迭代2:

    任务= [[5,4],[8,2] [11,1]] PreviousEndTime = 9 9 + 4 = 13,9 + 2 = 11,11 + 1 = 12 endTime = {1:13,2:11,3:12} //删除任务2

  • 迭代3:

    任务= [[5,4],[11,1]] previousEndTime = 11 11 + 4 = 15,11 + 1 = 12 endTime = {1:13,3:12} //删除任务3

  • 迭代4:

    任务= [[5,4],[11,1]] previousEndTime = 12 12 + 4 = 15 endTime = {1:16} //删除任务1

打印的最终结果为[0,2,3,1]

我的问题是,我的算法适用于某些情况,但不适用于复杂情况。 requestTime:[4,6,8,8,15,16,17,21,22,25] jobProcess:[30,25,14,16,26,10,11,11,14,8]

答案是[9,5,6,7,2,8,3,1,4] 但我的算法产生[5,9,6,7,8,3,1,4,0​​]

那么有谁知道如何解决这个问题?我担心我的算法可能存在根本缺陷。

1 个答案:

答案 0 :(得分:1)

我没有看到一个非常简洁的解决方案,比如按时间排序,但是如果有这样的解决方案,你应该能够通过使用比较器对任务进行排序来得到相同的答案。如果这两项任务是唯一需要考虑的两项任务,那么应该先安排哪项任务。