2016-03-22 6 views
1

Avoir écrit des solveurs de logique de base (Sudoku et al) J'essaye d'apprendre plus de vrai Prolog en écrivant un système d'allocation de lit d'auberge. Les règles "Must" fonctionnent (par exemple "La chambre contient 3 personnes", "X doit partager une chambre avec Y") mais j'ai un problème avec les règles "Devraient" être cassées (par exemple "Les gens devraient rester dans le même lit pour leur séjour - mais peut déplacer des chambres si nécessaire ").Règles faibles dans Prolog

Est-ce que Prolog peut gérer des règles faibles lorsque la logique n'est pas binaire? J'ai rencontré des extensions de programmation probabilistes, mais je ne vois pas cela comme un problème probabiliste. Si ce n'est pas le cas, quelles approches/langues devrais-je examiner à la place?

Sinon, est-ce la façon dont j'ai réglé le problème, et je dois penser à la continuité du soir au soir alors que les invités vont et viennent différemment?

+0

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. –

+0

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

+0

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. –

Répondre

6

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.