0

私はいくつかの輸送計算をしています。これを理解しようとすると、助けが必要です。基本的に、Length、Width、Heightプロパティを持つ製品の一般的なリストがあります。

簡単に商品を見て、3つの物件すべての中で最大の価値を見つけたいと思います。ここから、いくつかの計算を行い、製品の数に基づいてボックスのサイズを計算できます。

私の最初の考えは、3つの配列を作成し、それぞれの最大数を見つけることでした。私が知らなかったもっと簡単な方法やもっとクールな方法があるかどうかを知りたかっただけです。

ありがとう!

4

3 に答える 3

1

配列の配列のように聞こえます。データソース(SQL Server、XMLなど)から各要素(ボックス)を読み取るときに、3メンバーの配列を作成し、サイズ順に属性を挿入します。次に、3メンバー配列を配列の配列に追加します。次に、LINQまたはその他の関数を使用して、配列の配列を1番目、2番目、または3番目のメンバーで並べ替えることができます。

Box1,2,2,3
Box2,5,10,1
Box3,8,4,7

になる:

{  {10,5,1},  {8,7,4},  {3,2,2}  } // First

また

{  {8,7,4},  {10,5,1},  {3,2,2}  } // Second

また

{  {8,7,4},  {3,2,2},  {10,5,1}  } // Third

次に、最初の要素、2番目の要素などで配列を並べ替えることができます。

LINQを使用すると、1つのステートメントで配列の配列を簡単に作成できますが、正確にどのように作成するかはデータソースによって異なります。Box3つのパラメーター、、、LengthおよびWidthで名前が付けられたクラスHeightがあり、このクラスのインスタンスを含む厳密に型指定されたコレクションを作成したと仮定します。

class BoxSorter {

    public IEnumerable<Box> Boxes {
        get;
        private set;
    }

    class Box {
        public double Height {
            get;
            set;
        }

        public double Width {
            get;
            set;
        }

        public double Length {
            get;
            set;
        }
    }

    public void Initialize() {

        this.Boxes = new List<Box>( new Box[] { 
            new Box() { Height = 2, Length = 2, Width = 3 },
            new Box() { Height = 5, Length = 10, Width = 1 },
            new Box() { Height = 8, Length = 4, Width = 7 }
        } );

    }

    public void Sort() {

        var l_arrayOfArrays =
            this.Boxes.Select(
            // Create an array of the Height, Length and Width, then sort the array elements (largest to smallest)
                b => new double[] { b.Height, b.Length, b.Width }.OrderByDescending( v => v ).ToArray()
            );

        var l_dimension1 =
            l_arrayOfArrays.OrderByDescending(
            // Sort the array of arrays by the first (and largest) dimension
                a => a[0]
            );

        var l_dimension2 =
            l_arrayOfArrays.OrderByDescending(
            // Sort the array of arrays by the second (and middle) dimension
                a => a[1]
            );

        var l_dimension3 =
            l_arrayOfArrays.OrderByDescending(
            // Sort the array of arrays by the third (and smallest) dimension
                a => a[2]
            );

    }

}
于 2012-09-07T21:38:07.360 に答える
0

3つの数値の最小値、最大値、および中間値を見つけるのに本当に問題がありますか?


4 x 4 x 4
8 x 8 x 2が2つしかないかのように、各列の最小値を取得することは意味がありません
。最小値は4 x 4 x 2で、最大値は8 x 8x4であると誤って結論付けます。

        double[] dimensions;

        dimensions = new double[] {8,7,7};
        Array.Sort(dimensions);
        System.Diagnostics.Debug.WriteLine(dimensions[0]);
        System.Diagnostics.Debug.WriteLine(dimensions[1]);
        System.Diagnostics.Debug.WriteLine(dimensions[2]);

        dimensions = new double[] { 7, 9, 8 };
        Array.Sort(dimensions);
        System.Diagnostics.Debug.WriteLine(dimensions[0]);
        System.Diagnostics.Debug.WriteLine(dimensions[1]);
        System.Diagnostics.Debug.WriteLine(dimensions[2]);

PS最適なボックスサイズとアイテムの梱包方法が必要な場合は、単純な計算よりもはるかに複雑であるというanathonlineに同意します。

于 2012-09-07T20:50:52.147 に答える
0

おそらくあなたがする必要があるのは、箱のサイズのセットを用意し、次にそれらをそのサイズの1つまたは複数の箱に最適に梱包することです。

これは2Dケース用のシンプルなパッカーであり、これを3Dに拡張できます。

あなたのアルゴリズムは次のようになります

    foreach box in boxes (ordered by decreasing volume)
        while there are unpacked items
            if box has space
                pack item
            else
                box = another box of the same size

これで、最後のボックスの未使用スペースをどうするかを決めることができます。すべてを選んで小さいボックスを試すか、すべてのアイテムをすべてのサイズのボックスに詰めてから、ボックスの数が最も少なくなる組み合わせを選んでください。

于 2012-09-07T19:40:20.663 に答える