2016-01-12 4 views
0

Мы столкнулись с этой проблемой Графа, и нам нужно было реализовать Floyd Warshall, Так мы и сделали. Хотя мы не любили алгоритм, потому что он очень медленный.Параллельный linq на floyd warshall

Мы хотели бы знать, если это возможно применить Parallel LINQ на втором цикле, так что мы можем ускорить алгоритм немного

Вопрос: Ускорить цикл с варом i

private int[,] FloydWarshall(int[,] matrix) 
    { 
    var loopCount = matrix.GetLength(0); 
    var next = CreatePredecessorMatrix(matrix); 

     for (var k = 0; k < loopCount; k++) 
     { 
      for (var i = 0; i < loopCount; i++) 
      { 
       for (var j = 0; j < loopCount; j++) 
       { 
        if (matrix[i, j] > matrix[i, k] + matrix[k, j]) 
        { 
         matrix[i, j] = matrix[i, k] + matrix[k, j]; 
         next[i, j] = next[k, j]; 
        } 
       } 
      } 
     } 
     return next; 
    } 
+0

Попробуйте написать в браузере Floyd Warshall параллельно с реализацией и нажмите несколько ссылок, которые вы увидите. Это сделает ваш вопрос устаревшим. –

ответ

0

Очень хорошее предложение по Viider Бури о Parallel Для

private int[,] FloydWarshall(int[,] matrix) 
    { 
     var loopCount = matrix.GetLength(0); 
     var next = CreatePredecessorMatrix(matrix); 
     for (var k = 0; k < loopCount; k++) 
     { 
      Console.WriteLine(k); 

      Parallel.For(0, loopCount, i => 
      { 
       for (var j = 0; j < loopCount; j++) 
       { 
        if (matrix[i, j] > matrix[i, k] + matrix[k, j]) 
        { 
         matrix[i, j] = matrix[i, k] + matrix[k, j]; 
         next[i, j] = next[k, j]; 
        } 
       } 
      }); 
     } 
     return next; 
    } 

Спасибо за вход!

1

Есть ли Parallel.For вместо того, чтобы «var i» for-loop не достигал такой же скорости, как Parallel Linq?