random.shuffle Случайность - PullRequest
5 голосов
/ 31 января 2012

Я пытаюсь написать генетический алгоритм для домашней работы , чтобы решить проблему коммивояжера.

Одна из функций мутации, которую я пытаюсь, - использовать random.shuffle натур.

Когда я читаю документацию для random.shuffle, я вижу:

shuffle(self, x, random=None, int=<type 'int'>) method of random.Random instance
x, random=random.random -> shuffle list x in place; return None.

Optional arg random is a 0-argument function returning a random
float in [0.0, 1.0); by default, the standard random.random.

Может кто-нибудь объяснить, почему в этой функции указан параметр "random"?Я прочитал этот вопрос , но он не отвечает на мой вопрос.

Я бы особенно хотел использовать эту функцию, если смогу каким-то образом контролировать, насколько случайным будет перемешивание (если это делаетлюбой смысл)

Ответы [ 3 ]

4 голосов
/ 31 января 2012

Аргумент random используется для указания (другого) генератора случайных чисел. ожидается, что эта функция будет возвращать одинаковые случайные числа в диапазоне 0 <= x <1 </p>

Если из генератора случайных чисел дважды возвращается одно и то же число, случайное число будет одинаковым. Например,

def mynonrandom():
 return 0.1

q
[1, 2, 3, 4]
random.shuffle(q, mynonrandom)
q
[2, 3, 4, 1]
random.shuffle(q, mynonrandom)
q
[3, 4, 1, 2]

обратите внимание, что в этом конкретном случае я получаю сдвиг -1 каждый раз. То, что вы получите для случайного ввода, может зависеть от реализации random.shuffle.

Для генетического алгоритма вы хотите иметь случайную случайную величину случайного перемешивания. Это не сделано с random.shuffle. Вам, вероятно, нужно определить некоторые примерные изменения (например, пары с изменением расстояния N) и затем рандомизировать (с некоторыми параметрами, которые вы определите), сколько из этих операций вы выполняете для каждого нового набора генов.

1 голос
/ 31 января 2012

Подпрограмма библиотеки shuffle позволяет вам указать источник случайных чисел (если вы этого не сделаете, он будет использовать встроенное значение по умолчанию).Итак, теоретически, если у вас есть лучший источник случайных чисел - может быть, что-то, связанное со счетчиком Гейгера или радиостанцией «белого шума», или что-то, получающее числа из random.org - вы можете использовать это вместо этого.Возможно, более полезно, если вы тестируете, вы можете подключить источник, который возвращает ту же последовательность чисел, что обеспечит повторяемость вашего теста и всегда генерирует один и тот же случайный случай каждый раз.

Вы теоретически может разработать подпрограмму для случайных чисел, которая позволит вам точно контролировать, сколько тасует перетасовка;но это означает, что вам нужно точно знать, как работает shuffle и какие цифры вам нужно вернуть, чтобы «направить» ваши результаты туда, куда они хотят попасть.Теоретически ... это не слишком сложно, используемый алгоритм очень хорошо документирован (Фишер-Йейтс), и во время вызова он генерирует n-1 случайных чисел, первым выбирая элемент из индекса от 0 до n-1,поменять местами с последним элементом, вторым выбрать элемент от 0 до индекса n-2, поменять местами с последним, но одним элементом, и так далее.Так что да, вы могли бы использовать это для управления перемешиванием, как пример @JohanLundberg, который заставляет перемешивание переключаться - но было бы очень сложно использовать это для управления перемешиванием (так какна каждой итерации все исходные данные перепрыгивают).

Короткий ответ, если вам нужны определенные ограничения на случайное перемешивание, например, «только поменять местами соседние элементы» - вам лучше реализовать свои собственные, возможно,используя исходный код в случайном порядке.

1 голос
/ 31 января 2012

Как сказал Йохан, случайный параметр просто обеспечивает случайность, которую должна использовать функция перемешивания. Таким образом, вы можете использовать по умолчанию или предоставить свой собственный. Поэтому, если вы хотите, чтобы он был более случайным, вы можете найти библиотеку, которая работает лучше, чем библиотека Python.

Судя по вашему ответу на мой комментарий, вы ищете расстояние, а не случайность. Вы можете взять набор из n случайных перемешиваний и максимизировать расстояние. Чтобы вычислить расстояние, вы можете использовать некоторые методы, подобные этим , которые я не искал, но, безусловно, существует.

...