public void start(bool dbg, out String s)
        {
            s = "";
            Task tsk;
            int[][] x;
            double f;
            int i = 1;

            if (dbg)
            {
                s += "Начальные оценки: \n";
                s += "x*: \n";
                s += printOptimalMatrix(_x, _n);
                s += String.Format("f* = {0}\n", _f);
                s += "\n";
            }
            while (_taskList.Count > 0)
            {
                if (dbg)
                {
                    s += String.Format("Число задач в списке S: {0}.\n", _taskList.Count);
                    s += String.Format("Итерация № {0}\n", i);
                    i++;
                }
                tsk = _taskList.Dequeue();
                if (dbg)
                    s += "Решается задача: \n" + tsk.ToString();

                VengerAlgorithm va = new VengerAlgorithm(tsk.toVengerMatrix());
                va.start(false, out x, out f);
                if (dbg)
                {
                    s += "x: \n";
                    s += printOptimalMatrix(x, _n);
                    s += String.Format("f = {0} \n", f);
                }

                // полученное значение целевой функции меньше текущего?
                if (f < _f)
                {
                    List<Loop> loops = getSubLoops(x);
                    if (loops.Count == 1)
                    {
                        _f = f;
                        _x = x;
                        if (dbg)
                        {
                            s += "Полученное решение является полным подциклом; \n";
                            s += String.Format("x* = x, f* = {0}\n", _f);
                            s += "\n";
                        }
                    }
                    else
                    {
                        if (dbg)
                        {
                            s += "Подциклы: ";
                            foreach (Loop l in loops)
                                s += l.ToString() + ";";
                            s += "\n\n";
                        }
                        Loop min = getMinLoops(loops);
                        addNewTasks(min, tsk);
                    }
                }
            }
            if (dbg)
                s += "Список задач S пуст.\n";
            s += "============================================\n";
            s += "Итоговое решение задачи: \n";
            s += "x*:\n";
            s += printOptimalMatrix(_x, _n);
            s += String.Format("f* = {0} \n", _f);
        }
        public int[][] start(out double cost)
        {
            Task tsk;
            int[][] x;
            double f;
            int i = 1;

            while (_taskList.Count > 0)
            {
                tsk = _taskList.Dequeue();

                VengerAlgorithm va = new VengerAlgorithm(tsk.toVengerMatrix());
                va.start(false, out x, out f);

                // полученное значение целевой функции меньше текущего?
                if (f < _f)
                {
                    List<Loop> loops = getSubLoops(x);
                    if (loops.Count == 1)
                    {
                        _f = f;
                        _x = x;
                    }
                    else
                    {
                        Loop min = getMinLoops(loops);
                        addNewTasks(min, tsk);
                    }
                }
            }
            cost = _f;
            return _x;
        }