知识点
排程问题的“冲突回避概念”建模 -- 累死CPLEX的模型1
排程问题的“图(论)概念”建模
排程问题的“排序概念”建模
排程问题的“P-算法”建模 -- 秒解模型
单机作业排程/极小化平均流程时间
单机作业排程是指将n个作业依次地在一台机器上完成,不同作业不能同时占用这台机器,且一旦机器被分配给该作业,则该机器必须完成该作业才能交付下一个作业使用。
假设作业i的作业时间为T[i], 且其开始作业时间为 t[i] 则其流程时间(即完成时间)为 t[i]+T[i]。极小化平均流程时间,即目标为:
min sum{i=1,...,n}(T[i]+t[i])/n
数据:假设有10个作业,其作业时间分别为 13 15 21 9 10 12 5 14 11 20
模型1——“冲突回避”模型
考虑任务i,j且i<>j(即i不等于j), 则有两种情况:或者i作业先于j作业加工 或者 反之。如果是前者,则
t[j] >= t[i] + T[i]
如果是后者,则
t[i] >= t[j] +T[j]
两个约束显然是互斥的,不能同时成立。因此必须用或关系将他们加入模型。加入或关系的方法是引进0-1变量u[i][j],如果u[i][j]=1前一个约束成立,否则如果u[i][j]=0后一个约束成立。此时配合一个足够大的数bigM,则可把上面两个或约束表示成:
t[j]-t[i] >= T[i] - (1 - u[i][j])bigM //(1)
t[i]-t[j] >= T[j] - u[i][j]bigM // (2)
完整模型:
min sum{i=1,...,n}(T[i]+t[i]) subject to t[j]-t[i] >= T[i] - (1 - u[i][j])bigM | i=1,...,n; j=1,...,n; i<>j //(1) t[i]-t[j] >= T[j] - u[i][j]bigM | i=1,...,n; j=1,...,n; i<>j //(2) where n is an integer bigM is a number T is a set t[i] is a variable of nonnegative number | i=1,...,n u[i][j] is a variable of binary | i=1,...,n; j=1,...,n; i<>j data_relation n=_$(T) bigM =sum{i=1,...,n}T[i] data T={13 15 21 9 10 12 5 14 11 20}
模型2——“图(论)概念”模型
把作业看成是图的节点,作业之间的直接衔接关系看成是边。则单机作业问题 可以看成是一个特殊的树,即成一条直线的树。
首先根据图论中给出的树的性质:树的边数是节点数减一。以0-1变量e[i][j]表示边,于是有约束:
sum{i=1,...,n;j=1,...,n;i<>j} e[i][j] = n-1 // (3)
其次,每个节点的入次和出次小于等于1:
sum{i=1,...,n;i<>j} e[i][j] <=1 | j=1,...,n // (4)
sum{j=1,...,n;i<>j} e[i][j] <=1 | i=1,...,n // (5)
满足(3)-(5)之后并不能保证作业成直线布排,因为环同样会符合约束(3)-(5)。为了防止环的出现,使用时间箭头约束(时间是不能周而复始的!):
t[j]>=t[i]+T[i] - bigM*(1-e[i][j]) | i=1,...,n;j=1,...,n;i<>j //(6)
即如果作业i和j衔接,则e[i][j]=1,上述约束变成t[j]>=t[i]+T[i],符合时间箭头逻辑。否则i,j之间并不直接衔接,上式右端的 - bigM*(1-e[i][j]) 等于-bigM,约束式恒成立,等于不存在。
完整模型为:
min (sum{i=1,...,n}(t[i]+T[i])) subject to sum{i=1,...,n;j=1,...,n;i<>j}e[i][j]=n-1 //(3) sum{i=1,...,n;i<>j}e[i][j]<=1|j=1,...,n //(4) sum{j=1,...,n;i<>j}e[i][j]<=1|i=1,...,n //(5) t[j]>=t[i]+T[i] - bigM*(1-e[i][j])|i=1,...,n;j=1,...,n;i<>j //(6) where n is an integer bigM is a number T is a set e[i][j] is a variable of binary|i=1,...,n;j=1,...,n;i<>j t[i] is a variable of nonnegative number|i=1,...,n data_relation n=_$(T) bigM=sum{i=1,...,n}T[i] data T={13 15 21 9 10 12 5 14 11 20}
模型3— “排序概念”模型
所谓排程即排序,在之前的博文“使用 线性规划 解决 数字 排序问题, +Leapms模型“中提到过线性规划可以做数字排序,方法是定义排序对象的次序数变量。
首先为每个作业定义一个次序数变量nd[i],其下界是0,上界是1. 其次每个作业的开始加工时间显然必须小于所有作业的作业时间之和TT,于是有约束:
nd[i] <=n-1 | i=1,...,n // (7)
t[i] <= TT | i=1,...,n // (8)
次序数是一个先后的概念,必须与时间t[i]符合向前的时间箭头逻辑:
如果: nd[i] <= nd[j]+1 (即作业i在作业j之前)则 :t[i]+T[i] <= t[j] (即作业j的开始加工时间要大于作业i的开始加工时间加上作业i的作业时间)
写成命题逻辑式相当于:
nd[i] <= nd[j]+1 → t[i]+T[i] <= t[j]
从数理逻辑知道,上式相当于
nd[i ]<= nd[j]+1 or t[i]+T[i] <= t[j]
成为一个或关系逻辑。对或关系的处理方法是引入0-1变量u[i][j], 写成:
nd[i]>=nd[j]+1 - u[i][j]n | i=1,...,n;j=1,...,n;i<>j // (9)
t[i]+T[i]<=t[j]+(1-u[i][j])TT | i=1,...,n;j=1,...,n;i<>j // (10)
完整模型为:
min sum{i=1,...,n}(T[i]+t[i]) subject to nd[i]<=n-1|i=1,...,n // (7) t[i]<=TT|i=1,...,n // (8) nd[i]>=nd[j]+1 - u[i][j]n | i=1,...,n;j=1,...,n;i<>j // (9) t[i]+T[i]<=t[j]+(1-u[i][j])TT | i=1,...,n;j=1,...,n;i<>j // (10) where n is an integer TT is a number T is a set nd[i] is a variable of nonnegative number|i=1,...,n u[i][j] is a variable of binary|i=1,...,n;j=1,...,n;i<>j t[i] is a variable of nonnegative number|i=1,...,n data_relation n=_$(T) TT=sum{i=1,...,n}T[i] data T={13 15 21 9 10 12 5 14 11 20}
模型4——“P-算法”模型
单机作业排程/极小化平均流程时间 问题具有P算法,方法是优先加工作业时间较小的作业。此时用时间作业时间大小过滤箭头即可,即:
t[i]+T[i]<=t[j] | i=1,...,n;j=1,...,n;i<>j;T[i]<T[j] //(11)
t[i]+T[i]<=t[j] | i=1,...,n;j=1,...,n;i<j;T[i]==T[j] //(12)
完整模型为:
min (sum{i=1,...,n}(t[i]+T[i])) subject to t[i]+T[i]<=t[j] | i=1,...,n;j=1,...,n;i<>j;T[i]<T[j] //(11) t[i]+T[i]<=t[j] | i=1,...,n;j=1,...,n;i<j;T[i]==T[j] //(12) where n is an integer TT is a number T is a set e[i][j] is a variable of binary|i=1,...,n;j=1,...,n;i<>j t[i] is a variable of nonnegative number|i=1,...,n data_relation n=_$(T) TT=sum{i=1,...,n}T[i] data T={13 15 21 9 10 12 5 14 11 20}
四种模型的试算比较
对四种模型在经过+Leapms解析后使用CPLEX12.6.3试算,第一个模型的计算时间在2-5分钟左右,最后一个模型无论是CPLEX还是+leapms的内置求解器都能在<0.01秒内完成求解。
预计当任务数大于20时,前3个模型CPLEX计算时间将在10分钟以上。
以下是+Leapms生成的第一个模型和第二个模型的.lp模型,可在CPLEX上试解。
================================== Problem SingleMachine1 .lp file gnerated by +Leapms ================================== Minimize Obj: t1+t2+t3+t4+t5+t6+t7+t8+t9+t10+130 Subject to C1: -t1+t2-130u1_2>=-117 C2: -t1+t3-130u1_3>=-117 C3: -t1+t4-130u1_4>=-117 C4: -t1+t5-130u1_5>=-117 C5: -t1+t6-130u1_6>=-117 C6: -t1+t7-130u1_7>=-117 C7: -t1+t8-130u1_8>=-117 C8: -t1+t9-130u1_9>=-117 C9: -t1+t10-130u1_10>=-117 C10: t1-t2-130u2_1>=-115 C11: -t2+t3-130u2_3>=-115 C12: -t2+t4-130u2_4>=-115 C13: -t2+t5-130u2_5>=-115 C14: -t2+t6-130u2_6>=-115 C15: -t2+t7-130u2_7>=-115 C16: -t2+t8-130u2_8>=-115 C17: -t2+t9-130u2_9>=-115 C18: -t2+t10-130u2_10>=-115 C19: t1-t3-130u3_1>=-109 C20: t2-t3-130u3_2>=-109 C21: -t3+t4-130u3_4>=-109 C22: -t3+t5-130u3_5>=-109 C23: -t3+t6-130u3_6>=-109 C24: -t3+t7-130u3_7>=-109 C25: -t3+t8-130u3_8>=-109 C26: -t3+t9-130u3_9>=-109 C27: -t3+t10-130u3_10>=-109 C28: t1-t4-130u4_1>=-121 C29: t2-t4-130u4_2>=-121 C30: t3-t4-130u4_3>=-121 C31: -t4+t5-130u4_5>=-121 C32: -t4+t6-130u4_6>=-121 C33: -t4+t7-130u4_7>=-121 C34: -t4+t8-130u4_8>=-121 C35: -t4+t9-130u4_9>=-121 C36: -t4+t10-130u4_10>=-121 C37: t1-t5-130u5_1>=-120 C38: t2-t5-130u5_2>=-120 C39: t3-t5-130u5_3>=-120 C40: t4-t5-130u5_4>=-120 C41: -t5+t6-130u5_6>=-120 C42: -t5+t7-130u5_7>=-120 C43: -t5+t8-130u5_8>=-120 C44: -t5+t9-130u5_9>=-120 C45: -t5+t10-130u5_10>=-120 C46: t1-t6-130u6_1>=-118 C47: t2-t6-130u6_2>=-118 C48: t3-t6-130u6_3>=-118 C49: t4-t6-130u6_4>=-118 C50: t5-t6-130u6_5>=-118 C51: -t6+t7-130u6_7>=-118 C52: -t6+t8-130u6_8>=-118 C53: -t6+t9-130u6_9>=-118 C54: -t6+t10-130u6_10>=-118 C55: t1-t7-130u7_1>=-125 C56: t2-t7-130u7_2>=-125 C57: t3-t7-130u7_3>=-125 C58: t4-t7-130u7_4>=-125 C59: t5-t7-130u7_5>=-125 C60: t6-t7-130u7_6>=-125 C61: -t7+t8-130u7_8>=-125 C62: -t7+t9-130u7_9>=-125 C63: -t7+t10-130u7_10>=-125 C64: t1-t8-130u8_1>=-116 C65: t2-t8-130u8_2>=-116 C66: t3-t8-130u8_3>=-116 C67: t4-t8-130u8_4>=-116 C68: t5-t8-130u8_5>=-116 C69: t6-t8-130u8_6>=-116 C70: t7-t8-130u8_7>=-116 C71: -t8+t9-130u8_9>=-116 C72: -t8+t10-130u8_10>=-116 C73: t1-t9-130u9_1>=-119 C74: t2-t9-130u9_2>=-119 C75: t3-t9-130u9_3>=-119 C76: t4-t9-130u9_4>=-119 C77: t5-t9-130u9_5>=-119 C78: t6-t9-130u9_6>=-119 C79: t7-t9-130u9_7>=-119 C80: t8-t9-130u9_8>=-119 C81: -t9+t10-130u9_10>=-119 C82: t1-t10-130u10_1>=-110 C83: t2-t10-130u10_2>=-110 C84: t3-t10-130u10_3>=-110 C85: t4-t10-130u10_4>=-110 C86: t5-t10-130u10_5>=-110 C87: t6-t10-130u10_6>=-110 C88: t7-t10-130u10_7>=-110 C89: t8-t10-130u10_8>=-110 C90: t9-t10-130u10_9>=-110 C91: t1-t2+130u1_2>=15 C92: t1-t3+130u1_3>=21 C93: t1-t4+130u1_4>=9 C94: t1-t5+130u1_5>=10 C95: t1-t6+130u1_6>=12 C96: t1-t7+130u1_7>=5 C97: t1-t8+130u1_8>=14 C98: t1-t9+130u1_9>=11 C99: t1-t10+130u1_10>=20 C100: -t1+t2+130u2_1>=13 C101: t2-t3+130u2_3>=21 C102: t2-t4+130u2_4>=9 C103: t2-t5+130u2_5>=10 C104: t2-t6+130u2_6>=12 C105: t2-t7+130u2_7>=5 C106: t2-t8+130u2_8>=14 C107: t2-t9+130u2_9>=11 C108: t2-t10+130u2_10>=20 C109: -t1+t3+130u3_1>=13 C110: -t2+t3+130u3_2>=15 C111: t3-t4+130u3_4>=9 C112: t3-t5+130u3_5>=10 C113: t3-t6+130u3_6>=12 C114: t3-t7+130u3_7>=5 C115: t3-t8+130u3_8>=14 C116: t3-t9+130u3_9>=11 C117: t3-t10+130u3_10>=20 C118: -t1+t4+130u4_1>=13 C119: -t2+t4+130u4_2>=15 C120: -t3+t4+130u4_3>=21 C121: t4-t5+130u4_5>=10 C122: t4-t6+130u4_6>=12 C123: t4-t7+130u4_7>=5 C124: t4-t8+130u4_8>=14 C125: t4-t9+130u4_9>=11 C126: t4-t10+130u4_10>=20 C127: -t1+t5+130u5_1>=13 C128: -t2+t5+130u5_2>=15 C129: -t3+t5+130u5_3>=21 C130: -t4+t5+130u5_4>=9 C131: t5-t6+130u5_6>=12 C132: t5-t7+130u5_7>=5 C133: t5-t8+130u5_8>=14 C134: t5-t9+130u5_9>=11 C135: t5-t10+130u5_10>=20 C136: -t1+t6+130u6_1>=13 C137: -t2+t6+130u6_2>=15 C138: -t3+t6+130u6_3>=21 C139: -t4+t6+130u6_4>=9 C140: -t5+t6+130u6_5>=10 C141: t6-t7+130u6_7>=5 C142: t6-t8+130u6_8>=14 C143: t6-t9+130u6_9>=11 C144: t6-t10+130u6_10>=20 C145: -t1+t7+130u7_1>=13 C146: -t2+t7+130u7_2>=15 C147: -t3+t7+130u7_3>=21 C148: -t4+t7+130u7_4>=9 C149: -t5+t7+130u7_5>=10 C150: -t6+t7+130u7_6>=12 C151: t7-t8+130u7_8>=14 C152: t7-t9+130u7_9>=11 C153: t7-t10+130u7_10>=20 C154: -t1+t8+130u8_1>=13 C155: -t2+t8+130u8_2>=15 C156: -t3+t8+130u8_3>=21 C157: -t4+t8+130u8_4>=9 C158: -t5+t8+130u8_5>=10 C159: -t6+t8+130u8_6>=12 C160: -t7+t8+130u8_7>=5 C161: t8-t9+130u8_9>=11 C162: t8-t10+130u8_10>=20 C163: -t1+t9+130u9_1>=13 C164: -t2+t9+130u9_2>=15 C165: -t3+t9+130u9_3>=21 C166: -t4+t9+130u9_4>=9 C167: -t5+t9+130u9_5>=10 C168: -t6+t9+130u9_6>=12 C169: -t7+t9+130u9_7>=5 C170: -t8+t9+130u9_8>=14 C171: t9-t10+130u9_10>=20 C172: -t1+t10+130u10_1>=13 C173: -t2+t10+130u10_2>=15 C174: -t3+t10+130u10_3>=21 C175: -t4+t10+130u10_4>=9 C176: -t5+t10+130u10_5>=10 C177: -t6+t10+130u10_6>=12 C178: -t7+t10+130u10_7>=5 C179: -t8+t10+130u10_8>=14 C180: -t9+t10+130u10_9>=11 Binaries u1_2 u1_3 u1_4 u1_5 u1_6 u1_7 u1_8 u1_9 u1_10 u2_1 u2_3 u2_4 u2_5 u2_6 u2_7 u2_8 u2_9 u2_10 u3_1 u3_2 u3_4 u3_5 u3_6 u3_7 u3_8 u3_9 u3_10 u4_1 u4_2 u4_3 u4_5 u4_6 u4_7 u4_8 u4_9 u4_10 u5_1 u5_2 u5_3 u5_4 u5_6 u5_7 u5_8 u5_9 u5_10 u6_1 u6_2 u6_3 u6_4 u6_5 u6_7 u6_8 u6_9 u6_10 u7_1 u7_2 u7_3 u7_4 u7_5 u7_6 u7_8 u7_9 u7_10 u8_1 u8_2 u8_3 u8_4 u8_5 u8_6 u8_7 u8_9 u8_10 u9_1 u9_2 u9_3 u9_4 u9_5 u9_6 u9_7 u9_8 u9_10 u10_1 u10_2 u10_3 u10_4 u10_5 u10_6 u10_7 u10_8 u10_9 End ==================================
================================== Problem singlemachine4 .lp file gnerated by +Leapms ================================== Minimize Obj: t1+t2+t3+t4+t5+t6+t7+t8+t9+t10+130 Subject to C1: t1-t2<=-13 C2: t1-t3<=-13 C3: t1-t8<=-13 C4: t1-t10<=-13 C5: t2-t3<=-15 C6: t2-t10<=-15 C7: -t1+t4<=-9 C8: -t2+t4<=-9 C9: -t3+t4<=-9 C10: t4-t5<=-9 C11: t4-t6<=-9 C12: t4-t8<=-9 C13: t4-t9<=-9 C14: t4-t10<=-9 C15: -t1+t5<=-10 C16: -t2+t5<=-10 C17: -t3+t5<=-10 C18: t5-t6<=-10 C19: t5-t8<=-10 C20: t5-t9<=-10 C21: t5-t10<=-10 C22: -t1+t6<=-12 C23: -t2+t6<=-12 C24: -t3+t6<=-12 C25: t6-t8<=-12 C26: t6-t10<=-12 C27: -t1+t7<=-5 C28: -t2+t7<=-5 C29: -t3+t7<=-5 C30: -t4+t7<=-5 C31: -t5+t7<=-5 C32: -t6+t7<=-5 C33: t7-t8<=-5 C34: t7-t9<=-5 C35: t7-t10<=-5 C36: -t2+t8<=-14 C37: -t3+t8<=-14 C38: t8-t10<=-14 C39: -t1+t9<=-11 C40: -t2+t9<=-11 C41: -t3+t9<=-11 C42: -t6+t9<=-11 C43: -t8+t9<=-11 C44: t9-t10<=-11 C45: -t3+t10<=-20 End ==================================
讨论
1、建立排程问题的线性规划模型可以有不同的方法,例如可以从冲突回避角度、图角度、排序角度、P-算法角度多种思路去考虑。所建立的模型的运行效率是不同的,甚至相差极大。
2、线性规划模型是一种问题的描述方法,目前的求解器基本上采用的是松弛—分支方法去求解,尽管加入了很多前处理,还没有能够做到根据模型本身所描述约束情况的推知问题的性质从而进行高效求解的地步。
3、有P算法的问题,当依据该算法发现的性质进行线性规划建模后,其求解效率会相应被提高。
By: 陆战之王 (2018-12-5)