Bonjour,
Après trois heures de recherches infructueuses sur sourceforge, freshmeat et google, je me retourne vers le forum.
Je cherche un logiciel qui pemettrait de remplir un tableau à partir de contraintes fixées sur les cellules.
Par exemple:
En entrée, je donne:
\ABCDE
a
b
c
somme de la ligne a = 19
somme de la colonne A=10
aB=3
pas de 5 sur la ligne a
chaque éléments de chaque ligne est unique
bE=5
cD différent de 2
En sortie, parmi les possible, le programme me donne:
\ABCDE
a13249
b78965
c21364
Ce que j'ai trouvé de plus proche, c'est FET, pour générer des horaires dans une école:
http://www.lalescu.ro/liviu/fet/
Mais j'aimerais trouver quelque chose de plus flexible.
# Programmation par contraintes
Posté par tgl . Évalué à 5.
Tu trouveras des solveurs pour différents langage de programmation :
- en programmation logique, tu en as d'intégrés dans pas mal de Prologs, genre dans GNU Prolog [1], Ciao Prolog [2] (libre aussi, et perso je l'aime bien), ou encore Eclipse Prolog [3] (excellent, mais pas complètement libre, ça dépend des morceaux). Je sais plus si y'en a dans SWI Prolog, je le connais à peine.
- en programmation impérative, ça existe sous forme de bibliothèque pour différents langages : C++ mais j'en n'ai plus de nom en tête, Python [4,5], et probablement bien d'autres.
En gros, comme le nom l'indique, c'est un mode de programmation qui consiste (essentiellement) à déclarer des contraintes liants entre elles les valeurs de variables. À la syntaxe prêt, ton énnoncé là haut est un programme (désolé les puristes pour les affreuses simplifications que je vais faire). Il est exécuté par une moulinette qui à l'aide des contraintes réduit les domaines de valeurs possibles des variables, pour converger vers une/des solution(s).
C'est un peu comme quand tu joues au Sudoku : de voir qu'il y a déjà un 9 dans une case te permet d'exclure cette valeur pour les autres de la même ligne ou colonne, et pour le reste du carré, ce qui te permet de déduire la valeur d'une autre case qui n'avait plus beaucoup de possibilité, et elle en influence une autre encore, etc. ; les règles du Sudoku sont en fait un ensemble de contraintes, et l'on raisonne avec de la même façon que fonctionnent ces solveurs, en cherchant à en tirer toutes les conséquences possibles pour arriver à l'unique solution. Évidemment, au Sudoku comme en programmation par contrainte, l'exploitation immédiate et un peu triviale des contraintes directes entre les variables ne suffit pas forcement à aboutir. C'est là qu'intervient l'énumération bourrine des valeurs, qui est possible puisque leur domaine est fini : on prend par exemple une case qui peut valoir soit 2 soit 5, on fait l'hypothèse qu'elle vaut 2, et on voit jusqu'où ça peut nous mener ensuite (à une solution, ou à un échec).
Si tu googles "programmation contraintes", tu trouveras pas mal de cours (c'est au niveau maitrise ou assimilé qu'on enseigne ça souvent), plutôt orientés Prolog en général ("programmation logique avec contraintes" donc), et qui devraient t'aider à t'y mettre sans trop de peine.
Amuses toi bien, tu verras que c'est vraiment un mode de programmation extrêmement plaisant, concis, et efficace, enfin pour les problèmes qui s'y prêtent.
[1] http://pauillac.inria.fr/~diaz/gnu-prolog/
[2] http://clip.dia.fi.upm.es/Software/Ciao/
[3] http://www.icparc.ic.ac.uk/eclipse/
[4] http://www.logilab.org/projects/constraint
[5] http://codespeak.net/~niemeyer/constraint/
[^] # Re: Programmation par contraintes
Posté par tgl . Évalué à 3.
[^] # Re: Programmation par contraintes
Posté par Tom D . Évalué à 2.
Je verrai ce que je peux en faire, mais ça m'aide déjà beaucoup.
J'aurais peut-être dû préciser que la raison pour laquelle je cherche un tel soft, c'est pour m'aider dans des prises de décisions complexes incluant un grand nombre de facteurs dans mon boulot.
Si c'est réellement du niveau 1er lab de TD, je devrais effectivement pouvoir faire ça moi-même.
Tom
[^] # Re: Programmation par contraintes
Posté par tgl . Évalué à 2.
[^] # Re: Programmation par contraintes
Posté par Tom D . Évalué à 2.
Un exemple concret, comment distribuer le travail entre 9 ingénieurs sur une semaine.
9 ingénieurs
10 demi journées
5 domaines à couvrir
contraintes "hard"
chaque ingénieur peut couvrir 3 domaines définis (selon ses compétences)
chaque domaine doit être couvert par un ingénieur chaque demi-journée (ça s'appelle un shift)
les ingénieurs auront chacun un nombre équivallent de shifts (plus ou moins 1). 6 par semaine environ
un ingénieur peut être absent (1 ou plusieurs jours) et donc ne pas prendre de shifts ces jours-là
contraintes "soft"
certains ingénieurs préfèrent les shifts du matin, d'autres, l'après-midi
certains ingénieurs préfèrent regrouper les shifts (couvrir plusieurs domaines sur une matinée), d'autres préfèrent les disperser
au moins deux jours sans shift par ingénieur
pas plus de la moitié des shifts d'une semaine pour un ingénieur ne devraient couvrir le même domaine
Toutes les contraintes ne seront pas facile à formuler, mais d'après ce que tu me dis, Prolog serait la voie à explorer
Encore merci,
Tom
[^] # Re: Programmation par contraintes
Posté par norbs . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.