1

私は次のコードを持っています:

while rounds<=5
    fprintf('Rolling the dice...\n');
    roll=randi(6,1,5);
    roll=sort(roll);
    fprintf('You rolled:');
    disp(roll);
    rollCount=rollCount+1;

    for x=1:2:17
        y=all(ismember(roll,rule{x}))
        disp(ismember(roll,rule{x}));

        z=all(ismember(rule{x},roll))
        disp(ismember(rule{x},roll));
        rounds=rounds+1;
    end
end 

すべきことは、roll 配列を rule{x} 配列と比較し、一致するかどうかを教えることです。一致しない場合は、ロール配列のどのインデックスがルール配列と一致しないかを教えてくれるはずです。ただし、正しく機能していません。ロールの例が [2 2 3 5 5] で、ルール {x} が [1 2 3 4 5] だとします。

私が望む出力は[0 1 1 0 1]を持つ配列ですが、yから得られるものは[1 1 1 1 1]で、zは[0 1 1 0 1]です。これは正しい出力のように思えるかもしれませんが、ルールを [5 5 5 5 5] に変更すると、間違った [1 1 1 1 1] が得られます。

これは、私が書いている Yahtzee ゲーム用です。ロールはサイコロのロールであり、ルールは私が一致させようとしているものであるため、一致させるために再ロールする必要があるものを確認できます.

編集: dspyz のコードを使用して、関数を書きました:

function[scoreCode]=ForwardChaining(rollFunc,ruleFunc)
temp=histc(rollFunc,1:6);

for x=1:2:11
    if (ruleFunc{x}<=temp)
        scoreCode=ruleFunc{x+1};
        break;        
    else scoreCode=0;
    end    
end

メイン関数はこれを次のように呼び出します。

c= ForwardChaining(roll,rule);
    if c == 12;
        break;
    end

しかし、何らかの理由で、100,000回の反復の後でも停止せず、意図したとおりに機能していないと私は考えています.

4

2 に答える 2

1

サイコロは 1 から 6 までの値しか取ることができないため、代わりに各ロールのヒストグラム カウントを生成してみませんか。

つまり、ロール v の (行) ベクトルを取り、次のように言います。

a = histc(roll, 1:6);

ルールが a のサブセットであるかどうかを確認したい場合 (ルール自体も各数値のカウントの観点から表現されている場合)、次のことを確認できます。

rule <= a

これが 6 つのインデックスすべてで真の場合、ロールはルールを満たします。

明確にするために:

1 年生についてはわかりませんが、たとえば [1, 1, 2, 4, 5] のように、すべてが 1 から 6 までの (繰り返される可能性がある) 値のセットが与えられた場合、どのように数えることでこれを表すことができますか? 1から6までの各数字の多くが存在します。この例では:

1: 2
2: 1
3: 0
4: 1
5: 1
6: 0

次に、これを同じ形式のルールと比較しますが、要素が少ない可能性があります。たとえば、[1、2、3、4]。このルールのカウントは次のようになります。

1: 1
2: 1
3: 1
4: 1
5: 0
6: 0

[1, 2, 3, 4] が [1, 1, 2, 4, 5] のサブセットであるかどうかを確認するには、[1, 2, 3, 4] のカウントがすべてまたは [1, 1, 2, 4, 5] のカウントに等しい。つまり、次のことを確認したい

1: 1 <= 2
2: 1 <= 1
3: 1 <= 0
4: 1 <= 1
5: 0 <= 1
6: 0 <= 0

これらはすべて 3 を除いて真であるため、[1 2 3 4] は [1 1 2 4 6] のサブセットではないことがわかります。これには 3 が含まれていないためです。

しかし、6 つの不等式がすべて真である場合、次のようになります。

元。[1 3 3 3 5] に [3 3 3] が含まれているかどうかを知りたい場合は、

1: 0 <= 1
2: 0 <= 0
3: 3 <= 3
4: 0 <= 0
5: 0 <= 1
6: 0 <= 0

これは本当です

編集: MATLAB のドキュメントを見ると、 histc への引数をソートする必要があると書かれています

編集 2: おっと、それは間違っています。2 番目の引数をソートする必要があると書かれています。それを元に戻します。

于 2013-03-19T01:18:05.470 に答える
0

あなたの配列が正確に何をしているのかはわかりませんが、[2 2 3 5 5] があり、ルール {x} が [1 2 3 4 5] の場合、単純に次のようにします。

[2 2 3 5 5] == [1 2 3 4 5] は [0 1 1 0 1] または A=(roll==rule) のようなものを取得します

于 2013-03-19T00:39:40.903 に答える