1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| v <- c(118080, 130195, 199047, 84722, 97613, 214886)
##################################################
## Identification des différentes
## combinaisons possibles :
## Toutes les combinaisons d'indices (d'affectation à un des trois vecteurs) :
combinaisons <- combn(rep(1:3, each=length(v)), length(v))
dim(combinaisons)
## On ne conserve que les combinaisons contenant les trois indices :
combinaisons <- combinaisons[ , apply(combinaisons,
2,
function(x)
{
length(unique(x)) >= 3
})]
combinaisons <- unique(combinaisons, MARGIN=2) # Et on supprime les doublons.
dim(combinaisons)
##################################################
## Différents critères à minimiser...
## (1) Carré des écarts à la moyenne (mu) :
mu <- sum(v)/3 # Moyenne de la somme par vecteur.
comb.critere <- apply(combinaisons,
2,
function(IND, v, mu)
{
sum(tapply(v, IND, # Somme...
function(x, mu)
{
(sum(x) - mu)^2 # ...du carré des écarts à la moyenne
}, mu=mu))
}, v=v, mu=mu)
## (2) Calcul de la somme((distances entre sommes) au carré) pour chaque combinaison :
comb.critere <- apply(combinaisons,
2,
function(IND, v)
{
sum(dist(tapply(v, IND, sum))^2)
}, v=v)
## => visiblement équivalent à (1) (à vérifier de façon formelle) mais plus compact !
## (3) écart entre min et max :
comb.critere <- apply(combinaisons,
2,
function(IND, v)
{
diff(range(tapply(v, IND, sum)))
}, v=v)
##################################################
## Identification de la combinaison optimale :
## Indice de la (première) combinaison qui minimise le critère :
comb.optim <- which.min(comb.critere)
## Combinaison correspondante :
combinaisons[ , comb.optim]
## Et les sommes correspondantes.
tapply(v, combinaisons[ , comb.optim], sum) |
Partager