Bonjour les zestotifiques !
Pour un petit problème que j’ai imaginé, je dois générer des matrices qui respectent des contraintes sur chaque ligne et chaque colonne. J’avais une idée d’algorithme qui me semblait marcher mais impossible de le mettre en oeuvre en python.
Je viens donc vous quémander de l’aide, car sinon je vais rester bloqué et je n’ai pas envie d’écrire ces matrices à la main.
Mon problème donc, je dispose de mes contraintes (toujours des nombres entiers strictement positifs) :
- un tableau de contraintes pour les lignes : [l0,l1...lm−1]
- un tableau de contraintes pour les colonnes : [c0,c1...cn−1]
- avec m>=n
Et j’aimerais générer une matrice telle que:
- Pour chaque ligne i,la somme de la ligne i est égale à li
- Pour chaque colonne i, la somme de la colonne i est égale à ci
Ah oui, il faudrait que les éléments de ma matrice semblent aléatoires, donc pas juste une suite de 0 puis li par exemple.
Pour ça j’avais pensé à l’algorithme suivant :
Pour i=0 à m-1:
l' <- séquence aléatoire de m-1-i éléments avec leur somme = l_i
matrice[i][i:] = l'
contrainte_colonne = contrainte_colonne - l'
c' <- séquence aléatoire de n-2-i éléments avec leur somme = c_i
matrice[:][i+1:] <- c'
contrainte_ligne = contrainte_ligne - c'
Malheureusement mon implémentation ne fonctionne pas à cause de mes séquences qui ne font pas la même taille entre autres.
Voici un extrait en python 3 avec numpy :
for i in range(m):
line = np.array(random_ints_with_sum(contrainte_ligne[i],max_length=m-1-i))
mat[i][i:] = line
contrainte_ligne -= line
col = np.array(random_ints_with_sum(contrainte_colonne[i],max_length=n-2-i))
mat = mat.transpose()
mat[i][i+1:] = col
mat = mat.transpose()
contrainte_colonne -= col
Est ce que vous auriez des idées pour améliorer cet algorithme / le corriger / en trouver un qui marche mieux ?
Merci d’avance !