Попытка написать R-скрипт, который устраняет доминирующие стратегии (просто сравнивая два вектора) и что-то идет не так - PullRequest
0 голосов
/ 13 февраля 2012

Итак, я скоро поработаю с R, и мне нужно научиться им пользоваться. Я подумал, что хорошим упражнением будет попытка написать программу, которая использует матрицу выигрышей и выполняет итеративную ликвидацию доминирующих стратегий (если вы не знаете, о чем я говорю, это очень простой материал по теории игр и не очень важный для вопрос). Первым шагом было написание функции, которая берет матрицу и возвращает сводку всех стратегий, в которых доминируют, но что-то идет не так.

strictdomlist <- function(m) {
    # takes a matrix, determines if row player has strictly 
    # dominated strategies
    strategies <- dim(m)[1]
    dominatingstrategies <- list()
    for (i in 1:strategies) {
        dstrat <- 0
        for (j in 1:strategies) {
            if (i != j) {
                if (all(m[i, ]<m[j, ])) dstrat <- c(dstrat,j)
            }
        }
        dominatingstrategies[i] <- dstrat
    }
    return(dominatingstrategies)
}

Все (что я хочу) это проверка каждой строки, чтобы увидеть, есть ли строка, в которой есть записи, которые все больше. Если есть, он должен поместить номер этой строки в вектор, а затем в конце назначить этот вектор i-й позиции в доминирующих стратегиях. Если я дам ему эту матрицу:

     [,1] [,2] [,3] [,4]
[1,]    1    4    2   10
[2,]    2    5    9   11
[3,]    0    1    1    1
[4,]   16    7   10   12

Я хочу, чтобы это вернуло мне:

[[1]]
[1] 2 4

[[2]]
[1] 4

[[3]]
[1] 1 2 4

[[4]]
[1] 0

Но то, что он дает мне:

> strictdomlist(m2)
[[1]]
[1] 4

[[2]]
[1] 4

[[3]]
[1] 4

[[4]]
[1] 0

Warning messages:
1: In dominatingstrategies[i] <- dstrat :
  number of items to replace is not a multiple of replacement length
2: In dominatingstrategies[i] <- dstrat :
  number of items to replace is not a multiple of replacement length
3: In dominatingstrategies[i] <- dstrat :
  number of items to replace is not a multiple of replacement length

Кто-нибудь может увидеть, что я делаю не так? И, если есть лучший способ сделать это в R, вы можете помочь?

Спасибо!

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Вот более R-ish решение: оно создает матрицу, чья запись (i, j) равна TRUE, если стратегия i строго подчиняется стратегии j.

0 голосов
/ 13 февраля 2012

Это ваше назначение списка:

dominatingstrategies[i] <- dstrat

Чтобы добавить в список, вы должны использовать двойные квадратные скобки:

dominatingstrategies[[i]] <- dstrat

Когда вы используете одинарные скобки, вы извлекаете список , содержащий вектор, содержащийся в dominatingstrategies[i], а не сам vctor.

Кроме того, поскольку вы начинаете dstrat с 0, вы получаете эту матрицу (с исправленной выше ошибкой):

> strictdomlist(m)
[[1]]
[1] 0 2 4

[[2]]
[1] 0 4

[[3]]
[1] 0 1 2 4

[[4]]
[1] 0

Т.е. вы получаете 0 в каждом элементе, включая те, которые имеют большие строки.

Если вы не хотите этого, вы можете инициализировать dstrat как dstrat <- c(), а затем в конце сделать что-то вроде

if (length(dstrat)==0) 
    dominatingstrategies[[i]] <- 0
else
    dominatingstrategies[[i]] <- dstrat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...