Ejemplo n.º 1
0
class IterativeImprovement:
    def __init__(self):
        self.test_data_path = './PFSP_benchmark_data_set/tai50_20_1.txt'
        self.tool = Tool()
        self.max_span_time = 10000
        self.span = self.tool.io(self.test_data_path)  # 測資
        self.job_len = len(self.span[0])
        self.eval_time = 20

    def generateNeighborList(self, jobs_seq):
        ret = []

        ret.append(jobs_seq)

        for i in range(len(jobs_seq)):
            for j in range(i, len(jobs_seq)):
                if (i != j):
                    tmp_seq = copy.deepcopy(jobs_seq)
                    tmp_seq[i], tmp_seq[j] = tmp_seq[j], tmp_seq[i]
                    ret.append(tmp_seq)

        return ret

    def run(self, jobs_seq):
        min_span = self.tool.makespan(self.span, jobs_seq)  # 起始min值
        span_list = []
        count = 0
        while (count < self.max_span_time):

            nb_list = self.generateNeighborList(jobs_seq)

            for i in range(len(nb_list)):
                span = self.tool.makespan(self.span, nb_list[i])
                count += 1
                if (span < min_span):
                    min_span = span
                    jobs_seq = nb_list[i]

            if (jobs_seq == nb_list[0]):
                return min_span

            span_list.append(min_span)

        return min_span

    def average(self, lst):
        return sum(lst) / len(lst)

    def search(self):

        pool = mp.Pool(mp.cpu_count())

        random.seed(0)
        init_list = []
        for i in range(self.eval_time):
            jobs_seq = [int(e) for e in range(0, self.job_len)]
            random.shuffle(jobs_seq)
            init_list.append(jobs_seq)

        pool_out = pool.map_async(self.run, init_list)

        pool.close()
        pool.join()

        result_list = pool_out.get()

        print(result_list)
        print('min', min(result_list))
        print('max', max(result_list))
        print('avg', self.average(result_list))