Заполнение ведер: «горизонтально» или «вертикально»? - PullRequest
0 голосов
/ 05 февраля 2020

Позволяет иметь N-ведер, которые могут содержать М-предметы. В массиве хранится текущее количество элементов в каждом сегменте: status = np.zeros (N): максимальное значение M

Мне нужна функция для возврата следующего кандидата в группы для двух различных типов последовательности добавления элементов. .

Мне также было интересно, смогу ли я сделать это без зацикливания массива состояния, но с использованием numpy ops.

1. algo=hop ... here is the order :
    add item to the buckets one after another, when it reaches N start from the first bucket again..
    1,2,3,1,2,3,1,2,3...
2. algo=fill ... here is the order :
    fill the 1st bucket, then fill 2nd bucket , ..... fill n-th bucket
    1,1,1,.. m-times, 2,2,2,... m-times, .... m,m,m,m, ...m-times

, поэтому на основе алгоритма, если я пройду " статус ", я должен получить следующую корзину, к которой нужно добавить .., а также обновить статус.

next_bucket(status, algo) -return-> bucket-x, is_empty? 
                          --------> None if full

мой размышляющий" прыжок ", поиск наименьшего числа в статусе> ZERO, кроме когда до последнего сегмента до M.

"fill", ищите последний интервал с Max, за исключением случаев, когда все значения


if M=5, fill :

: s4 
: array([5, 5, 5, 0, 0], dtype=int8)

: np.where(s4 < 5)[0][0]
: 3


: s3
: array([5, 3, 0, 0, 0], dtype=int8)

: np.where(s3 < 5)[0][0]
: 1

1 Ответ

0 голосов
/ 05 февраля 2020

Пока вот что я придумал:

def bucket(status, vmax, seq='fill', reverse=False) :
#       print status
        if seq == 'fill' :
                res = np.where(status[::-1] < vmax)[0] if reverse else np.where(status < vmax)[0]
                if len(res) == 0 : return None #FULL

        if seq == 'hop' :
                vmin = status.min()
                if vmin == vmax : return None #FULL
                res = np.where(status[::-1] == vmin)[0] if reverse else np.where(status == vmin)[0]

        b = res[0]
        inc_dec = + 1
        if reverse :
                inc_dec = -1
                b = len(status) - b - 1

        if status[b] == vmax :
                if status[b + inc_dec] < vmax : status[b + inc_dec] += 1
        else : status[b] += 1
        print status
        return b

In [498]: s0 = np.zeros(3, dtype=np.byte)

In [499]: for _ in xrange(10) : bucket(s0, vmax=3, seq='fill')
[1 0 0]
[2 0 0]
[3 0 0]
[3 1 0]
[3 2 0]
[3 3 0]
[3 3 1]
[3 3 2]
[3 3 3]

In [500]: s0 = np.zeros(3, dtype=np.byte)

In [501]: for _ in xrange(10) : bucket(s0, vmax=3, seq='hop')
[1 0 0]
[1 1 0]
[1 1 1]
[2 1 1]
[2 2 1]
[2 2 2]
[3 2 2]
[3 3 2]
[3 3 3]
[3 3 3]
...