Brandimarte给出了10组柔性作业车间调度实例(mk01~mk10),编写代码时,往往需要将基准实例转换成计算机所能识别的数据结构,本文提供一种基于Python的实现方法。
基准实例往往如下图所示,需要注意的是,必须严格按照行号进行修整,多一个空行,多一个空格数据的读取都可能出错!!
(以下图mk01举例,有效数据仅有11行,如果有12行,则读取失败)
数据设置说明
(1)每一组数据的第一行至少包含2个数字:第一个数字表示工件数,第二个数字表示机器数(第三个不是必须的,表示每一道工序平均可选择的加工机器数);
(2)第二行表示某一个工件:第一个数字
α
1
{{\alpha }_{1}}
α1表示此工件的总工序数,第二个数字
α
2
{{\alpha }_{2}}
α2表示加工第一道工序的可选机器数,接着会有可选机器数的个数的一组数据(机器号、加工时间);然后是第二道工序的可选机器数,以此类推。
以mk01举例:
第一行:10个工件,6台可选机器,每道工序平均有2台机器可选择。
第二行:
α
1
{{\alpha }_{1}}
α1:第一个工件有6道工序;
α
2
{{\alpha }_{2}}
α2:第一道工序有2台加工机器可选,在第1(
α
3
{{\alpha }_{3}}
α3)台机器上的加工时间是5,在第3(
α
4
{{\alpha }_{4}}
α4)台机器上的加工时间是4;以此类推,
α
5
{{\alpha }_{5}}
α5:第一道工序有3台加工机器可选……
实现代码
class Decode:
def __init__(self, inputFile: str, outputFile: str):
self.__MAC_INFO = []
self.__PRO_INTO = []
self.__proNum = []
self.__lines = None
self.__input = inputFile
self.__output = outputFile
self.__listType = {"MAC_INFO": "w", "PRO_INTO": "a"}
def getMatrix(self):
self.__readExample()
self.__initMatrix()
for i in range(len(self.__lines)):
lo = 0
hi = 0
for j in range(self.__proNum[i]):
head = int(self.__lines[i][lo])
hi = lo + 2 * head + 1
lo += 1
while lo < hi:
self.__MAC_INFO[i][j].append(int(self.__lines[i][lo]))
self.__PRO_INTO[i][j].append(int(self.__lines[i][lo + 1]))
lo += 2
self.__print("MAC_INFO")
self.__print("PRO_INTO")
def __print(self, writePattern):
with open(self.__output, self.__listType[writePattern]) as file_object:
file_object.write(writePattern + " = [\n")
if writePattern == "MAC_INFO":
for i in self.__MAC_INFO:
file_object.write(str(i) + "\n")
elif writePattern == "PRO_INTO":
for i in self.__PRO_INTO:
file_object.write(str(i) + "\n")
file_object.write("]\n")
file_object.write("\n")
def __initMatrix(self):
for i in range(len(self.__proNum)):
self.__MAC_INFO.append([])
self.__PRO_INTO.append([])
for j in range(self.__proNum[i]):
self.__MAC_INFO[i].append([])
self.__PRO_INTO[i].append([])
def __readExample(self):
with open(self.__input) as fileObject:
self.__lines = fileObject.readlines()
# 数据调整
del self.__lines[0]
for i in range(len(self.__lines)):
self.__lines[i] = self.__lines[i].lstrip().rstrip().split(" ")
self.__proNum.append(int(self.__lines[i].pop(0)))
while "" in self.__lines[i]:
self.__lines[i].remove("")
if __name__ == "__main__":
rslt = Decode('Mk01.fjs', ".//输出//mk01.txt")
rslt.getMatrix()
输出结果
MAC_INFO = [
[[1, 3], [5, 3, 2], [3, 6], [6, 2, 1], [3], [6, 3, 4]]
[[2], [3], [1], [2, 4], [6, 2, 1]]
[[2], [3, 6], [6, 2, 1], [3, 2, 6], [1, 5]]
[[6, 2, 1], [2], [3], [5, 3, 2], [3, 6]]
[[5, 3, 2], [6, 2, 1], [2], [1, 3], [2, 4], [3, 2, 6]]
[[3, 6], [1], [3, 2, 6], [2], [6, 2, 1], [1, 4]]
[[6], [1, 4], [3, 2, 6], [2, 5, 1], [3]]
[[3, 6], [3, 2, 6], [6, 2, 1], [2], [2, 4]]
[[6], [1, 5], [6, 3, 4], [1], [3, 2, 6], [2, 4]]
[[3, 6], [3, 2, 6], [5, 3, 2], [6], [2, 4], [1, 4]]
]
PRO_INTO = [
[[5, 4], [3, 5, 1], [4, 2], [5, 6, 1], [1], [6, 6, 3]]
[[6], [1], [2], [6, 6], [5, 6, 1]]
[[6], [4, 2], [5, 6, 1], [4, 6, 6], [1, 5]]
[[5, 6, 1], [6], [1], [3, 5, 1], [4, 2]]
[[3, 5, 1], [5, 6, 1], [6], [5, 4], [6, 6], [4, 6, 6]]
[[4, 2], [2], [4, 6, 6], [6], [5, 6, 1], [3, 2]]
[[1], [3, 2], [4, 6, 6], [6, 1, 6], [1]]
[[4, 2], [4, 6, 6], [5, 6, 1], [6], [6, 6]]
[[1], [1, 5], [6, 6, 3], [2], [4, 6, 6], [6, 6]]
[[4, 2], [4, 6, 6], [3, 5, 1], [1], [6, 6], [3, 2]]
]
以上便完成了车间调度基准测试算例的读取工作