我正在尝试为家庭作业编写遗传算法来解决旅行商问题。
我正在尝试的一个突变功能是在巡演中使用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”参数的功能吗? 我看过this question,但它没有回答我的问题。
我特别喜欢使用这个函数,如果我能以某种方式控制混乱的随机性(如果这有意义的话)
答案 0 :(得分:4)
random
参数用于指定(另一个)随机数生成器。它是预期返回0 <= x <1
如果从随机数生成器返回两次相同的数字,则shuffle将是相同的。例如,
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 :(得分:1)
正如Johan所说,随机参数只是提供了随机函数的随机性。所以你可以使用默认值或提供自己的默认值。因此,如果您希望它更完美随机,您可以找到一个比python更好的库。
根据您对我的评论的回复,听起来您正在寻找距离而不是随机性。您可能希望采用一组随机随机播放并最大化距离。要计算距离,您可以使用some techniques like these我尚未查找但实际存在的实现。
答案 2 :(得分:1)
shuffle
库例程允许您提供随机数的来源(如果不这样,它将使用内置默认值)。因此,从理论上讲,如果你有更好的随机数源 - 也许是与盖革计数器或“白噪声”无线电台连接的东西,或者从random.org获得数字的东西 - 你可以使用它。可能更有用,如果你正在测试,你可以连接一个返回相同数字序列的源,这将确保你的测试用例是可重复的,并且每次都会产生相同的shuffle。
理论上,你可以开发一个随机数例程,它可以让你控制shuffle的确切调整程度;但这意味着您需要准确了解shuffle
的工作原理以及您必须返回的确切数字,以便将您的结果“引导”到他们想去的地方。从理论上讲......它并不太难,所使用的算法都有很好的记录(Fisher-Yates),并且在调用期间它生成n-1
个随机数,第一个选择从索引0到n-的元素1,与最后一个元素交换,第二个元素选择从0到索引n-2的元素,与最后一个元素交换,依此类推。所以是的,你可以使用它控制shuffle,就像@JohanLundberg一样强制shuffle转移的例子 - 但是很难用它来控制 shuffle (自每次迭代以来,所有原始数据都会跳转)。
简短的回答,如果您需要对随机播放的特定限制,例如“仅交换相邻元素” - 您最好实现自己的,可能使用随机源代码作为指导。