Advertisement
Sidsh

Dijkstra Reference

Feb 7th, 2022
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module main;
  2. reg [2:0] i,j,k,row,col,target,temp ;
  3. reg [4:0] cap;
  4. reg [7:0] INF = 8'b11111111;
  5. //3 dustbins
  6. reg [7:0] adjMat [0:2][0:2];
  7. reg [5:0] path [0:2][0:6];
  8. reg visited [0:2][0:6];
  9. reg picked [0:2][0:6];
  10. reg [7:0] dist [0:2][0:6];
  11. reg [2:0] dustbin [0:2];
  12.   initial
  13.     begin
  14.     for (i=0; i<3; i++)
  15.       for (j=0; j<3; j++)
  16.             adjMat[i][j] = 0;
  17.         //dustbin load initialisation
  18.         dustbin[0] = 0;
  19.         dustbin[1] = 1;
  20.         dustbin[2] = 2;
  21.         //creating edges
  22.         adjMat[0][1] = 3;
  23.         adjMat[1][2] = 6;
  24.         adjMat[2][0] = 5;
  25.         adjMat[1][0] = 3;
  26.         adjMat[2][1] = 6;
  27.         adjMat[0][2] = 5;
  28.     for (i=0; i<3; i++)
  29.       for (j=0; j<7; j++)
  30.             begin
  31.             visited[i][j] = 0;
  32.             picked[i][j] = 0;
  33.             end
  34.     for (i=0; i<3; i++)
  35.         for (j=0; j<7; j++)
  36.             dist[i][j] = INF;
  37.         $display("Bye, World");
  38.        // $finish ;
  39.     end
  40.     //priority queue
  41.     function [6:0] minimum;
  42.     input in;
  43.     reg [2:0] i,j;
  44.     reg [7:0] min;
  45.     reg [6:0] index;
  46.     begin
  47.         min = 8'b11111111;
  48.         index = 7'b1000000;
  49.         for(i=0;i<3;++i)
  50.             for(j=0;j<7;++j)
  51.             begin
  52.                 if(visited[i][j] == 0 && min > dist[i][j])
  53.                 begin
  54.                 min = dist[i][j];
  55.                 index[2:0] = j[2:0];
  56.                 index[5:3] = i[2:0];
  57.                 index[6] = 0;
  58.                 end
  59.             end
  60.             //index[2:0] = 3'b001;
  61.             //index[5:3] = 3'b100;
  62.             minimum = index;
  63.     end
  64. endfunction
  65.     //Dijkstra
  66.     //centre
  67.     //visited[0][2] = 1;
  68.     reg [6:0] min;
  69.     initial begin
  70.     dist[0][2] = 0;
  71.     min = minimum(3);
  72.     target = 2;
  73.     while(min != 7'b1000000)
  74.     begin
  75.         i = min[5:3];
  76.         j = min[2:0];
  77.         visited[i][j] = 1;
  78.         dustbin[i]= 0;
  79.         for(k=0;k<3;++k)
  80.         begin
  81.             if(adjMat[i][k] != 0)
  82.             begin
  83.                 cap = j + dustbin[k];
  84.                 //$display("%d %d %d",i,j,cap);
  85.                 if(k == target)
  86.                 begin
  87.                     if(visited[k][j]==0 &&dist[i][j]+adjMat[i][k] < dist[k][j])
  88.                         begin
  89.                         dist[k][j] = dist[i][j]  + adjMat[i][k];
  90.                         path[k][j][2:0] = j;
  91.                         path[k][j][5:3] = i;
  92.                         picked[k][j] = 1;
  93.                         end
  94.                 end
  95.                 else
  96.                 begin
  97.                     if(visited[k][cap]==0 &&cap < 5 && dist[i][j]+adjMat[i][k] < dist[k][cap])//6 is max truck capacity
  98.                         begin
  99.                         dist[k][cap] = dist[i][j]  + adjMat[i][k];
  100.                         path[k][cap][2:0] = j;
  101.                         path[k][cap][5:3] = i;
  102.                         picked[k][cap] = 1;
  103.                         end
  104.                     if(visited[k][j]==0 &&dist[i][j]+adjMat[i][k] < dist[k][j])
  105.                         begin
  106.                         dist[k][j] = dist[i][j]  + adjMat[i][k];
  107.                         path[k][j][2:0] = j;
  108.                         path[k][j][5:3] = i;
  109.                         picked[k][j] = 0;
  110.                         end
  111.                 end
  112.             end
  113.         end
  114.         min = minimum(3);
  115.        
  116.     end
  117.     end
  118.     initial begin
  119.         for(k=0;k<7;++k)
  120.          if(dist[target][k] != INF)
  121.          j = k;
  122.          while(target != 0)
  123.          begin
  124.             if(picked[target][j] != 0)
  125.             begin
  126.                 $display("%d(picked)",target);
  127.             end
  128.             else
  129.             begin
  130.                 $display("%d(not picked)",target);
  131.             end
  132.             temp = target;
  133.             target = path[target][j][5:3];
  134.             j = path[temp][j][2:0];
  135.          end
  136.          $display("%d",target);
  137.      end
  138. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement