private HashSet <ushort> DnaToUsedNodes(BitArray dna)
        {
            using (var mstNodes = new PooledList <int>(dna.Length + TargetNodes.Count))
                using (var mst = new MinimalSpanningTree(mstNodes, Distances))
                {
                    for (var i = 0; i < dna.Length; i++)
                    {
                        if (dna[i])
                        {
                            mstNodes.Add(i);
                        }
                    }
                    var searchSpaceNodeCount = mstNodes.Count;
                    for (var i = 0; i < TargetNodes.Count; i++)
                    {
                        mstNodes.Add(TargetNodes[i].DistancesIndex);
                    }

                    if (_orderedEdges != null)
                    {
                        mst.Span(_orderedEdges);
                    }
                    else
                    {
                        mst.Span(StartNode.DistancesIndex);
                    }

                    return(GetSkillNodeIds(mstNodes, searchSpaceNodeCount, mst.SpanningEdges));
                }
        }
        private void SetBestDnaAndSolution()
        {
            _bestDna = _ga.GetBestDNA();
            var usedNodes = DnaToUsedNodes(_bestDna);

            _bestSolution = Extend(usedNodes);
            Return(usedNodes);
        }