2015-02-10 2 views
0

Я пытаюсь построить простой генетический алгоритм, который будет оптимизирован для входной строки, но у меня возникают проблемы с построением матрицы [индивидуального x генома] (строка n является индивидуальной n genome.) Я хочу иметь возможность изменять размер популяции, скорость мутации и другие параметры, чтобы изучить, как это влияет на скорость конвергенции и эффективность программы.Матрица с переменным размером [ixj] (Python, Numpy)

Это то, что я до сих пор:

import random 
import itertools 
import numpy as np 
def evolve(): 


goal    = 'Hello, World!'       #string to optimize towards 
ideal = list(goal) 

#converting the string into a list of integers 
for i in range (0,len(ideal)): 
    ideal [i]  = ord(ideal[i]) 


print(ideal) 
popSize    = 10          #population size 
genome    = len(ideal)        #determineing the length of the genome to be the length of the target string 
mut     = 0.03          #mutation rate 
S     = 4           #tournament size 
best    = float("inf")        #initial best is very large 
maxVal    = max(ideal) 
minVal    = min(ideal) 
print (maxVal) 
i     = 0           #counting variables assigned to solve UnboundLocalError 
j     = 0 

print(maxVal, minVal) 


#constructing initial population array (individual x genome) 
pop = np.empty([popSize, len(ideal)]) 
for i, j in itertools.product(range(i), range(j)): 
    pop[i, j] = [i, random.randint(minVal,maxVal)] 
print(pop) 

Это создает матрицу размера популяции с правильной длиной генома, но геном что-то вроде:

[ 6.91364167e-310 6.91364167e-310 1.80613009e-316 1.80613009e-316 
5.07224590e-317 0.00000000e+000 6.04100487e+151 3.13149876e-120 
1.11787892e+253 1.47872844e-028 7.34486815e+223 1.26594941e-118 
7.63858409e+228] 

мне нужно чтобы быть случайными целыми числами, соответствующими случайным символам ASCII.

Что я делаю неправильно с помощью этого метода? Есть ли способ сделать это быстрее?

Я нашел мой текущий метод здесь: building an nxn matrix in python numpy, for any n

Я нашел еще один метод, который я не понимаю, но, кажется, быстрее и булькать, если я могу использовать его здесь, я хотел бы. Initialise numpy array of unknown length

Благодарим за любую помощь, которую вы можете предоставить.

ответ

1

Ваш цикл не выполняется, так как i и j равны 0, поэтому диапазон (i) и диапазон (j) пусты. Также вы не можете назначить список [i,random] значению массива (np.empty по умолчанию - np.float64). Я просто изменил его хранить только случайное число, но если вы действительно хотите сохранить список, вы можете изменить создание поп-музыки, чтобы быть pop = np.empty([popSize, len(ideal)],dtype=list)

В противном случае используйте это последние строки:

for i, j in itertools.product(range(popSize), range(len(ideal))): 
    pop[i, j] = random.randint(minVal,maxVal) 
+0

Или используйте np.random.randint – tillsten

+0

Спасибо, Этан. Это была проблема. Я бы поднял голову, если бы у меня было достаточно репутации. Полагаю, я должен был заметить проблему, когда он дал мне UnboundLocalError. Я решил сохранить его в списке, потому что я больше знаком с ними и думаю, что будет легче, когда я доберусь до стадии кроссовера генов. – MatthewC

+0

'np.random.randint (0,10, (10,10))' генерирует массив 10x10 случайных целых чисел – hpaulj

Смежные вопросы