Dans la littérature, vos « règles faibles » sont généralement appelés contraintes souples, par opposition aux contraintes dures qui doivent être remplies. Comme déjà mentionné dans les commentaires, les contraintes souples sont souvent traitées en introduisant une fonction de coût . Chaque contrainte souple violée apporte un certain coût à la valeur totale de la fonction de coût. Une solution bonne/optimale peut alors être trouvée en recherchant une solution qui réduit/minimise le coût total.
En Prolog, vous pouvez implémenter ceci via le code qui calcule toutes les solutions, y compris toutes les combinaisons de contraintes souples satisfaites et insatisfaites. Avec chaque solution, vous calculez la valeur associée de la fonction de coût.
Voici un exemple. Comme c'est souvent le cas dans la pratique, la fonction de coût a plusieurs composants. Dans ce cas, il est constitué des coûts associés aux chambres individuelles, plus une pénalité lorsque les chambres consécutives ne sont pas égales.
solution([Room1,Room2], TotalCost) :-
Rooms = [a-90, b-50, c-20, d-70], % Room-Cost data
member(Room1-Cost1, Rooms), % select Room1
member(Room2-Cost2, Rooms), % select Room2
prefer_equal(Room1, Room2, Penalty), % penalty for different rooms
Room2 \= c, % some additional constraint
TotalCost is Cost1+Cost2+Penalty. % cost function
prefer_equal(R, R, 0). % no penalty if equal
prefer_equal(R1, R2, 30) :- R1\=R2. % penalty if not equal
Ce prédicat donne 12 solutions alternatives avec des coûts allant de 100 à 190. Les détails sur la façon de mieux obtenir d'ici à une solution optimale dépend un peu de votre système Prolog. Dans ECLiPSe vous procédez comme suit:
?- branch_and_bound:minimize(solution(Rooms, Cost), Cost).
Found a solution with cost 180
Found a solution with cost 170
Found a solution with cost 100
Rooms = [b, b]
Cost = 100
Yes (0.00s cpu)
Cela devrait illustrer l'idée générale. Malheureusement, cette technique n'est pas vraiment évolutive lorsqu'elle est utilisée avec Prolog clair, car elle peut augmenter considérablement l'espace de recherche. Il est donc généralement utilisé avec résolution de contraintes techniques, tel que mis en œuvre dans un certain nombre de systèmes Prolog modernes.
Il s'agit d'une question très générale et je crains que cela doive être fermé. Si vous montrez du code et le problème que vous rencontrez, il serait beaucoup plus facile de répondre. –
Je peux ajouter du code plus tard, mais comme il ne gère pas les règles faibles, il ne sera pas particulièrement utile. J'ai indiqué le problème que j'ai dans le texte (paragraphes 2 et 3) - n'est-ce pas clair pour vous? – PeterB
Non, apparemment pas clair pour moi. Il y a beaucoup trop de façons de réaliser ce que vous voulez. Le plus simple est simplement de profiter du non-déterminisme de Prolog et de permettre des solutions multiples. Mais sans code et une déclaration claire de ce que votre entrée est et ce que vous attendez tout ce que vous pouvez obtenir sont des opinions et des suggestions, ou quelqu'un miraculeusement prendre le temps de coder une solution complète basée sur une question vaguement libellée. –