Массив потоков 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(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д