86 lines
3.4 KiB
Python
86 lines
3.4 KiB
Python
import random
|
|
|
|
import matplotlib.pyplot as plt
|
|
import numpy as np
|
|
|
|
from Decode import Decode
|
|
from Encode import Encode
|
|
from GA import GA
|
|
from Instance import *
|
|
|
|
|
|
# 绘制甘特图
|
|
def Gantt(Machines):
|
|
M = ['red', 'blue', 'yellow', 'orange', 'green', 'palegoldenrod', 'purple', 'pink', 'Thistle', 'Magenta',
|
|
'SlateBlue', 'RoyalBlue', 'Cyan', 'Aqua', 'floralwhite', 'ghostwhite', 'goldenrod', 'mediumslateblue',
|
|
'navajowhite', 'navy', 'sandybrown', 'moccasin']
|
|
for i in range(len(Machines)):
|
|
Machine = Machines[i]
|
|
Start_time = Machine.O_start
|
|
End_time = Machine.O_end
|
|
for i_1 in range(len(End_time)):
|
|
plt.barh(i, width=End_time[i_1] - Start_time[i_1], height=0.8, left=Start_time[i_1],
|
|
color=M[Machine.assigned_task[i_1][0] - 1], edgecolor='black')
|
|
plt.text(x=Start_time[i_1] + (End_time[i_1] - Start_time[i_1]) / 2 - 0.5, y=i,
|
|
s=Machine.assigned_task[i_1][0])
|
|
plt.yticks(np.arange(len(Machines) + 1), np.arange(1, len(Machines) + 2))
|
|
plt.title('Scheduling Gantt chart')
|
|
plt.ylabel('Machines')
|
|
plt.xlabel('Time(min)')
|
|
plt.savefig('优化后排程方案的甘特图.png')
|
|
plt.show()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
Optimal_fit = 9999 # 最佳适应度(初始化)
|
|
Optimal_CHS = 0 # 最佳适应度对应的基因个体(初始化)
|
|
g = GA()
|
|
e = Encode(Processing_time, g.Pop_size, J, J_num, M_num)
|
|
CHS1 = e.Global_initial()
|
|
CHS2 = e.Random_initial()
|
|
CHS3 = e.Local_initial()
|
|
C = np.vstack((CHS1, CHS2, CHS3))
|
|
Best_fit = [] # 记录适应度在迭代过程中的变化,便于绘图
|
|
for i in range(g.Max_Itertions):
|
|
print("iter_{} start!".format(i))
|
|
Fit = g.fitness(C, J, Processing_time, M_num, O_num)
|
|
Best = C[Fit.index(min(Fit))]
|
|
best_fitness = min(Fit)
|
|
if best_fitness < Optimal_fit:
|
|
Optimal_fit = best_fitness
|
|
Optimal_CHS = Best
|
|
Best_fit.append(Optimal_fit)
|
|
print('best_fitness', best_fitness)
|
|
d = Decode(J, Processing_time, M_num)
|
|
Fit.append(d.decode(Optimal_CHS, O_num))
|
|
Gantt(d.Machines)
|
|
else:
|
|
Best_fit.append(Optimal_fit)
|
|
for j in range(len(C)):
|
|
Cafter = []
|
|
if random.random() < g.Pc:
|
|
N_i = random.choice(np.arange(len(C)))
|
|
if random.random() < g.Pv:
|
|
Cross = g.machine_cross(C[j], C[N_i], O_num)
|
|
else:
|
|
Cross = g.operation_cross(C[j], C[N_i], O_num, J_num)
|
|
Cafter.append(Cross[0])
|
|
Cafter.append(Cross[1])
|
|
Cafter.append(C[j])
|
|
if random.random() < g.Pm:
|
|
if random.random() < g.Pw:
|
|
Variance = g.machine_variation(C[j], Processing_time, O_num, J)
|
|
else:
|
|
Variance = g.operation_variation(C[j], O_num, J_num, J, Processing_time, M_num)
|
|
Cafter.append(Variance)
|
|
if Cafter != []:
|
|
Fit = g.fitness(Cafter, J, Processing_time, M_num, O_num)
|
|
C[j] = Cafter[Fit.index(min(Fit))]
|
|
x = np.linspace(0, 50, g.Max_Itertions)
|
|
plt.plot(x, Best_fit, '-k')
|
|
plt.title('the maximum completion time of each iteration')
|
|
plt.ylabel('Cmax')
|
|
plt.xlabel('Test Num')
|
|
plt.savefig('最大完成时间的优化过程.png')
|
|
plt.show()
|