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(); }