0

追加情報:これは私が取り組んでいるゲームプロジェクト用です。

使用可能なスペースの長さを指定して、複数のオブジェクトを(互いに並べて)配置する効率的なランダム化アルゴリズムを作成しようとしています。

問題に直接:長さ= lengthOfAreaの使用可能なスペース、および配置するオブジェクトの数= numObjectsが与えられます。ここで、各オブジェクトの長さは、lengthObject =(lengthOfArea / 2)/numObjectsです。(そのため、オブジェクトが占めるスペースの合計量は、使用可能な長さのスペースの半分になります)。

各オブジェクトの中心位置を探して、その配列を返すことになっています。

これが私の現在の試みです:

public int[] FindObjectPositions(int lengthOfArea, int numObjects, Random random)
  {
    int lengthOfObject = (lengthOfArea / 2) / numObjects;
    int[] positionsPicked = new int[numObjects];
    int minPosition = lengthObject / 2;
    int maxPosition = lengthOfArea - (lengthObject / 2);
    for (int i = 0; i < numObjects; i++)
    {
      int newPosition;
      do 
        {
          newPosition = minPosition + random.Next(maxPosition - minPosition);
        } while (!IsPositionValid(positionsPicked, newPosition, lengthObject));
        positionsPicked[i] = newPosition;
    }
    return positionsPicked;
  }

public bool IsPositionValid(int[] positionsPicked, int newPosition, int lengthObject)
  {
    for (int i = 0; i < positionsPicked.Length; i++)
    {
      if (Math.Abs(positionsPicked[i] - newPosition) <= (lengthObject / 2))
        return false;
    }
    return true;
  }

基本的に私がしていることは、各オブジェクトの有効な位置を常にランダムに見つけていることです。非効率的かどうか疑問に思っています。また、この方法でデッドロックに達する可能性があるのではないかと思います。

4

1 に答える 1

1

これ以上オブジェクトが収まらない構成がある場合、デッドロックが発生する可能性があります。たとえば、30 個のスペースがあり、各オブジェクトが 5 個のスペースの長さである場合、構成は

_ _ _ _ xxxxx _ _ _ _ xxxxx _ _ _ _ xxxxx _ _ _

15 のオープン スペースがあるにもかかわらず、別のオブジェクトに適合する可能性のある場所はありません。


空きスペースがmあり、各オブジェクトに width があるとしますw。デッドロックしない方法の 1 つは、m-w+1数値のリストを生成すること1, 2, ..., m-w, m-w+1です。次に、ランダムに 1 つ選択します。これは、オブジェクトの最も左の位置を表します。w-1次に、その数字の左右の数字を削除します。これは、オブジェクトが幅がw広く、幅の他のオブジェクトがその左のスペースにw収まらないという事実を表しています。w-1

たとえばm = 20w = 3_

1 から 18 までのリストを作成する

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

次に、ランダムに 1 つを選択します。10 を選択するとします。この場合、スペース 10、11、12 はオブジェクトによって埋められ、スペース 8、9 は別のオブジェクトの左端の位置になることはできないため、8 から 12 までの数字を削除します。

1 2 3 4 5 6 7 13 14 15 16 17 18

次に 18 を選択するとします。次に、16-18 を削除します。

1 2 3 4 5 6 7 13 14 15

というように、数字がなくなるまで。


上記の方法ではデッドロックは発生しませんが、別の問題があります。(たとえば) 6 つのオブジェクトを含む構成を作成することは可能ですが、上記の方法では 4 つまたは 5 つのオブジェクトを含む構成しか生成されず、余裕がありません。もう。これを解決するには、オブジェクトのランダムな位置を選択するのではなく、6 つのオブジェクトで空きスペースがいくつあるかを計算し、代わりに空きスペースにランダムなスポットを選択します (上記の方法を使用)。

これにより、必要な数のオブジェクトがランダムに配置され、デッドロックの可能性がなくなります。

于 2012-05-23T22:05:40.793 に答える