예제 #1
0
        private void AddItemToBranchBoundList(BranchBound myB, params int[] myCoeff)
        {
            // Adds a new branch to the Branch & Bound List
            int j = 0;

            for (int k = 0; k < BranchListOfStocks.Count; ++k)
            {
                while (myCoeff[k] > 0)
                {
                    myB.SetOfStocks[j]     = BranchListOfStocks[k].Size;
                    myB.SetOfStocksCost[j] = BranchListOfStocks[k].Cost;
                    --myCoeff[k];
                    ++j;
                }
            }
            BranchBoundList.Add(myB);
        }
예제 #2
0
        private void GetBranchBoundList()
        {
            // A maximum number of Stock sizes is managed by this algorithm. This is a design choice based on the practice.

            float measure;

         /*   try
            {*/
                // 1 Stock
                if (MaxStocksQuantity.Length == 1)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        ++EvaluatedBranchCounter;
                        if (EvaluatedBranchCounter % 500 == 0)
                        {
                           // UpdateStatus();
                        }

                        measure = c1 * BranchListOfStocks[0].Size;
                        if (measure >= TotalItemsSum && measure < BoundValue)
                        {
                            BranchBound bb = new BranchBound();
                            bb.Size = measure;
                            bb.Cost = c1 * BranchListOfStocks[0].Cost;
                            Array.Resize(ref bb.SetOfStocks, c1);
                            Array.Resize(ref bb.SetOfStocksCost, c1);
                            int[] coeff = new int[] { c1 };
                            AddItemToBranchBoundList(bb, coeff);
                        }
                    }
                }

                // 2 Stocks
                if (MaxStocksQuantity.Length == 2)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            ++EvaluatedBranchCounter;
                            if (EvaluatedBranchCounter % 500 == 0)
                            {
                               // UpdateStatus();
                            }

                            measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size;
                            if (measure >= TotalItemsSum && measure < BoundValue)
                            {
                                BranchBound bb = new BranchBound();
                                bb.Size = measure;
                                bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost;
                                Array.Resize(ref bb.SetOfStocks, c1 + c2);
                                Array.Resize(ref bb.SetOfStocksCost, c1 + c2);
                                int[] coeff = new int[] { c1, c2 };
                                AddItemToBranchBoundList(bb, coeff);
                            }
                        }
                    }
                }

                // 3 Stocks
                if (MaxStocksQuantity.Length == 3)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                ++EvaluatedBranchCounter;
                                if (EvaluatedBranchCounter % 500 == 0)
                                {
                                    //UpdateStatus();
                                }

                                measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size + c3 * BranchListOfStocks[2].Size;
                                if (measure >= TotalItemsSum && measure < BoundValue)
                                {
                                    BranchBound bb = new BranchBound();
                                    bb.Size = measure;
                                    bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost + c3 * BranchListOfStocks[2].Cost;
                                    Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3);
                                    Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3);
                                    int[] coeff = new int[] { c1, c2, c3 };
                                    AddItemToBranchBoundList(bb, coeff);
                                }
                            }
                        }
                    }
                }

                // 4 Stocks
                if (MaxStocksQuantity.Length == 4)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                for (int c4 = 0; c4 <= MaxStocksQuantity[3]; ++c4)
                                {
                                    ++EvaluatedBranchCounter;
                                    if (EvaluatedBranchCounter % 5000 == 0)
                                    {
                                       // UpdateStatus();
                                    }

                                    measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size + c3 * BranchListOfStocks[2].Size
                                   + c4 * BranchListOfStocks[3].Size;

                                    if (measure >= TotalItemsSum && measure < BoundValue)
                                    {
                                        BranchBound bb = new BranchBound();
                                        bb.Size = measure;
                                        bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost + c3 * BranchListOfStocks[2].Cost
                                            + c4 * BranchListOfStocks[3].Cost;
                                        Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3 + c4);
                                        Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3 + c4);
                                        int[] coeff = new int[] { c1, c2, c3, c4 };
                                        AddItemToBranchBoundList(bb, coeff);
                                    }
                                }
                            }
                        }
                    }
                }

                // 5 Stocks
                if (MaxStocksQuantity.Length == 5)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                for (int c4 = 0; c4 <= MaxStocksQuantity[3]; ++c4)
                                {
                                    for (int c5 = 0; c5 <= MaxStocksQuantity[4]; ++c5)
                                    {
                                        ++EvaluatedBranchCounter;
                                        if (BranchBoundList.Count % 5000 == 0)
                                        {
                                            //UpdateStatus();
                                        }
                                        measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size + c3 * BranchListOfStocks[2].Size
                                       + c4 * BranchListOfStocks[3].Size + c5 * BranchListOfStocks[4].Size;

                                        if (measure >= TotalItemsSum && measure < BoundValue)
                                        {
                                            BranchBound bb = new BranchBound();
                                            bb.Size = measure;
                                            bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost +
                                                c3 * BranchListOfStocks[2].Cost + c4 * BranchListOfStocks[3].Cost +
                                                c5 * BranchListOfStocks[4].Cost;
                                            Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3 + c4 + c5);
                                            Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3 + c4 + c5);
                                            int[] coeff = new int[] { c1, c2, c3, c4, c5 };
                                            AddItemToBranchBoundList(bb, coeff);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                // 6 Stocks
                if (MaxStocksQuantity.Length == 6)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                for (int c4 = 0; c4 <= MaxStocksQuantity[3]; ++c4)
                                {
                                    for (int c5 = 0; c5 <= MaxStocksQuantity[4]; ++c5)
                                    {
                                        for (int c6 = 0; c6 <= MaxStocksQuantity[5]; ++c6)
                                        {
                                            ++EvaluatedBranchCounter;
                                            if (BranchBoundList.Count % 10000 == 0)
                                            {
                                                //UpdateStatus();
                                            }
                                            measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size
                                                + c3 * BranchListOfStocks[2].Size + c4 * BranchListOfStocks[3].Size
                                                + c5 * BranchListOfStocks[4].Size + c6 * BranchListOfStocks[5].Size;

                                            if (measure >= TotalItemsSum && measure < BoundValue)
                                            {
                                                BranchBound bb = new BranchBound();
                                                bb.Size = measure;
                                                bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost +
                                                    c3 * BranchListOfStocks[2].Cost + c4 * BranchListOfStocks[3].Cost +
                                                    c5 * BranchListOfStocks[4].Cost + c6 * BranchListOfStocks[5].Cost;
                                                Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3 + c4 + c5 + c6);
                                                Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3 + c4 + c5 + c6);
                                                int[] coeff = new int[] { c1, c2, c3, c4, c5, c6 };
                                                AddItemToBranchBoundList(bb, coeff);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
           /* }

            catch (OutOfMemoryException)
            {
                MessageBox.Show("Memory Full!\nThe application will be quitted.\nRetry with less Items or remove some Stocks.", BPCSform.HeaderMsgBox, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Application.Exit();
                return;
            }*/
        }
예제 #3
0
 private void AddItemToBranchBoundList(BranchBound myB, params int[] myCoeff)
 {
     // Adds a new branch to the Branch & Bound List
     int j = 0;
     for (int k = 0; k < BranchListOfStocks.Count; ++k)
     {
         while (myCoeff[k] > 0)
         {
             myB.SetOfStocks[j] = BranchListOfStocks[k].Size;
             myB.SetOfStocksCost[j] = BranchListOfStocks[k].Cost;
             --myCoeff[k];
             ++j;
         }
     }
     BranchBoundList.Add(myB);
 }
예제 #4
0
        private void GetBranchBoundList()
        {
            // A maximum number of Stock sizes is managed by this algorithm. This is a design choice based on the practice.

            float measure;

            try
            {
                // 1 Stock
                if (MaxStocksQuantity.Length == 1)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        ++EvaluatedBranchCounter;
                        if (EvaluatedBranchCounter % 500 == 0)
                        {
                            UpdateStatus();
                        }

                        measure = c1 * BranchListOfStocks[0].Size;
                        if (measure >= TotalItemsSum && measure < BoundValue)
                        {
                            BranchBound bb = new BranchBound();
                            bb.Size = measure;
                            bb.Cost = c1 * BranchListOfStocks[0].Cost;
                            Array.Resize(ref bb.SetOfStocks, c1);
                            Array.Resize(ref bb.SetOfStocksCost, c1);
                            int[] coeff = new int[] { c1 };
                            AddItemToBranchBoundList(bb, coeff);
                        }
                    }
                }

                // 2 Stocks
                if (MaxStocksQuantity.Length == 2)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            ++EvaluatedBranchCounter;
                            if (EvaluatedBranchCounter % 500 == 0)
                            {
                                UpdateStatus();
                            }

                            measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size;
                            if (measure >= TotalItemsSum && measure < BoundValue)
                            {
                                BranchBound bb = new BranchBound();
                                bb.Size = measure;
                                bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost;
                                Array.Resize(ref bb.SetOfStocks, c1 + c2);
                                Array.Resize(ref bb.SetOfStocksCost, c1 + c2);
                                int[] coeff = new int[] { c1, c2 };
                                AddItemToBranchBoundList(bb, coeff);
                            }
                        }
                    }
                }

                // 3 Stocks
                if (MaxStocksQuantity.Length == 3)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                ++EvaluatedBranchCounter;
                                if (EvaluatedBranchCounter % 500 == 0)
                                {
                                    UpdateStatus();
                                }

                                measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size + c3 * BranchListOfStocks[2].Size;
                                if (measure >= TotalItemsSum && measure < BoundValue)
                                {
                                    BranchBound bb = new BranchBound();
                                    bb.Size = measure;
                                    bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost + c3 * BranchListOfStocks[2].Cost;
                                    Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3);
                                    Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3);
                                    int[] coeff = new int[] { c1, c2, c3 };
                                    AddItemToBranchBoundList(bb, coeff);
                                }
                            }
                        }
                    }
                }

                // 4 Stocks
                if (MaxStocksQuantity.Length == 4)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                for (int c4 = 0; c4 <= MaxStocksQuantity[3]; ++c4)
                                {
                                    ++EvaluatedBranchCounter;
                                    if (EvaluatedBranchCounter % 5000 == 0)
                                    {
                                        UpdateStatus();
                                    }

                                    measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size + c3 * BranchListOfStocks[2].Size
                                              + c4 * BranchListOfStocks[3].Size;

                                    if (measure >= TotalItemsSum && measure < BoundValue)
                                    {
                                        BranchBound bb = new BranchBound();
                                        bb.Size = measure;
                                        bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost + c3 * BranchListOfStocks[2].Cost
                                                  + c4 * BranchListOfStocks[3].Cost;
                                        Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3 + c4);
                                        Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3 + c4);
                                        int[] coeff = new int[] { c1, c2, c3, c4 };
                                        AddItemToBranchBoundList(bb, coeff);
                                    }
                                }
                            }
                        }
                    }
                }

                // 5 Stocks
                if (MaxStocksQuantity.Length == 5)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                for (int c4 = 0; c4 <= MaxStocksQuantity[3]; ++c4)
                                {
                                    for (int c5 = 0; c5 <= MaxStocksQuantity[4]; ++c5)
                                    {
                                        ++EvaluatedBranchCounter;
                                        if (BranchBoundList.Count % 5000 == 0)
                                        {
                                            UpdateStatus();
                                        }
                                        measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size + c3 * BranchListOfStocks[2].Size
                                                  + c4 * BranchListOfStocks[3].Size + c5 * BranchListOfStocks[4].Size;

                                        if (measure >= TotalItemsSum && measure < BoundValue)
                                        {
                                            BranchBound bb = new BranchBound();
                                            bb.Size = measure;
                                            bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost +
                                                      c3 * BranchListOfStocks[2].Cost + c4 * BranchListOfStocks[3].Cost +
                                                      c5 * BranchListOfStocks[4].Cost;
                                            Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3 + c4 + c5);
                                            Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3 + c4 + c5);
                                            int[] coeff = new int[] { c1, c2, c3, c4, c5 };
                                            AddItemToBranchBoundList(bb, coeff);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                // 6 Stocks
                if (MaxStocksQuantity.Length == 6)
                {
                    for (int c1 = 0; c1 <= MaxStocksQuantity[0]; ++c1)
                    {
                        for (int c2 = 0; c2 <= MaxStocksQuantity[1]; ++c2)
                        {
                            for (int c3 = 0; c3 <= MaxStocksQuantity[2]; ++c3)
                            {
                                for (int c4 = 0; c4 <= MaxStocksQuantity[3]; ++c4)
                                {
                                    for (int c5 = 0; c5 <= MaxStocksQuantity[4]; ++c5)
                                    {
                                        for (int c6 = 0; c6 <= MaxStocksQuantity[5]; ++c6)
                                        {
                                            ++EvaluatedBranchCounter;
                                            if (BranchBoundList.Count % 10000 == 0)
                                            {
                                                UpdateStatus();
                                            }
                                            measure = c1 * BranchListOfStocks[0].Size + c2 * BranchListOfStocks[1].Size
                                                      + c3 * BranchListOfStocks[2].Size + c4 * BranchListOfStocks[3].Size
                                                      + c5 * BranchListOfStocks[4].Size + c6 * BranchListOfStocks[5].Size;

                                            if (measure >= TotalItemsSum && measure < BoundValue)
                                            {
                                                BranchBound bb = new BranchBound();
                                                bb.Size = measure;
                                                bb.Cost = c1 * BranchListOfStocks[0].Cost + c2 * BranchListOfStocks[1].Cost +
                                                          c3 * BranchListOfStocks[2].Cost + c4 * BranchListOfStocks[3].Cost +
                                                          c5 * BranchListOfStocks[4].Cost + c6 * BranchListOfStocks[5].Cost;
                                                Array.Resize(ref bb.SetOfStocks, c1 + c2 + c3 + c4 + c5 + c6);
                                                Array.Resize(ref bb.SetOfStocksCost, c1 + c2 + c3 + c4 + c5 + c6);
                                                int[] coeff = new int[] { c1, c2, c3, c4, c5, c6 };
                                                AddItemToBranchBoundList(bb, coeff);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            catch (OutOfMemoryException)
            {
                //MessageBox.Show("Memory Full!\nThe application will be quitted.\nRetry with less Items or remove some Stocks.", BPCSform.HeaderMsgBox, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                Application.Exit();
                return;
            }
        }