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