Vous êtes sur la page 1sur 3

# bug 目前子代產生仍有 error 待修正

import numpy as np

import collections as col

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):

return (y.dot(2 ** np.arange(12)[::-1])) * 4 / 4095 – 2 #利用矩陣內積,將 Y 二進位轉十進位,並利用內插法將其約束在限制範圍內

def dictstor(chromosomes, fitvalue): #創建字典來儲存對應 chromosomes 和其 fitness value


dic = col.defaultdict(list)

for (i, individual) in enumerate(chromosomes):

dic[fitvalue[i]].append(individual)

return dic

Fitness Evaluation
def fitness(count,chromosomes): #將符合約束條件的 X,Y 帶入目標函數,計算 fitness value
a = []

b = []

c = []

M_PI = 3.141

for j in range(0, count):

a.append(xnor(chromosomes[j][:10]))

b.append(ynor(chromosomes[j][10:22]))

k = pow(np.sin(5 * M_PI * (pow(a[j], 3 / 4) - 0.1)), 6) - pow(b[j] - 1, 4)


c.append(k)

return c

Selection
def select (time ,chromosomes, fitdict): #利用平移將 fitness 值轉為正數後,用輪盤法選出適應度高的 chromosomes
shift = []

for key in fitdict:


shift.append(key+500)

relative_fitness = [f/float(sum(shift)) for f in shift]


cumulate = 0

probability = []

for i in range(0, time):


cumulate += relative_fitness[i]

probability.append(cumulate)

chosen = []

r = np.random.random()

for (k, individual) in enumerate(chromosomes):

if r <= probability[k]:

chosen.append(list(individual))

break

return [chosen[0]]

Initialization
def gen_random_chromo(): #產生隨機 100 個符合約束條件範圍內的 chromosomes
chromosomes = []

tmp = []

while len(chromosomes) < 100:

tmp.append(np.random.randint(2, size=22))

for (i, individual) in enumerate(tmp):

if xnor(tmp[i][:10]) + ynor(tmp[i][10:22]) <= 2:

chromosomes.append(tmp[i])

tmp.clear()

break

return chromosomes

def gen_parent(dic, chromosomes): #產生適應度高的父代


parent = select(100,chromosomes,dic)

return parent

Crossover
def crossover(father,mother): #利用 list 切分進行單點交配
tmp = []
if np.random.rand()< Cross_Rate:

crosspoint = int(np.random.randint(1,20))

baby1 = (father[0][:crosspoint] + mother[0][crosspoint:])

baby2 = (mother[0][:crosspoint] + father[0][crosspoint:])

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

def renew_chromosomes(chromosomes): #產生新的子代後取代掉原來的父代


new_chrmosomes = copy.deepcopy(chromosomes)

del chromosomes

return new_chrmosomes

chromosomes = gen_random_chromo() #產生 100 組符合約束區間內的 chromosomes

for i in range (0,1000): #產生 1000 個 generation,如果其中子代 fitness 值等於 1 及跳出迴圈


for j in range (0, 50):

father = gen_parent(dictstor(chromosomes, fitness(100,chromosomes)), chromosomes)

mother = gen_parent(dictstor(chromosomes, fitness(100,chromosomes)), chromosomes)

child = mutation(crossover(father,mother))

renew_chromosomes(child)

while fitness(renew_chromosomes()) == 1:

break

Vous aimerez peut-être aussi