Массив потоков threads (распараллелить кусок кода из алгоритма Дейкстры) - C#

Узнай цену своей работы

Формулировка задачи:

Пытался распараллелить кусок кода из алгоритма Дейкстры,но почему то ни один поток ничего не выполняет,т.е значения в MyData.unvisitedPoints остаются такие какие были из-за чего,подскажите пожалуйста в чем ошибка.p.s:Сори за быдлокод
    static class MyData
    {
      public static  List<point> unvisitedPoints = new List<point>();//список непосещенных вершин
      public static point v = new point();//хранит минимальную точку
      public static List<Lines> LinesList = new List<Lines>();//список ребер(содержит вес пути)
    }
   private point FindMin(List<point> list)
        {
            if (list.Count == 0)
            {
                return null;
            }
            int min = int.MaxValue;
            point minPoint = null;
            foreach (var p in list)
            {
                if (p.metka < min)
                {
                    minPoint = p;
                    min = p.metka;

                }
            }
 
            return minPoint; }
    public double FindPath(List<Lines> LinesList, List<point> PointList, point startPoint)
        {
            double weight = 0;
        //список точек которые не были посещены
            MyData.unvisitedPoints = new List<point>(PointList);
            foreach (var p in MyData.unvisitedPoints)
            {
                p.metka = int.MaxValue;//изначально все метки равны условной бесконечности
                p.optPath.Clear();
            };
            startPoint.metka = 0;//обнуляем метку начальной точки
            startPoint.optPath.Add(startPoint);
            while (MyData.unvisitedPoints.Count != 0)
            {
                MyData.v = FindMin(MyData.unvisitedPoints);//множество вершин графа
                MyData.unvisitedPoints.Remove(MyData.v);
             Thread[]threads=new Thread[MyData.unvisitedPoints.Count];
                
            for (int i = 0; i< threads.Length-1;i++ ) 
            {
                threads[i] = new Thread(SetMetka);
                threads[i].Start(i);
            }
      
            }
 
            return weight;
        }
     void SetMetka(object m)
        {
            int u = (int)m;
            
            //ищем ребро которое соеденяет вершину с мин-й меткой(v) и непосещенную вершину(u)
            var E = GetLine(MyData.v, MyData.unvisitedPoints[u], MyData.LinesList);//множество ребер графа
            if (E != null && MyData.unvisitedPoints[u].metka > MyData.v.metka + E.weight)//если из мни.вершины есть ребра и метка непосещенной вершины u
            // >метки минимальной вершины v+ вес ребра соед-й эти две вершины
            {
               MyData.unvisitedPoints[u].metka = MyData.v.metka + E.weight;//то метка текущей непосещенной вершины равняется метке минимальной вершины v+ вес ребра соед-й эти две вершины
               MyData.unvisitedPoints[u].optPath = new List<point>(MyData.v.optPath);//обновляем список оптимальных путей для непосещенной вершины
               MyData.unvisitedPoints[u].optPath.Add(MyData.unvisitedPoints[u]);//добавляем в оптимальный путь текущую непосещенную вершину
            }
        }

Решение задачи: «Массив потоков threads (распараллелить кусок кода из алгоритма Дейкстры)»

textual
Листинг программы
for (int i = 0; i< threads.Length-1;i++ ) 
            {
                threads[i].Join();
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5
Похожие ответы