Я хочу найти все возможные комбинации (без замены) большой разреженной матрицы. Каждую комбинацию можно выбрать не более одного раза из каждой строки и столбца. Моя цель - найти комбинацию, которая максимизирует сумму выбранных записей.
Скажите, у меня есть следующая матрица:
6 8 . .
. 5 7 .
. 6 . 9
Существует 4 возможных комбинации (в терминах i и j): [(1,1), (2,2), (3,4)], [(1,1), (2,3), (3,2)], [(1,2), (2,3), (3,2)], [(1,2), (2,3), (3,4)]
Мой результат должен быть суммой записей для каждой возможной комбинации, где моя конечная цель - найти комбинацию, которая максимизирует этот результат ([(1,2), (2,3), (3,4)] = 8 + 7 + 9 = 24 в этом примере).
Редактировать: вот полный код, который генерирует разреженную матрицу, из которой я хочу найти оптимальную комбинацию:
library(data.table)
library(ggplot2)
library(haven)
library(Matrix)
library(evd)
set.seed(12345)
N1 <- 100
M <- 100
I1 <- 10
I2 <- 2
I <- I1 * I2
N <- N1 * I2
J <- 5
p_c_A = 0.02
p_c_B = 0.01
p_0 = 0.05
p_1 = 0.2
dt_workers<- data.table(worker_id = 1:N,
firm_id = sample.int(M, N, replace = TRUE),
worker_type = sample.int(I1, N, replace = TRUE))
dt_workers[, worker_ethnicity := 1 * (worker_id > N1)]
dt_firms <- data.table(firm_id = 1:M,
firm_type = sample(J) )
sys_util <- matrix(NA, nrow=I1, ncol=J)
for(i in 1:dim(sys_util)[1]){
for(j in 1:dim(sys_util)[2]){
sys_util[i,j] <- i * j}
}
joint_surplus
con_A <- matrix(data = runif(N1 * M), nrow = N1, ncol = M)
con_B <- matrix(data = runif(N1 * M), nrow = N1, ncol = M)
con_A <- 1 * (con_A < p_c_A)
con_B <- 1 * (con_B < p_c_B)
p_meet_A <- con_A * p_1 + (1 - con_A) * p_0
p_meet_B <- con_B * p_1 + (1 - con_B) * p_0
meet_A <- matrix(data = runif(N1 * M), nrow = N1, ncol = M)
meet_B <- matrix(data = runif(N1 * M), nrow = N1, ncol = M)
meet_A <- 1* ( meet_A < p_meet_A )
meet_B <- 1* ( meet_B < p_meet_B )
meet <- rbind(meet_A,meet_B)
meet_sparse <- Matrix(meet, sparse = TRUE)
util <- which (meet_sparse>0, arr.ind=T)
n_draws <- dim(util)[1]
mu = 0
sigma = 10
idio = rgumbel(n=n_draws, loc=mu, scale=sigma)
util <- cbind(util,idio)
sys <- vector()
for(k in 1:dim(util)[1]){
g <- util[k,1]
f <- util[k,2]
i <- dt_workers[g, worker_type]
j <- dt_firms[f, firm_type]
sys[k] = sys_util[i,j]
}
util <- cbind(util,sys)
total_util = util[,3] + util[,4]
M <- sparseMatrix(
i = util[,1],
j = util[,2],
x = total_util
)
dat <- as.data.frame(summary(M))
dat <-dat[order(dat$i, dat$j),]
rownames(dat) <- NULL