私はPrologを初めて使用しています。これは先週の金曜日に起きた現実世界の問題で、これはCS宿題ではないと私に信じています。名刺印刷 - 一種のナップザックタスク
名刺を印刷したい場合は、900枚(1枚あたり9枚のカードで100枚)のブロック単位で印刷することができます。誰のためのカードもいくつかのブロックに分散してはいけません。人々はEG、カードの異なる量を命じ:
% "braucht" is german and means "needs"
braucht(anton,400).
braucht(berta,200).
braucht(claudia,400).
braucht(dorothee,100).
braucht(edgar,200).
braucht(frank,400).
braucht(georg,100).
私は900枚の名刺の適切なブロックを見つけるために、次の定義をまとめ:
block(0,[]).
block(N,[H|T]) :-
braucht(H,Nh),
% \+(member(H,T)),
D is N - Nh,
D >= 0,
block(D,T).
これは、カードの人々のブロックの素敵なリストを作成します900枚のカードブロックに一緒にフィットする。しかし、私はコメント行 "+ + member ...."を有効にして、私に "false"を与えても動作しなくなります。しかし、私は誰もそのブロックに何度も出くわしていないことを保証する必要があります。私はここで間違って何をしていますか?
は、私は私のアプローチはかなりナイーブだった、もう1つは、アカウントにプロローグが定義を処理する方法を取るために持っていることがわかります。しかし、今私は先に進むことができます。どうもありがとう! – Patrick
制約プログラミングソリューションはどのように見えるのですか – Sebastian
いくつかの可能性があります。 CPシステムによっては、グローバルナップザックまたはビンの梱包の制約がある場合があります。また、累積スケジューリング制約を使用して、ナップザック問題をモデル化することもできます。 "単純な"制約しかない場合は、リストの可能な要素ごとに1つの変数Bをドメイン[0,1]で設定することができます。すべての要素のB *値の積を合計し、合計を最大容量に制限します。ブール変数にラベルを付けます。 – twinterer