Advertisement
harikrista

Dijkstra short path Parallel

May 30th, 2017
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.34 KB | None | 0 0
  1. package DijkstraParallel;
  2.  
  3. import java.util.LinkedList;
  4. import java.util.List;
  5. import java.util.concurrent.BlockingDeque;
  6. import java.util.concurrent.LinkedBlockingDeque;
  7. import java.util.concurrent.locks.Lock;
  8. import java.util.concurrent.locks.ReentrantLock;
  9. import java.util.logging.Level;
  10. import java.util.logging.Logger;
  11.  
  12. class Worker implements Runnable {
  13.     int threadId;
  14.  
  15.     public Worker(int threadId) {
  16.         this.threadId = threadId;
  17.     }
  18.  
  19.     @Override
  20.     public void run() {
  21.         do {
  22.             int vertex = (int) DijkstraParallel.getWork();
  23.             if (vertex == -1) {
  24.                 break;
  25.             } else {
  26.                 for (int i = 0; i < DijkstraParallel.n; i++) {
  27.                     // if equal to infinity, it means no connection between these vertices
  28.                     if (DijkstraParallel.weight[vertex][i] < DijkstraParallel.infinity) {
  29.                         int newdist = DijkstraParallel.mindist[vertex] + DijkstraParallel.weight[vertex][i];
  30.                        
  31.                         if (newdist < DijkstraParallel.mindist[i]) {
  32.                             // atomic operation on change on global variable
  33.                             try {
  34.                                 DijkstraParallel.L.lock();
  35.                                 DijkstraParallel.mindist[i] = newdist;
  36.                             } finally {
  37.                                 DijkstraParallel.L.unlock();
  38.                             }
  39.                            
  40.                             // checking if the vertex is already in a pool better to use set
  41.                             if (!DijkstraParallel.workpool.contains(i)) {
  42.                                 DijkstraParallel.putWork(i);
  43.                             }
  44.                         }
  45.                     }
  46.                 }
  47.             }
  48.         } while (true);
  49.     }
  50. }
  51.  
  52. public class DijkstraParallel {
  53.     public static final int n = 5;
  54.     public static final int infinity = 32000;
  55.     public static int workCount = 0;
  56.     public static BlockingDeque workpool = new LinkedBlockingDeque();
  57.    
  58.     public static int getWork(){
  59.  
  60.         try {
  61.             DijkstraParallel.L.lock();
  62.             workCount = workCount - 1;
  63.         } finally {
  64.             DijkstraParallel.L.unlock();
  65.         }
  66.        
  67.         if(workCount == -n){
  68.             // terminate all workers sending them -1
  69.             for(int i=0;i<n;i++){
  70.                 try {
  71.                     workpool.put(-1);
  72.                 } catch (InterruptedException ex) {
  73.                     Logger.getLogger(DijkstraParallel.class.getName()).log(Level.SEVERE, null, ex);
  74.                 }
  75.             }
  76.            
  77.             return -1;
  78.            
  79.         }else{
  80.             try {
  81.                 return (int) workpool.take();
  82.             } catch (InterruptedException ex) {
  83.                 Logger.getLogger(DijkstraParallel.class.getName()).log(Level.SEVERE, null, ex);
  84.             }
  85.         }
  86.        
  87.         return -1;
  88.     }
  89.    
  90.     public static void putWork(Integer vertexNo){
  91.        
  92.         try {
  93.             workpool.put(vertexNo);
  94.         } catch (InterruptedException ex) {
  95.             Logger.getLogger(DijkstraParallel.class.getName()).log(Level.SEVERE, null, ex);
  96.         }
  97.        
  98.         try {
  99.  
  100.             DijkstraParallel.L.lock();
  101.             workCount = workCount + 1;
  102.         } finally {
  103.             DijkstraParallel.L.unlock();
  104.         }
  105.     }
  106.  
  107.     public static int weight[][] = {
  108.         {infinity, 4, 8, infinity, infinity},
  109.         {infinity, infinity, 3, 1, infinity},
  110.         {infinity, infinity, infinity, infinity, 5},
  111.         {infinity, infinity, 2, infinity, 10},
  112.         {infinity, infinity, infinity, infinity, infinity}
  113.     };
  114.  
  115.     public static int mindist[] = new int[n];
  116. //    public static Lock L[] = new ReentrantLock[n];
  117.     public static Lock L = new ReentrantLock();
  118.    
  119.     public static List<Thread> threads = new LinkedList<>();
  120.  
  121.     public static void main(String[] args) {
  122.         initThreads();
  123.        
  124.         for(int i=0;i<n;i++){
  125.             System.out.println("vertex: " + DijkstraParallel.mindist[i]);
  126.         }
  127.     }
  128.    
  129.     public static void initThreads(){
  130.         // initializing the mindist with all infinity and first one 0;
  131.        
  132.         for(int i=0;i<mindist.length;i++){
  133.             mindist[i] = infinity;
  134.         }
  135.        
  136.         mindist[0] = 0;
  137.        
  138.         // creating total threads
  139.         for(int i=0;i<n;i++){
  140.             Worker runnable = new Worker(i);
  141.             Thread t = new Thread(runnable);
  142.             threads.add(t);
  143.         }
  144.        
  145.         // put first source in the work pool to initialize the work pool
  146.         try {
  147.             workpool.put(0);
  148.         } catch (InterruptedException ex) {
  149.             Logger.getLogger(DijkstraParallel.class.getName()).log(Level.SEVERE, null, ex);
  150.         }
  151.        
  152.         // start all threads at once
  153.         for(int i=0;i<n;i++){
  154.             Thread t = threads.get(i);
  155.             t.start();
  156.         }
  157.        
  158.         // join all threads here before program exits
  159.         for(int i=0;i<n;i++){
  160.             Thread t = threads.get(i);
  161.             try {
  162.                 t.join();
  163.             } catch (InterruptedException ex) {
  164.                 System.out.println("exception");
  165.             }
  166.         }
  167.     }
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement