这是一个乐观重试策略:
#!/usr/bin/env python
from random import choice
def added1(lst, bank):
if len(bank) == 0:
return lst
selection = choice(bank)
lst.append(selection)
bank.remove(selection)
if selection == 1:
return added11(lst, bank)
return added2(lst, bank)
def added11(lst,bank):
if len(bank) == 0:
return lst
bank.remove(2)
lst.append(2)
return added2(lst, bank)
def added2(lst, bank):
if len(bank) == 0:
return lst
selection = choice(bank)
lst.append(selection)
bank.remove(selection)
if selection == 2:
return added22(lst, bank)
return added1(lst, bank)
def added22(lst,bank):
if len(bank) == 0:
return lst
bank.remove(1)
lst.append(1)
return added1(lst, bank)
def start(lst, bank):
bank_bkp = bank[:]
while True:
try:
if len(bank) == 0:
return lst
selection = choice(bank)
lst.append(selection)
bank.remove(selection)
if selection == 1:
return added1(lst, bank)
return added2(lst, bank)
except:
# retry
bank = bank_bkp[:]
lst = []
print start([], [1] * 10 + [2] * 10)
输出:
[1, 1, 2, 1, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1, 2, 2, 1, 2, 2]
它基于表示此自动机中状态的简单函数:
执行规则,以及一组选项。如果选项库用完 - 它会再次尝试。
可能可能会花费很多时间,但不会:
print timeit.repeat('start([], [1] * 10 + [2] * 10)', setup="from __main__ import start", number=10000, repeat=3)
输出:
[0.14524006843566895, 0.14585399627685547, 0.14375996589660645]
注意:这是递归的,因此拥有超过 2000 名成员的银行需要您明确允许更深层次的递归。