Как получить всю возможную комбинацию частоты соты на основе общего количества строк и столбцов - PullRequest
0 голосов
/ 29 июня 2019

Мне нужно общее количество строк и столбцов в таблице. в этом примере это 31, 92, 59 и 64. Также каждая ячейка может получить максимальное значение (например, максимум 20 для ячейки 1 и т. д.), указанное в примере.

Пример:

enter image description here

Как я могу кодировать это в R? Я пытался повторить цикл, но безуспешно !!

1 Ответ

1 голос
/ 30 июня 2019

ваш стол выглядит так:

a   b  | sab
c   d  | scd
----------
sac sbd| S

и у вас есть 4 неизвестных с 4 ограничениями (на минутку забудьте о максимальных ограничениях на a, b, c и d):

A + B = SAB

а + с = * 1008 мешок *

C + D = SCD

B + D = SBD

4 ограничения не являются независимыми (в противном случае у вас будет только одно возможное решение!), И бит алгебры показывает, что матрица этой линейной системы имеет ранг 3. таким образом, у вас есть одна степень свобода играть с выберите, например, и затем измените от 0 до его максимального значения. Для каждого значения затем вычислите b, c и d, используя ограничения суммы строк и столбцов, и убедитесь, что они удовлетворяют Позитивность и максимальные ограничения.

Код R для вашего примера выглядит следующим образом:

sab <- 59
scd <- 64
sac <- 31
sbd <- sab + scd - sac ### this is always true

amax <-  20
bmax <- 40
cmax <- 12
dmax <- 70

### let us vary a, our only degree of freedom
for (a in 0:amax){
    ### let us compute b, c and d by satisfying row and column sum constraints
    b <- sab - a
    c <- sac - a
    d <-  sbd - b
    ### let us check inequality constraints
    if (b <= bmax && b>= 0 && c <= cmax && c >= 0 && d <= dmax && d >= 0){
        cat("\nSolution:\n")
        print(m <- rbind(c(a,b),c(c,d)))
        cat("\nrowSums:", rowSums(m))
        cat("\ncolsums:", colSums(m))
        cat("\n---------------\n")
        if (! identical(rowSums(m), c(sab,scd)))
            stop("\nrow sum is not right!\n")
        if (! identical(colSums(m), c(sac,sbd)))
            stop("\ncolumns sum is not right!\n")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...