Я новичок в питоне. Я пытаюсь реализовать генетический алгоритм, который я ранее реализовал в MatLab. Мне нужно создать несколько хромосом (особей) для моей начальной популяции. В MatLab я делал это с помощью функции rand
, и она давала мне множество уникальных (или, по крайней мере, достаточно разных) начальных популяций. Но здесь, в питоне, я пробовал разные методы random
, но среди 50 человек у меня только от 3 до 4 уникальных хромосом. Вот мой код Python в __main__.py
:
for i in range(pop_size):
popSpace.append(Chromosom(G=mG,M=mM))
sum_Q+=popSpace[i].Q
И мой Chromosom
класс:
class Chromosom:
def __init__(self,G,M):
self.Q = 0
self.V = []
self.Chr = [0]*len(self.M)
self.M= M
self.G= G
self.randomChromosom()
self.updateQ_Qs()
def randomChromosom(self):
for m in range(len(self.M)):
if (random.random()< 0.5):
self.Chr[m] = 1
else:
self.Chr[m] = 0
Я также пытался получить случайные биты, но результаты все равно были такими же. Например, я использовал print(str(main.mRand.getrandbits(6))
, чтобы увидеть результаты в консоли, и понял, что число дублируется слишком много. Есть ли способ создать более уникальные случайные числа? в MatLab тот же код с функцией rand
работал хорошо (конечно, довольно медленно). Наличие такой близкой начальной популяции приводит к плохим результатам на следующих шагах (также я должен упомянуть, что проблема случайности также вызывает аналогичные мутации). Моя проблема в том, что существует так много похожих хромосом. Например, у меня есть несколько 01111001
, что странно, учитывая вероятность их появления.
updateQ_Qs()
, что такоеM
и что такоеG
? Также python не работает как Matlab, вы не можете назначитьChr[m]
, еслиChr
пусто, посколькуChr[m]
не существует. Этот код должен возвращать ошибку. Предоставьте рабочий пример и дайте нам ожидаемый результат. - person obchardon   schedule 10.03.2020updateQ_Qs()
— это моя фитнес-функция, которая возвращает значение с плавающей запятой для каждой хромосомы. Говоря более уникальным, я хотел упомянуть, что, например, у меня есть несколько хромосом с порядком генов01111001
, что странно (я отредактировал код). - person Sajjad   schedule 10.03.20201-prod(1-[(0:49)/2^8])
= 99,41%, так что в этом нет ничего удивительного. - person obchardon   schedule 10.03.2020NumPy
, но результаты не изменились. - person Sajjad   schedule 10.03.20201-prod(1-[(0:49)/2^8])
? Я думал, что вероятность выбора одного и того же человека k раз за 50 независимых итераций должна бытьlength(combntns([1:50],k))*1/256^k
. - person Sajjad   schedule 10.03.2020AttributeError
при попытке добраться доself.M
, прежде чем назначить его на__init__
. В противном случае код в Python очень мало идиоматичен — вероятно, вы получите один и тот же объект, содержащий данные о хромосомах более чем в одном экземпляре. - person jsbueno   schedule 11.03.2020