Si je choisis une similitude de 2 pour la distribution [3,0,1,0] je dois trouver toutes les distributions qui ont deux distributions en commun, par exemple [1,0,1,2], [2,2,0,0],[1,1,1,1],etc.
GaBuZoMeu a écrit:Bonsoir,Si je choisis une similitude de 2 pour la distribution [3,0,1,0] je dois trouver toutes les distributions qui ont deux distributions en commun, par exemple [1,0,1,2], [2,2,0,0],[1,1,1,1],etc.
Je ne comprends pas ce que tu appelles "similitude". Je pensais qu'il s'agissait du nombre de places où figure le même nombre (genre MasterMind), mais ça ne colle pas avec tes exemples. Comment trouves-tu "une similitude de 2" entre [3,0,1,0] et [1,1,1,1] ???
Peux-tu être plus clair ?
GaBuZoMeu a écrit:Ah, donc le nombre de similitudes entre et est la somme des ?
GaBuZoMeu a écrit:, c'est tout simplement le minimum des deux entiers.
Le minimum de 3 et 1, c'est 1 ; le minimum de 0 et 1, c'est 0 ; le minimum de 1 et 1, c'est 1 ; le minimum de 1 et 0, c'est 0. La somme des minima est 2.
Obwil a écrit:Je cherche une fonction mathématique qui puisse, à partir d'une distribution ref et d'une similitude z, trouver toutes les distributions qui correspondent (et donc celles qui ne lui correspondent pas).
GaBuZoMeu a écrit:Qu'appelles-tu "fonction mathématique" ?? Je ne vois pas autre chose qu'une procédure informatique pour faire ce travail. On peut chercher à l'optimiser.
function SETsimilitudes_ttes_combi($combi_ref, $liste_distri, $simili_filtre = null){
// $combi_ref : la distribution ref
// $liste_distri : les distributions pour lesquelles on veut vérifier le nombre de similitudes avec la distribution ref
// $simili_filtre : si on veut chercher une similitude en particulier, et donc filtrer les distributions en fonction d'elle, on indique sa valeur
$similitudes_ttes_combi = [];
$combi_simili_filtre = [];
foreach($liste_distri as $key1 => $repartition){
foreach($repartition as $key2 => $combi){
$similitudes_ttes_combi[$key1][$key2] = 0;
foreach($combi as $key3 => $nb){
if($combi_ref[$key3] > 0 && $nb > 0){
if($combi_ref[$key3] <= $nb){
$similitudes_ttes_combi[$key1][$key2] += $combi_ref[$key3];
}
else{
$similitudes_ttes_combi[$key1][$key2] += $nb;
}
}
}
if(is_int($simili_filtre)){
if($similitudes_ttes_combi[$key1][$key2] == $simili_filtre){
$combi_simili_filtre[] = $combi;
}
}
}
}
if(is_int($simili_filtre)){
return $combi_simili_filtre;
}
else{
return $similitudes_ttes_combi;
}
}
GaBuZoMeu a écrit:Je ne parle pas le php. Je me débrouille avec python, c'est tout.
import itertools
def simil(L,M):
# calcule le nombre de similitudes entre deux distributions
return sum(min(L[i],M[i]) for i in range(len(L)))
def convert_dist(comb,long):
# convertit une combinaison en distribution de longueur long
bord=[-1]+list(comb)+[len(comb)+long]
return [bord[i+1]-bord[i]-1 for i in range(len(bord)-1)]
def cherche(long,car,*conds) :
# cherche les distributions de longueur long sur car caractères
# vérifiant les conditions de similitude conds données sous la forme
# (distribution, nombre de similitudes)
L=[]
combs=itertools.combinations(range(long+car-1),car-1)
for comb in combs:
dist=convert_dist(comb,long)
if all(simil(dist,cond[0])==cond[1] for cond in conds) :
L.append(dist)
return L
%time L=cherche(12,12,([0,1,2,3,0,0,1,1,0,2,1,1],8),\
([2,1,0,1,2,2,0,0,0,1,3,0],7),\
([0,0,3,2,1,1,1,1,2,0,1,0],3))
print(L)
GaBuZoMeu a écrit:Avec la librairie ad hoc python (itertools), et sans se casser la tête, on peut fabriquer une procédure qui va chercher toutes les distributions (de longueur donnée, sur un nombre de caractères donné) qui ont des nombres de similitudes donnés avec des distributions données.
GaBuZoMeu a écrit:Avec la librairie ad hoc python (itertools), et sans se casser la tête, on peut fabriquer une procédure qui va chercher toutes les distributions (de longueur donnée, sur un nombre de caractères donné) qui ont des nombres de similitudes donnés avec des distributions données.
Obwil a écrit:Est-ce que tu penses qu'il est possible d'adapter ta fonction de façon à ce que pour une distribution donnée on puisse récupérer toutes les distributions qui contiennent x valeurs en commun ?
function distributions_possibles($n_valeurs, $x_entrees, $combi_presences = array()) {
if ($n_valeurs == 1) {
$combi_presences[] = $x_entrees;
return array($combi_presences);
}
$combinaisons = array();
// on fait appel à une fonction récursive pour générer les distributions
for ($y = 0; $y <= $x_entrees; $y++) {
$combinaisons = array_merge($combinaisons, distributions_possibles(
$n_valeurs - 1,
$x_entrees - $y,
array_merge($combi_presences, array($y))));
}
return $combinaisons;
}
function check_possibilites($distribution, $similitude){
$all_distri = distributions_possibles(count($distribution), $similitude);
$possibilites = [];
foreach($all_distri as $key => $distri){
$verif = true;
for($x = 0; $x < count($distri); $x++){
if($distri[$x] > $distribution[$x]){
$verif = false;
}
}
if($verif){
$possibilites[] = $distri;
}
}
return $possibilites;
}
GaBuZoMeu a écrit:Que retourne ta procédure ?
Peux-tu donner un exemple d'exécution ?
$distri = [1,0,0,1,3,0,2];
$similitude = 3;
var_dump(check_possibilites($distri, $similitude));
//Output :
array (size=11)
0 =>
0000102
1 =>
0000201
2 =>
0000300
3 =>
0001002
4 =>
0001101
5 =>
0001200
6 =>
1000002
7 =>
1000101
8 =>
1000200
9 =>
1001001
10 =>
1001100
GaBuZoMeu a écrit:OK, merci. Et que fais-tu avec ça ?
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 8 invités
Tu pars déja ?
Identification
Pas encore inscrit ?
Ou identifiez-vous :