0

目标是创建一个包含 99 个元素的列表。所有元素必须为 1 或 0。第一个元素必须是 1。总共必须有 7 个 1。

import random
import math
import time

# constants determined through testing                                                                                                       

generation_constant = 0.96

def generate_candidate():
    coin_vector = []
    coin_vector.append(1)
    for i in range(0, 99):
        random_value = random.random()
        if (random_value > generation_constant):
            coin_vector.append(1)
        else:
            coin_vector.append(0)
    return coin_vector

def validate_candidate(vector):
    vector_sum = sum(vector)
    sum_test = False
    if (vector_sum == 7):
        sum_test = True
    first_slot = vector[0]
    first_test = False
    if (first_slot == 1):
        first_test = True
    return (sum_test and first_test)

vector1 = generate_candidate()
while (validate_candidate(vector1) == False):
    vector1 = generate_candidate()
print vector1, sum(vector1), validate_candidate(vector1)

大多数时候,输出是正确的,比如

[1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 ] 7 真

但有时,输出是:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] 2 错误

我到底做错了什么?

4

4 回答 4

1

我不确定我是否理解您的要求,但这听起来像是您需要的:

#!/usr/bin/python3

import random

ones = [ 1 for i in range(6) ]
zeros = [ 0 for i in range(99 - 6) ]
list_ = ones + zeros
random.shuffle(list_)
list_.insert(0, 1)

print(list_)
print(list_.count(1))
print(list_.count(0))

高温高压

于 2013-11-08T21:14:05.093 回答
1

您提供的算法有效,尽管速度很慢。请注意,理想generation_constant值实际上可以使用二项分布来计算。最佳值约为 0.928571429,它将适合 1.104% 的时间条件。如果您手动将第一个元素设置为 1,则最佳generation_constant值约为 0.93877551,这将在 16.58% 的时间内符合条件。

以上基于二项式分布,即在N次总尝试中恰好有k个“成功”事件的概率为P ( k | N , p ) = N!* p ^ k * (1 - p ) ^ ( N - k ) / ( n ! * ( N - k ))。只需将其粘贴到 Excel、Mathematica 或图形计算器中并最大化P即可。

或者:

要生成一个包含 99 个数字的列表,其中第一个和 6 个附加项为 1,其余元素为 0,您不需要调用random.random这么多。生成伪随机数非常昂贵。有两种方法可以避免调用random太多。

最高效的处理器方法是只调用随机 6 次,对于您需要插入的 6 次:

import random

# create vector of 99 0's
vector = [0 for i in range(99)]

# set first element to 1
vector[0] = 1

# list of locations of all 0's
indexes = range(1, 99)

# only need to loop 6 times for remaining 6 ones
for i in range(6):
    # select one of the 0 locations at random
    # "pop" it from the list so it can't be selected again
    # and set it's coresponding element in vector to 1.
    vector[indexes.pop(random.randint(0, len(indexes) - 1))] = 1

或者,为了节省内存,您可以测试每个新索引以确保它实际上会设置一些东西:

import random

# create vector of 99 0's
vector = [0 for i in range(99)]

# only need to loop 7 times
for i in range(7):
    index = 0                          # first element is set to 1 first
    while vector[index] == 1:          # keep calling random until a 0 is found
        index = random.randint(0, 98)  # random index to check/set
    vector[index] = 1                  # set the random (or first) element to 1

第二个总是首先将第一个元素设置为 1,因为index = random.randint(0, 98)只有 if 才会被调用vector[0] == 1

于 2013-11-08T20:31:40.950 回答
0

我有一种感觉是你使用 sum()。我相信这会修改列表:

>>> mylist = [1,2,3,4]
>>> sum(mylist)
10
>>> mylist
[]

这是一个(有点)pythonic递归版本

def generate_vector():
    generation_constant = .96
    myvector = [1]+[ 1 if random.random() > generation_constant else 0 for i in range(0,99)]

    mysum = 0
    for a in myvector:
        mysum = (mysum + a) 

    if mysum == 7 and myvector[0]==1:
        return myvector
    return generate_vector()

并且为了很好的衡量

def generate_test():
    for i in range(0,10000):
        vector = generate_vector()
        sum = 0
        for a in vector:
            sum = sum + a
        if sum != 7 or vector[0]!=1:
            print vector

输出:

>>> generate_test()
>>> 
于 2013-11-08T20:12:58.733 回答
0

通过遗传编程,您希望控制您的域,以便尽可能消除无效配置。假设适应度对有效配置进行评分,而不是消除无效配置。老实说,这个问题似乎并不适合基因编程。您已经概述了域。但是我在任何地方都没有看到健身说明。

无论如何,话虽如此,我填充域的方式是:由于第一个元素始终为 1,忽略它,因为剩余的 98 个只有 6 个,将 6 个 1 随机排列到 92 个零。或者甚至列举可能的情况,因为您的域不是很大。

于 2013-11-08T19:56:10.850 回答