algorithm - 任务调度最小等待时间算法

标签 algorithm scheduled-tasks

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

要求如下: 实现一种调度算法,将作业添加到常规队列并以最小化队列中所有作业的平均等待时间的方式推送它们。除非最小化平均等待时间,否则不会推进新工作。 假设您的程序在 0 秒开始工作。在 requestTimei 收到第 i 个作业的请求,我们假设处理它需要 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]] 上一个结束时间=9 9+4=13, 9+2=11, 11+1=12 endTime = {1:13,2:11,3:12}//移除任务2

  • 迭代 3:

    任务 = [[5,4],[11,1]] 上一个结束时间=11 11+4=15, 11+1=12 endTime = {1:13,3:12}//移除任务3

  • 迭代 4:

    任务 = [[5,4],[11,1]] 上一个结束时间=12 12+4=15 endTime = {1:16}//移除任务1

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

我的问题是,我的算法适用于某些情况,但不适用于复杂的情况。 请求时间:[4、6、8、8、15、16、17、21、22、25] 工作进程:[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]

那么有谁知道这道题怎么做呢?恐怕我的算法可能存在根本性缺陷。

最佳答案

我没有看到像按结束时间排序这样的真正巧妙的解决方案,但如果有这样的解决方案,您应该能够通过使用作为比较器的函数对任务进行排序来获得相同的答案,该函数计算出哪个任务如果只有这些是要考虑的两项任务,则应首先安​​排。

关于algorithm - 任务调度最小等待时间算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40196739/

相关文章:

algorithm - 如何计算给定方向的最小平移向量?

algorithm - 在具有任意基数的数字系统之间转换

java - 如何使用 Java Timer 和 TimerTask 安排具有开始时间和结束时间的任务

google-app-engine - AppEngine 中任务队列的默认值是什么?

windows-8 - 如何通过任务计划程序在启动时运行 WinRT 应用程序?

java - Salesforce:调用方法并将联系人与 apex 测试方法的帐户相关联?

algorithm - 有没有一种有效的方法来确定叶节点是否可以从有向无环图中的另一个任意节点到达?

algorithm - 链接列表数据结构代码的反转需要视觉解释指导吗?

algorithm - 在大型稀疏矩阵中查找大型非稀疏子矩阵

Java/数据库项目自动化