private static List<double[]> DecreaseRegime(ISection section, List<double[]> schedule, double volume, List<int> indexes, bool allowZero, bool input = true) { List<double[]> newSchedule = AlgorithmHelper.GetIndexes(schedule, indexes); double newVolume = newSchedule.Sum(x => input ? x.First() : x.Last()); double oldSectionVolume = newVolume; int len = indexes.Count(); while (true) { int zeroCounter = 0; bool end = false; for (int i = 0; i < len; i++) { var idx = indexes[i]; var lowerRegime = section.GetLowerRegime(idx, newSchedule[i], !input); if (lowerRegime != null) { if (input) newVolume -= newSchedule[i].First() - lowerRegime.First(); else newVolume -= newSchedule[i].Last() - lowerRegime.Last(); if (oldSectionVolume - newVolume > volume || newVolume < 0) { end = true; break; } newSchedule[i] = lowerRegime; } else { zeroCounter++; } } if (end) break; if (zeroCounter == len) { if (allowZero) for (int i = len - 1; i >= 0; i--) { if (input) newVolume -= newSchedule[i].First(); else newVolume -= newSchedule[i].Last(); if (oldSectionVolume - newVolume > volume || newVolume < 0) break; newSchedule[i] = new double[section.Dimension]; } break; } } return newSchedule; }