非单位时间任务安排---Python

题目介绍在这里插入图片描述

MAX=1000
def takeSecond(elem):
    return elem[1]
def Arrange(n,work):
    #按照每个任务的截止时间升序排列
    work.sort(key=takeSecond)
    print("排序后:")
    for i in range(1,n+1):
        print(work[i])
    deadline=work[n][1]#最大截止时间
    #punished[i][j]为当截止时间为j时前i个任务的最小惩罚
    punish=[[MAX]*(deadline+1) for i in range(n+1)]
    #初始化只有一个任务时
    for j in range(deadline+1):#j表示整体的截止时间
        #若第一个任务的执行时间大于整体的截止时间则执行,最小惩罚置为0
        if work[1][0]<= j:
            punish[1][j] = 0
        #若第一个任务的执行时间小于整体的截止时间则执行,最小惩罚置为第一个任务的误时惩罚
        else:
            punish[1][j] = work[1][2]
    if punish[1][deadline]==0:
        count=1#count表示执行的文件个数,若第一个文件执行了则为1
    for i in range(2,n+1):
        for j  in range(deadline+1):
            #第i个任务不执行
            punish[i][j] = punish[i-1][j] + work[i][2]
            #time为第i个任务截止的最后时间
            time=min(j,work[i][1])
            #若第i个任务可执行,且执行比不执行的最小惩罚小
            if(time >= work[i][0] and punish[i][j]>punish[i-1][time-work[i][0]]):
                punish[i][j] = punish[i-1][time-work[i][0]]
                #当截止时间为最大截止时间时,若第i个文件执行了则count加1
                if j==deadline:
                    count+=1
    print("任务安排表:")
    for i in range(1,n+1):
        print(punish[i])
    return punish[n][deadline],count

#从文件中读出数据
file_readpath = 'input.txt'
with open(file_readpath) as file:
    txt = file.read()
txt=txt.split('\n')
n=eval(txt[0])
work=[[0,0,0]]
for t in txt[1:]:
    t=t.split()
    work.append([eval(t[0]),eval(t[1]),eval(t[2])])
punish,count=Arrange(n,work)
print("最小惩罚为",punish)
print("执行文件个数为",count)

#将结果存入文件output.txt
file_writepath = 'output.txt'
file=open(file_writepath,"w")
file.write(str(punish)+'\n'+str(count))
file.close()

在这里插入图片描述运行结果:
在这里插入图片描述

发布了28 篇原创文章 · 获赞 4 · 访问量 2478

猜你喜欢

转载自blog.csdn.net/weixin_45050042/article/details/103102182