2

私と友人は、CLP 問題を解決するプログラムを書いています。解決策を最適化するために最小化を使用したいのですが、sum(P,#=,S) から取得した数値が 2 つの数値の間 (たとえば 5..7) であると言い続けるため、うまくいきません。ここから数値を抽出したり、何らかの方法で操作したりする良い方法を見つけることができなかったため、あなたの助けを求めています.

この問題は、リストの各要素が 0 から 1 の間でなければならないという gen_var メソッドから発生しているようです。そのため、適切に設定されずに「0..1」として出力される数値があります。

「5..7」のような数値を取得しても最小化を使用する方法や、その数値を操作して 5 のみを取得する方法はありますか? S (リスト内の要素の合計) は、最小化しようとしているものです。

gen_var(0, []).
gen_var(N, [X|Xs]) :-
        N > 0,
        M is N-1,
        gen_var(M, Xs),
    domain([X],0,1).

find([],_).
find([H|T],P):- match(H,P),find(T,P).

match(pri(_,L),P):-member(X,L), nth1(X,P,1).

main(N,L,P,S) :- gen_var(N,P), minimize(findsum(L,P,S),S).
findsum(L,P,S):- find(L,P), sum(P,#=,S).
4

1 に答える 1

4

SWI-Prolog CLP(FD) に適応するために、コードを少し変更しましたが、うまくいくようです (ちょっと)。しかし、最小値は常に 0 だと思います!

:- use_module(library(clpfd)).

gen_var(0, []).
gen_var(N, [X|Xs]) :-
    N > 0,
    M is N-1,
    gen_var(M, Xs),
    X in 0..1 .

find([], _).
find([H|T], P):-
    match(H, P),
    find(T, P).

match(pri(_,L),P):-
    member(X, L),
    nth1(X, P, 1).

findsum(L,P,S) :-
    find(L, P),
    sum(P, #=, S).

main(N, L, P, S) :-
    gen_var(N, P),
    findsum(L, P, S),
    labeling([min(S)], P).

この出力サンプルは、期待される結果の正しいサブセットですか?

?- main(3,A,B,C).
A = [],
B = [0, 0, 0],
C = 0 ;
A = [],
B = [0, 0, 1],
C = 1 ;
于 2011-09-23T21:29:07.903 に答える