コード例 #1
0
        private void MetodMinElement()
        {
            List <Index> indexesFalseTable = new List <Index>();

            gridDelta.RowCount = 0;
            C = new Element[n, m];
            El[] CC = new El[n * m];
            PivotN = -1;
            PivotM = -1;
            int i = 0;
            int j = 0;

            //сохраняем значения
            for (i = 0; i < aSupply.Length; i++)
            {
                aSupply[i] = Convert.ToInt32(gridA.Rows[i].Cells[0].Value);
            }
            for (j = 0; j < aDemand.Length; j++)
            {
                aDemand[j] = Convert.ToInt32(gridB.Rows[j].Cells[0].Value);
            }
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    C[i, j].Index = Convert.ToInt32(gridC.Rows[i].Cells[j].Value);
                }
            }


            //сохраняем тарифы и их индексы
            int l = 0;

            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    CC[l].Index  = C[i, j].Index;
                    CC[l].IndexI = i;
                    CC[l].IndexJ = j;
                    l++;
                }
            }
            //сортируем по тарифам (индексам)
            l = 0;
            foreach (var p in CC.OrderBy(itm => itm.Index))
            {
                CC[l] = p;
                l++;
            }

            l = 0;
            int minEl = 0;

            while (l < n * m)
            {
                if (CC[l].Index != 0)
                {
                    minEl = Element.FindMinElement(aSupply[CC[l].IndexI], aDemand[CC[l].IndexJ]);

                    C[CC[l].IndexI, CC[l].IndexJ].Value = minEl;


                    if ((aSupply[CC[l].IndexI] - minEl == 0 && aDemand[CC[l].IndexJ] - minEl == 0) && (aSupply[CC[l].IndexI] != 0 && aDemand[CC[l].IndexJ] != 0))
                    {
                        indexesFalseTable.Add(new Index {
                            I = CC[l].IndexI, J = CC[l].IndexJ
                        });
                    }

                    aSupply[CC[l].IndexI] -= minEl;
                    aDemand[CC[l].IndexJ] -= minEl;
                }

                l++;
            }

            l = 0;
            while (l < n * m)
            {
                if (CC[l].Index == 0)
                {
                    minEl = Element.FindMinElement(aSupply[CC[l].IndexI], aDemand[CC[l].IndexJ]);

                    C[CC[l].IndexI, CC[l].IndexJ].Value = minEl;
                    aSupply[CC[l].IndexI] -= C[CC[l].IndexI, CC[l].IndexJ].Value;
                    aDemand[CC[l].IndexJ] -= C[CC[l].IndexI, CC[l].IndexJ].Value;
                }

                l++;
            }
            int s = 0;

            for (i = 0; i < n; i++)
            {
                for (j = 0; j < m; j++)
                {
                    if (C[i, j].Value != 0)
                    {
                        s++;
                    }
                }
            }
            //ложный ноль

            IndexItem[] arr          = new IndexItem[] { };
            IndexItem   itemToRemove = new IndexItem {
            };

            foreach (Index indexes in indexesFalseTable)
            {
                if (s < n + m - 1)
                {
                    if (indexes.I + 1 >= n)
                    {
                        if (indexes.J + 1 >= m)
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J - 1], I = indexes.I, J = indexes.J - 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I - 1, indexes.J], I = indexes.I - 1, J = indexes.J
                                }
                            };
                        }
                        else if (indexes.J - 1 <= 0)
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J + 1], I = indexes.I, J = indexes.J + 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I - 1, indexes.J], I = indexes.I - 1, J = indexes.J
                                }
                            };
                        }
                        else
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J + 1], I = indexes.I, J = indexes.J + 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J - 1], I = indexes.I, J = indexes.J - 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I - 1, indexes.J], I = indexes.I - 1, J = indexes.J
                                }
                            };
                        }
                    }

                    if (indexes.I - 1 <= 0)
                    {
                        if (indexes.J + 1 >= m)
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J - 1], I = indexes.I, J = indexes.J - 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I + 1, indexes.J], I = indexes.I + 1, J = indexes.J
                                }
                            };
                        }
                        else if (indexes.J - 1 <= 0)
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J + 1], I = indexes.I, J = indexes.J + 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I + 1, indexes.J], I = indexes.I + 1, J = indexes.J
                                }
                            };
                        }
                        else
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J + 1], I = indexes.I, J = indexes.J + 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J - 1], I = indexes.I, J = indexes.J - 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I + 1, indexes.J], I = indexes.I + 1, J = indexes.J
                                }
                            };
                        }
                    }
                    if (indexes.I - 1 >= 0 && indexes.I + 1 <= n)
                    {
                        if (indexes.J + 1 >= m)
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J - 1], I = indexes.I, J = indexes.J - 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I + 1, indexes.J], I = indexes.I + 1, J = indexes.J
                                },
                                new IndexItem {
                                    Item = C[indexes.I - 1, indexes.J], I = indexes.I - 1, J = indexes.J
                                }
                            };
                        }
                        else if (indexes.J - 1 <= 0)
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J + 1], I = indexes.I, J = indexes.J + 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I + 1, indexes.J], I = indexes.I + 1, J = indexes.J
                                },
                                new IndexItem {
                                    Item = C[indexes.I - 1, indexes.J], I = indexes.I - 1, J = indexes.J
                                }
                            };
                        }
                        else
                        {
                            arr = new IndexItem[] {
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J + 1], I = indexes.I, J = indexes.J + 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I, indexes.J - 1], I = indexes.I, J = indexes.J - 1
                                },
                                new IndexItem {
                                    Item = C[indexes.I + 1, indexes.J], I = indexes.I + 1, J = indexes.J
                                },
                                new IndexItem {
                                    Item = C[indexes.I - 1, indexes.J], I = indexes.I - 1, J = indexes.J
                                }
                            };
                        }
                    }

                    int indI = -1;
                    int indJ = -1;

                    int minInd = int.MaxValue;

                    foreach (IndexItem item in arr)
                    {
                        if (item.Item.Index <= minInd && item.Item.Value == 0 && item.Item.Value != -1)
                        {
                            minInd = item.Item.Index;
                            indI   = item.I;
                            indJ   = item.J;
                        }
                    }

                    if (indI >= 0 && indJ >= 0)
                    {
                        C[indI, indJ].Value = -1;
                    }
                }
                s++;
            }



            PrintPlan();
            printZ();
        }