Python读取柔性作业车间调度基准实例mk系列

Brandimarte给出了10组柔性作业车间调度实例(mk01~mk10),编写代码时,往往需要将基准实例转换成计算机所能识别的数据结构,本文提供一种基于Python的实现方法。

基准实例往往如下图所示,需要注意的是,必须严格按照行号进行修整,多一个空行,多一个空格数据的读取都可能出错!!
(以下图mk01举例,有效数据仅有11行,如果有12行,则读取失败)
图1 mk01基准测试算例

数据设置说明

(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]]
]

以上便完成了车间调度基准测试算例的读取工作

  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值