1

2D ビン パッキング用の FNF アルゴリズムを作成しようとしていますが、メソッドを呼び出すと、間違った結果が得られます。助けてください、問題が見つかりません。

private void FFF()
{
    int xmax = 0;
    int movex = 0;
    int movey = 0;
    int maxH = RectBin.Height;
    int maxW = RectBin.Width;
    List<Rectangle> rectsToDraw = new List<Rectangle>();
    for (int i = 0; i < Shapes.Count; i++)
    {
        int height = Shapes[i].Height;
        int width = Shapes[i].Width;
        if ((movey + height) <= maxH)
        {
            rectsToDraw.Add(new Rectangle(movex, movey, width, height));
            movey = movey + height;
            if (xmax < movex + width)
            {
                xmax = movex + width;
            }
        }
        else if ((xmax + width) <= maxW)
        {
            movex = xmax;
            rectsToDraw.Add(new Rectangle(movex, 0, width, height));
            movey = height;
            xmax = movex + width;
        }
        else
        {
            Debug.Write("Message1");
            break;
        }
    }

    for (int j = 0; j < rectsToDraw.Count; j++)
    {
        Debug.Write(rectsToDraw[0]);
    }
    r2d = rectsToDraw;
}

rectBin はパブリックな四角形 (0,0, 300, 190) で、Shapes[] はパブリックな四角形のリストです。ここで使用する前に、次の方法でシェイプを並べ替えます。

private void button9_Click(object sender, EventArgs e)
{
    Shapes.Sort((x,y) => ((y.Width.CompareTo(x.Width))));
}

デバッグ コンソールで FNF を開始すると、14 個のアイテムを取得する必要があるときに、リスト アイテムとメッセージ 1 (形状の最初のアイテムであり、これは繰り返されるべきではありません) が繰り返し表示されます。

明確にするために、私はアルゴリズムを探しているのではなく、oblici の最初の項目が rectsToDraw に 4 回コピーされ、ループが終了するように、どこで間違いを犯したかを教えてくれる人を探しているだけです...

入力: {X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{X=0,Y=0,幅=47 ,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=38,高さ=47}{X=0,Y=0,幅= 33,高さ=45}{X=0,Y=0,幅=22,高さ=39}{X=0,Y=0,幅=0,高さ=0}

出力: {X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151 ,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅= 167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0 ,幅=115,高さ=52}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y= 0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y =0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=231,高さ=66}{X=0, Y=0、幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0 ,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y= 0,幅=58,高さ=46}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X=0,Y =0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0, Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{X=0 ,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X= 0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X =0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{ X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=231,高さ=66} {X=0,Y=0,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40 }{X=0、Y=0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0 ,Y=0,幅=58,高さ=46}{X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X= 0,Y=0,幅=38,高さ=47}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ=61}{X =0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{ X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46} {X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=38,高さ=47 }{X=0,Y=0,幅=33,高さ=45}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0,幅=167,高さ= 61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y=0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y=0,幅=58,高さ=46}{X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0,Y=0,幅=38 ,高さ=47}{X=0,Y=0,幅=33,高さ=45}{X=0,Y=0,幅=22,高さ=39}{X=0,Y=0,幅=231,高さ=66}{X=0,Y=0 ,幅=167,高さ=61}{X=0,Y=0,幅=151,高さ=47}{X=0,Y=0,幅=130,高さ=40}{X=0,Y= 0,幅=119,高さ=39}{X=0,Y=0,幅=115,高さ=52}{X=0,Y=0,幅=72,高さ=53}{X=0,Y =0,幅=58,高さ=46}{X=0,Y=0,幅=47,高さ=32}{X=0,Y=0,幅=41,高さ=47}{X=0, Y=0,幅=38,高さ=47}{X=0,Y=0,幅=33,高さ=45}{X=0,Y=0,幅=22,高さ=39}{X=0 ,Y=0,幅=0,高さ=0}高さ=39}{X=0,Y=0,幅=0,高さ=0}高さ=39}{X=0,Y=0,幅=0,高さ=0}

4

2 に答える 2

2

他にも問題があるかもしれませんが、このコードは次のように思います。

for (int j = 0; j < rectsToDraw.Count; j++)
{
    Debug.Write(rectsToDraw[0]);
}

次のようにする必要があります。

for (int j = 0; j < rectsToDraw.Count; j++)
{
    Debug.Write(rectsToDraw[j]);
}

( に変更Debug.Write(rectsToDraw[0]);) Debug.Write(rectsToDraw[j]);

于 2012-09-12T03:22:03.507 に答える
0

気にしないで、なんとか修正しました...コードは次のとおりです。

private void FNF()
    {
        int XMX = 0;
        int moveX= 0;
        int moveY = 0;
        int MH = RectBin.Height;
        int MW = RectBin.Width;
        int c1 = Items.Count;
        rectsToDraw = new List<Rectangle>();

        for(int i = 0; i < c1; i++)
        {
            int height = Oblici[i].Height;
            int width = Oblici[i].Width;
            if(((moveY + height) <= MV)&&((moveX+width)<=MW))
            {
                rectsToDraw.Add(new Rectangle(moveX, moveY, width, height));
                moveY = moveY + height;
                if (XMX < moveX + width)
                {
                    XMX = moveX + width;
                }
            }
            else if((XMX + width) <= MW)
            {
                moveX = XMX;
                rectsToDraw.Add(new Rectangle(moveX, 0, width, height));
                moveY = height;
                XMX = moveX + width;
            }
            else
            {
                Debug.Write("Doesn't fit.");
                break;
            }
        }
        for (int j = 0; j < rectsToDraw.Count; j++)
        {
            Debug.Write(rectsToDraw[j]);
        }
    }

もう一度書いて、いくつかの名前を変更しました(理由はありません)... とにかくありがとう....

于 2012-09-12T17:34:44.407 に答える