遗传算法:编码√-解码(根据车间环境写)-判断(根据所选目标写)-选择√-交叉√-变异√
遗传算法解车间调度问题的边角程序基本如下,核心代码是解码,根据车间约束条件写。其中有一个适应度函数根据车间目标写。
编码
import random
def code(workpeice_number, process_number):
a = [i for i in range(workpeice_number)] * process_number
random.shuffle(a)
return a
轮盘赌选择
def roulette_selection(population):
new_pop = []
temp_fitness =[]
for i in population:
temp_fitness.append(get_fitness(i))
#
# 精英保留策略在此位置写比较好
#
max_fitness = max(temp_fitness)
min_fitness = min(temp_fitness)
for i in range(len(population)):
temp_fitness[i] /= max_fitness - min_fitness
temp = 0
while len(new_pop) != len(population):
if temp_fitness[temp] > random.random():
new_pop.append(population[temp])
temp += 1
if temp == len(population):
temp = 0
return new_pop
竞标赛选择
def tournament_selection(population, group_number):
new_pop = []
#
# 精英保留策略在此处写比较好, 下面可以优化:首先把所有的fitness全求出,下面一次求一批可能最终求fitness次数多于整体数量
#
for i in range(len(population)):
temp = []
temp_fitness = []
for j in range(group_number):
temp.append(random.choice(population))
temp_fitness.append(get_fitness(temp[j]))
new_pop.append(temp[temp_fitness.index(max(temp_fitness))])
return new_pop
POX交叉
def pox_crossover(code1, code2):
random_gens = random.choice(list(set(code1))) # 随机选中一个基因
code11, code12, code21, code22 = [], [], [], []
for i in range(len(code1)):
code11.append(code1[i] if code1[i] == random_gens else 666) # 得到两个部分
code12.append(888 if code1[i] == random_gens else code1[i])
code21.append(code2[i] if code2[i] == random_gens else 666)
code22.append(888 if code2[i] == random_gens else code2[i])
code22.reverse() # 将两条染色体合并
for i in range(len(code1)):
if code11[i] == 666:
a = code22.pop()
while a == 888:
a = code22.pop()
code11[i] = a
code12.reverse()
for i in range(len(code1)):
if code21[i] == 666:
a = code12.pop()
while a == 888:
a = code12.pop()
code21[i] = a
return code11, code21
cod1 = [1, 2, 3, 4, 4, 3, 2, 1, 1]
cod2 = [1, 1, 2, 3, 2, 3, 4, 4, 1]
print(pox_crossover(cod1, cod2))
单点交叉
def one_point_crossover(code1, code2):
a = random.randint(0, len(code1) - 1)
tem = code1[0:a]
code1[0:a] = code2[0:a]
code2[0:a] = tem
return code1, code2
随机变异
def random_mutation(codes):
a = random.randint(0, len(codes) - 1)
b = random.randint(0, len(codes) - 1)
temp = codes[a]
codes[a] = codes[b]
codes[b] = temp
return codes



