Помогите мне найти хороший алгоритм?алгоритм для случайного распределения объектов с ограничениями
У меня есть сумка, полная n шаров. (Скажем, 28 шариков для примера.)
Шары в этой сумке каждый имеют 1 цвет. В сумке есть < = 4 разных цвета шариков. (Скажем, красный, зеленый, синий и фиолетовый - это возможности.)
У меня есть три ведра, каждая из которых имеет количество шаров, в которых им нужно в конечном итоге. Эти числа составляют n. (Например, для того, чтобы ведро А должно было иметь 7 шаров, ведро B должно было закончиться с 11 шарами, ведро C должно закончиться 10 шарами.)
Ковши также могут иметь или не иметь цвет ограничения - цвета, которые они не будут принимать. (Ковш A не принимает пурпурные шарики или зеленые шарики. Ковш B не принимает красные шарики. Ковш C не принимает пурпурные шары или синие шарики.)
Мне нужно распределять шары эффективно и случайным образом (равным вероятность всех возможностей).
Я не могу просто случайно помещать шары в ведра, у которых есть место, чтобы их принять, потому что это может привести меня к ситуации, когда единственное ведро, в котором осталось место, не принимает единственный цвет, мешок.
Дано указание, что всегда есть возможность распределить шары по крайней мере 1 раз. (У меня не будет мешка только красных шариков, а некоторое ведро с номером> 0 не принимает красные шарики.)
Все шары считаются отличными, даже если они одного цвета. (Одна из возможностей, когда ведро C получает красный шар 1, а не красный шар 2, отличается от возможности, где все одинаково, за исключением того, что ведро C получает красный шар 2, а не красный шар 1.)
Редактировать, чтобы добавить свою идею :
Я не знаю, имеет ли это равную вероятность всех возможностей, как хотелось бы. Я не понял эффективности - это не кажется слишком плохим. И это содержит утверждение, что я не уверен, что это всегда так. Прошу прокомментировать любую из этих вещей, если вы знаете.
Choose a ball from the bag at random. (Call it "this ball".)
If this ball fits and is allowed in a number of buckets > 0:
Choose one of those buckets at random and put this ball in that bucket.
else (this ball is not allowed in any bucket that it fits in):
Make a list of colors that can go in buckets that are not full.
Make a list of balls of those colors that are in full buckets that this ball is allowed in.
If that 2nd list is length 0 (There are no balls of colors from the 1st list in the bucket that allows the color of this ball):
ASSERT: (Please show me an example situation where this might not be the case.)
There is a 3rd bucket that is not involved in the previously used buckets in this algorithm.
(One bucket is full and is the only one that allows this ball.
A second bucket is the only one not full and doesn't allow this ball or any ball in the first bucket.
The 3rd bucket is full must allow some color that is in the first bucket and must have some ball that is allowed in the second bucket.)
Choose, at random, a ball from the 3rd bucket balls of colors that fit in the 2nd bucket, and move that ball to the 2nd bucket.
Choose, at random, a ball from the 1st bucket balls of colors that fit in the 3rd bucket, and move that ball to the 3rd bucket.
Put "this ball" (finally) in the 1st bucket.
else:
Choose a ball randomly from that list, and move it to a random bucket that is not full.
Put "this ball" in a bucket that allows it.
Next ball.
Что означает «распределять шары эффективно и случайным образом»? Вы ищете все возможности или только одну? – m69
@ m69 Алгоритм, выполненный один раз, даст одну возможность. Но это случайное. Это означает, что в следующий раз, когда алгоритм используется с одним и тем же входом, он может возникнуть другой возможностью. В идеале все возможности должны происходить с равной вероятностью. – beauxq
Являются ли шарики случайным образом вытаскиваются из мешка, или они назначаются случайным образом в ведра после того, как они удалены из мешка? Если шарики поступают из мешка в порядке [1, 7, 3, 4, 2, 6, 5] при первом запуске программы, и снова во второй раз вы ожидаете, что алгоритм будет производить разные выходы для два прогона? –