Количество действий в год. Комбинаторика вопрос - PullRequest
0 голосов
/ 16 ноября 2018

Я пишу диплом о вакцинах.Есть регион, его население и 12 месяцев.Существует массив из 12 значений от 0 до 1 с шагом 0,01.Это означает, какую часть населения мы должны делать прививки каждый месяц.Например, если у нас есть массив = [0,1,0,0,0,0,0,0,0,0,0,0,0].Это означает, что мы должны вакцинировать 0,1 населения региона только в первый месяцДругой массив = [0, 0,23,0,0,0,0,0,0, 0,02,0,0,0].Это означает, что мы должны вакцинировать 0,23 населения региона во второй месяц и 0,02 населения региона в 9-й месяц.Таким образом, вопрос заключается в следующем: как сгенерировать (используя 3 цикла) 12 (месяцев) * 12 (время вакцинации) * 100 (количество шагов от 0 до 1) = 14_400 количества массивов, которые будут содержать каждую версию этих комбинаций.

Пока у меня есть этот код:

for(int month = 0;month<12;month++){
   for (double step = 0;step<=1;step+=0.01){
      double[] arr = new double[12];
      arr[month] = step;
   }
}

Мне нужно добавить 3d петлю, которая будет варьировать количество прививок в год.Понятия не имею, как это написать.

ИДК, если это понятно.Надеюсь, ты получишь это, иначе спроси меня, пожалуйста.

1 Ответ

0 голосов
/ 16 ноября 2018

У вас есть 101 вариант для первого месяца 0.00, 0.01..1.00
И 101 вариант для второго месяца - те же значения.И 101 * 101 возможных комбинаций за два месяца.

Продолжение - за все 12 месяцев у вас есть 101^12 variants ~ 10^24
Невозможно генерировать и хранить столько комбинаций (по крайней мере, в текущем десятилетии)

Если шаг больше 0,01, то количество комбинаций может быть надежным.Общая формула: P=N^M, где N - количество вариантов в месяц, M - количество месяцев

. Вы можете пройти по всем комбинациям, представляющим все целые числа в диапазоне 0..P-1 в N-ричной системе счисления.Или сделайте счетчик цифр:

 fill array D[12] with zeros
 repeat
    increment element at the last index by step value
    if it reaches the limit, make it zero 
                    and increment element at the next index
 until the first element reaches the limit 

Это похоже на счет 08, 09, здесь мы не можем увеличить 9, поэтому делаем 10 и т. Д.

s = 1
m = 3
mx = 3
l = [0]*m
i = 0
while i < m:
    print([x/3 for x in l])
    i = 0
    l[i] += s
    while (i < m) and l[i] > mx:
        l[i] = 0
        i += 1
        if i < m:
            l[i] += s

Код Python печатает 64 ((mx/s+1)^m=4^3) варианты типа [0.3333, 0.6666, 0.0]

...