1

私は192x3の行列、order(192 x 3)を持っています:

order(:、1)とorder(:、2)は両方とも1〜16の繰り返し値を含み、order(:、3)は1と2の繰り返し値を含みます。これ以上の繰り返しを防ぎながら、マトリックスをシャッフルする必要があります。最後の列に同じ値が3つ以上あるため、order(:、3)に1または2の繰り返しが3回を超えて表示されないようにする必要があります。

これは私が持っているもので、マトリックスの小さいバージョンでは問題なく機能しましたが、少し大きいマトリックスでスタックしているようです。

not_good = true;

while not_good

    not_good = false;

    order = Shuffle(order);

    % returns an array of 1s and 0s indexing the position of the values for 1 and 2
    R1 = order(:, 3) == 1;
    R2 = order(:, 3) == 2;

    % checks for repeats, returns 1 if repeats are present
    rep_test1 = any(diff([1; find(R1)])>3);
    rep_test2 = any(diff([1; find(R2)])>3);

    if rep_test1 > 0 || rep_test2 > 0
        not_good = true;
    end
end

コメントは大歓迎です。ありがとう。

4

2 に答える 2

1

あなたがすでにあなたの条件を満たす取り決めを見つけたとしたら。しかし、そのような取り決めを構築することは可能であるはずです。

棄却サンプリングでシャッフルします。

擬似コードは次のようになります。

function shuffled = shuffle(orig)
for i=1:numShuffles
  [i1,i2] = randomIndices;
  tmp = shuffled with permuted lines i1 and i2 
  test if matrix is still valid
  if valid shuffled=tmp;
end
于 2012-09-21T08:39:15.890 に答える
0

関数の実装方法を低レベルで制御できる場合Shuffleは、問題固有の実装を行うのが最も効率的です。たとえば、解決できない問題をすぐに拒否し、ループ内の出力行列への新しい追加がその上の2つのエントリと等しい場合は、それを拒否するバージョンを作成します。

しかし、あなたがこのレベルのコントロールを持っていないと仮定すると、私は@Oliに同意する必要があります。コードに固有の欠陥はなく、問題が完全に解決可能かどうかを確認するためのチェックが欠けているだけです。

ただし、大きな欠点があります。たとえば、

order(:,3).' = [1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 ...]

aの後に3つ以上連続して取得する可能性はShuffle非常に高くなります。これは、ループが結果を出す前に、ループを何度も実行する必要があることを意味します。残念ながら、問題が解決可能であるが、この場合のように「解決するのが難しい」場合、あなたができることはほとんどありません。

于 2012-09-21T08:36:22.920 に答える