Académique Documents
Professionnel Documents
Culture Documents
import numpy as np
import copy
Cross_Rate = 0.9
Mute_Rate = 0.1
Constraint Handling
def xnor(x): #利用矩陣內積,將 X 二進位轉十進位,並利用內插法將其約束在限制範圍內
return x.dot(2 ** np.arange(10)[::-1]) / 1023 + 3
def ynor(y):
dic[fitvalue[i]].append(individual)
return dic
Fitness Evaluation
def fitness(count,chromosomes): #將符合約束條件的 X,Y 帶入目標函數,計算 fitness value
a = []
b = []
c = []
M_PI = 3.141
a.append(xnor(chromosomes[j][:10]))
b.append(ynor(chromosomes[j][10:22]))
return c
Selection
def select (time ,chromosomes, fitdict): #利用平移將 fitness 值轉為正數後,用輪盤法選出適應度高的 chromosomes
shift = []
probability = []
probability.append(cumulate)
chosen = []
r = np.random.random()
if r <= probability[k]:
chosen.append(list(individual))
break
return [chosen[0]]
Initialization
def gen_random_chromo(): #產生隨機 100 個符合約束條件範圍內的 chromosomes
chromosomes = []
tmp = []
tmp.append(np.random.randint(2, size=22))
chromosomes.append(tmp[i])
tmp.clear()
break
return chromosomes
return parent
Crossover
def crossover(father,mother): #利用 list 切分進行單點交配
tmp = []
if np.random.rand()< Cross_Rate:
crosspoint = int(np.random.randint(1,20))
tmp.append(baby1)
tmp.append(baby2)
else:
tmp.append(father)
tmp.append(mother)
return tmp
Mutation
def mutation(child): #進行單點突變
for i in range(0, 2):
if np.random.rand()< Mute_Rate:
mutatepoint = int(np.random.randint(0,21))
if child[i][mutatepoint] == 1:
child[i][mutatepoint] = 0
else:
child[i][mutatepoint] = 1
return child
del chromosomes
return new_chrmosomes
child = mutation(crossover(father,mother))
renew_chromosomes(child)
while fitness(renew_chromosomes()) == 1:
break