Психологические эксперименты часто требуют, чтобы вы псевдо-рандомизировали пробный порядок, чтобы испытания были, по-видимому, случайными, но вы не получаете слишком много подобных испытаний последовательно (что может случиться с чисто случайным упорядочением).
Скажем, что визуальный дисплей на каждом испытании имеет цвет и размер:
display_list = []
colours = {0: 'red', 1: 'blue', 2: 'green', 3: 'yellow'}
sizes = [1] * 20 + [2] * 20 + [3] * 20 + [4] * 20 + [5] * 20 + [6] * 20
for i in range(120):
display_list.append({'colour': colours[i % 4], 'size': sizes[i]})
print(display_list)
И мы можем посмотреть максимальное количество последовательных испытаний, которые имеют одинаковое значение для любого свойства, используя эту функцию:
def consecutive_properties(seq, field):
longest_run = 0
prev_value = None
current_run = 0
for d in seq:
if d[field] == prev_value:
current_run += 1
else:
current_run = 1
if current_run > longest_run:
longest_run = current_run
prev_value = d[field]
return longest_run
Вывод:
>>> print("Consecutive colours: ", consecutive_properties(display_list, 'colour')
('Consecutive colours: ', 1)
>>> print("Consecutive sizes: ", consecutive_properties(display_list, 'size'))
('Consecutive sizes: ', 20)
Существуют ли какие-либо алгоритмы, о которых вы знаете, что позволило бы минимизировать последовательные прогоны обоих или обоих свойств или, по крайней мере, сохранить эти прогоны ниже определенной длины? Если последнее, скажем, не более 4 в строке того же цвета или размера.
Что я пробовал:
Решение, которое у меня сейчас, в основном делает немного интеллектуальный bogosort, который должен быть ужасно неэффективным. В основном:
- Вы разбиваете весь список на куски, содержащие все перестановки свойств: если вы разбиваете
display_list
на куски длиной 24, каждый кусок имеет каждый цвет в паре с каждым размером. Предположим, что список проб всегда можно разбить на эти куски перестановки, так как вы знаете, какие перестановки относятся к дизайну эксперимента. - Вы выбираете максимальную длину выполнения на кусок
- Перемешивайте каждый кусок до тех пор, пока длина выполнения для каждого фрагмента не будет ниже максимального значения (это фактически означает, что в общем пробном списке ваши прогоны могут быть вдвое длиннее, так как вы можете иметь пробег этой длины в конце одного куска и начала следующего)