0
点赞
收藏
分享

微信扫一扫

python动态规划最长公共子序列加工顺序

最长公共子序列

设Zk是序列Xm和Yn的最长公共子序列

(1)若zk=xm=yn,则Zk+1是Xm-1和Yn-1的最长公共子序列

(2)若xm≠ynxm≠zk,则Zk是Xm-1和Yn的最长公共子序列

(3)若xm≠ynyn≠zk,则Zk是Xm和Yn-1的最长公共子序列

反证即得

def LCS(A,B):
    n=len(A)
    m=len(B)
    A.insert(0,'0')
    B.insert(0,'0')
    #二维表c存放公共子序列的长度
    c=[([0]*(m+1)) for i in range(n+1)]
    #遍历m×n数组
    for i in range(0,n+1):
        for j in range(0,m+1):
            if (i==0 or j==0):
                c[i][j]=0
            elif A[i]==B[j]:
                c[i][j]=c[i-1][j-1]+1
    #max(c[i][j-1],c[i-1][j])
            elif c[i-1][j]>=c[i][j-1]:
                c[i][j]=c[i-1][j]
            else:
                c[i][j]=c[i][j-1]
    return c

加工顺序

如果加工工件i和j满足min(t1j,t2i)≥min(t1i,t2j)不等式,称加工工件i和j满足Bellman's Rule,若任意相邻两个工件均满足,则是最优序列。

(1)在第一台机器M1上的加工视觉越短的工件越先加工

(2)满足在M1上的加工时间小于在第二台机器M2上的加工时间的工件先加工

(3)在M2上的加工时间越短的工件越后加工

因此,满足Bellman's Rule的最优加工顺序的算法步骤设计如下:

(1)令N1={i|t1i<t2i},N2={i|t1i≥t2i}

(2)将N1中工件按t1i增序排序,将N2中的工件按t2i降序排列

(3)N1+N2

class workpiece:
    def __init__(self,key,id,N1):
        #最短时间
        self.key=key
        #编号
        self.id=id
        #是否在N1
        self.N1=N1
    #重载小于和等于操作
    def __xiaoyu__(self,other):
        return self.key<other.key
    def __dengyu__(self,other):
        return self.key==other.key

def best(n,a,b):
    #记录n个工件workpiece a,b分别为在两台机器上的加工时间
    job=[]
    x=[0 for i in range(n)]#记录最优加工顺序
    for i in range(n):
        if a[i]>b[i]:
            key=b[i]
        else:
            key=a[i]
        N1=a[i]<b[i]
        job.append(workpiece(key,i,N1))
    job.sort()
    j=0
    k=n-1
    for i in range(n):
        if job[1].N1:
            x[j]=job[i].id
            j+=1
        else:
            x[k]=job[i].id
            k-=1
    j=a[x[0]]
    k=j+b[x[0]]
    #计算总时间
    for i in range(1,n):
        j+=a[x[i]]
        if(j<k):
            k=b[x[i]]+k
        else:
            k=j+b[x[i]]
    return x,k
举报

相关推荐

0 条评论