Muchisimas gracias, Olivier and Jorge.       --JIV


2013/8/27 Olivier Nuñez <onunez@unex.es>

> Jorge,
>
> como lo comentó Jorge Ayuso se puede efectivamente ver tu problema como un
> problema de optimización.
> Aquí redacté un pequeña función seguramente mejorable que creo soluciona
> el problema.
> Utiliza la librería lpSolve y adopté las notaciones que aparecen en el
> ejemplo de la función lp.
> Un saludo. Olivier
>
>
> redondeo.matriz<-function(m) {
> require(lpSolve)
> n=dim(m)[1]
> M = m-floor(m) #parte decimal
> tc <- colSums(M)
> tf <- rowSums(M)
> M.obj <- ifelse(M < .5 , M-1, M)  #parte decimal
> f.obj <- c(M.obj) #se procura ajustarse a la función round
> v = c(rep(c(rep(1,n),rep(0,n*n)),**n-1),rep(1,n))
> C=matrix(v,nrow=n,ncol=n*n,**byrow=TRUE) #matriz coef para restriciones
> columnas
> F=matrix(C,nrow=n,ncol=n*n,**byrow=TRUE) #matriz coef para restriciones
> filas
> I = diag(1,n*n) #solución toma valores entre 0 y 1
> f.con <- rbind(C,F,I)
> f.rhs <- c(tc,tf,rep(1,n*n))
> f.dir <- c(rep("=",2*n),rep("<=",n*n))
>  x = lp ("max", f.obj, f.con, f.dir, f.rhs)$sol #solución del problema de
> PL
> floor(m) + matrix(x,nrow=n,byrow=FALSE)
>
> }
>
> m <- matrix(c(3.546, 4.5345, 1.9195,
>          12.332, 15.982, 21.686,
>          4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE)
>
>
> m
>
> redondeo.matriz(m)
>
> -- ______________________________**______
>
> Olivier G. Nuñez
> Email: onunez@unex.es
> http://matematicas.unex.es/~**onunez <http://matematicas.unex.es/~onunez>
> Tel : +34 663 03 69 09
> Departamento de Matemáticas
> Universidad de Extremadura
>
> ______________________________**______
>
>
>
>
>
> El 25/08/2013, a las 17:59, Jorge I Velez escribió:
>
>
>  Gracias, Jorge. Y cual fue la solucion a la que llegaron? --JIV
>>
>> Sent from my phone. Please excuse my brevity and misspelling.
>>
>> On Aug 25, 2013, at 8:36 AM, Jorge Ayuso Rejas <jayusor@gmail.com> wrote:
>>
>> Esto lo hice yo en una práctica en la universidad,
>> Definíamos un problema de optimización entera minimizando el error de
>> redondeo y restringiendo a la suma de filas y columnas.
>>
>>
>>
>>
>>
>> El 23 de agosto de 2013 19:05, Jorge I Velez <jorgeivanvelez@gmail.com>**
>> escribió:
>>
>>  Buenas tardes a tod@s,
>>>
>>> Me gustaria redondear las entradas de una matriz m manteniendo la suma de
>>> filas y columnas constantes (son valores fijos conocidos).  En la
>>> aplicacion que estoy trabajando (en la que por supuesto m tiene una
>>> dimension mayor que en el ejemplo), no son permitidos numeros decimales y
>>> por ello debe efectuarse el redondeo.
>>>
>>> La forma de m es:
>>>
>>> m <- matrix(c(3.546, 4.5345, 1.9195,
>>>          12.332, 15.982, 21.686,
>>>          4.122, 9.4835, 16.3945), ncol = 3, byrow = TRUE)
>>> colnames(m) <- paste0('C', 1:3)
>>> rownames(m) <- paste0('X', 1:3)
>>> m
>>> #        C1      C2      C3
>>> # X1  3.546  4.5345  1.9195
>>> # X2 12.332 15.9820 21.6860
>>> # X3  4.122  9.4835 16.3945
>>>
>>> Los totales (por filas y columna, todos fijos) son los siguientes
>>>
>>> (TotalColumna <- colSums(m))
>>> (TotalFila <- rowSums(m))
>>>
>>> Si procedo haciendo
>>>
>>> m2 <- round(m, 0)
>>> m2
>>>
>>> es claro que los totales fila y columna no se mantienen
>>>
>>> colSums(m2)  # columna
>>> rowSums(m2)  # fila
>>>
>>> Alguna idea de como efectuar el redondeo?  Muchisimas gracias de
>>> antemano.
>>>
>>> Saludos,
>>> Jorge Velez
>>>
>>>         [[alternative HTML version deleted]]
>>>
>>> ______________________________**_________________
>>> R-help-es mailing list
>>> R-help-es@r-project.org
>>> https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es>
>>>
>>>
>>
>>
>> --
>> Jorge Ayuso Rejas
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________**_________________
>> R-help-es mailing list
>> R-help-es@r-project.org
>> https://stat.ethz.ch/mailman/**listinfo/r-help-es<https://stat.ethz.ch/mailman/listinfo/r-help-es>
>>
>
>

	[[alternative HTML version deleted]]

