thespeedracer38

MatrixMinimaMethod by Me

Mar 28th, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.72 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. class MatrixMinima{
  7.     int cost[10][10], capacity[10], requirement[10], allotment[10][10];
  8.     int cap_size, req_size;
  9.     public:
  10.         MatrixMinima(int cap_size, int req_size);
  11.         void input();
  12.         void displayAllotment(bool show_cap_req = true);
  13.         void displayCost();
  14.         void computeTransportationCost();
  15.         bool requirementFulfilled();
  16.         // arr is assumed to be 1 indexed
  17.         int minimumElementIn(int arr[], int size);
  18.         // gives the index of the element in the cost matrix
  19.         int indexOfElementInCostMatrix(int row_no, int element);
  20.         int min(int num1, int num2);
  21. };
  22.  
  23. int MatrixMinima::min(int num1, int num2){
  24.     return num1 < num2 ? num1 : num2;
  25. }
  26.  
  27. int MatrixMinima::minimumElementIn(int arr[], int size){
  28.     int curr_min_ele = arr[1];
  29.     for(int i = 2; i <= size; i++){
  30.         if(arr[i] < curr_min_ele){
  31.             curr_min_ele = arr[i];
  32.         }
  33.     }
  34.     return curr_min_ele;
  35. }
  36.  
  37. int MatrixMinima::indexOfElementInCostMatrix(int row_no, int element){
  38.     int index = -1;
  39.     for(int j = 1; j <= req_size; j++){
  40.         if(cost[row_no][j] == element){
  41.             index = j;
  42.             break;
  43.         }
  44.     }
  45.     return index;
  46. }
  47.  
  48. MatrixMinima::MatrixMinima(int cap_size, int req_size){
  49.     MatrixMinima::cap_size = cap_size;
  50.     MatrixMinima::req_size = req_size;
  51.     // Initializing cost, allotment, requirement, capacity matrix
  52.     for(int i = 1; i <= cap_size; i++){
  53.         capacity[i] = 0;
  54.         requirement[i] = 0;
  55.         for(int j = 1; j <= req_size; j++){
  56.             cost[i][j] = 0;
  57.             allotment[i][j] = 0;
  58.         }
  59.     }  
  60. }
  61.  
  62. void MatrixMinima::input(){
  63.     cout << "Enter the elements of cost matrix, capacity, requirement-->\n" << endl;
  64.     // Taking input in cost matrix
  65.     for(int i = 1; i <= cap_size; i++){
  66.         for(int j = 1; j <= req_size; j++){
  67.             cout << "cost[" << i << "][" << j << "] = ";
  68.             cin >> cost[i][j];
  69.         }
  70.     }
  71.     // Taking input in capacity matrix
  72.     for(int i = 1; i <= cap_size; i++){
  73.         cout << "capacity[" << i << "] = ";
  74.         cin >> capacity[i];
  75.     }
  76.     // Taking input in requirement matrix
  77.     for(int i = 1; i <= req_size; i++){
  78.         cout << "requirement[" << i << "] = ";
  79.         cin >> requirement[i];
  80.     }
  81. }
  82.  
  83. void MatrixMinima::displayAllotment(bool show_cap_req){
  84.     for(int i = 1; i <= cap_size; i++){
  85.         for(int j = 1; j <= req_size; j++){
  86.             cout << allotment[i][j] << "\t";
  87.         }
  88.         if(show_cap_req){
  89.             cout << capacity[i];
  90.         }
  91.         cout << endl;  
  92.     }
  93.     if(show_cap_req)
  94.     {
  95.         // Requirement
  96.         for(int i = 1; i <= req_size; i++){
  97.             cout << requirement[i] << "\t";
  98.         }
  99.     }
  100.     cout << endl;
  101. }
  102.  
  103. void MatrixMinima::displayCost(){
  104.     for(int i = 1; i <= cap_size; i++){
  105.         for(int j = 1; j <= req_size; j++){
  106.             cout << cost[i][j] << "\t";
  107.         }
  108.         cout << endl;
  109.     }
  110. }
  111.  
  112. void MatrixMinima::computeTransportationCost(){
  113.     int row = 1;
  114.     int *t_arr = NULL;
  115.     int min_element, index_of_min, min_allotment;
  116.     int size;
  117.     int iteration = 0;
  118.     int index;
  119.     while(!requirementFulfilled()){
  120.         size = 0;
  121.         index = 1;
  122.         cout << "Allotment Matrix after iteration-" << iteration << "--->" << endl;
  123.         displayAllotment();
  124.         cin.get();
  125.         cout << "\n\n\n";
  126.         // Count the number of incomplete assignments in row 'row'
  127.         for(int i = 1; i <= req_size; i++){
  128.             if(allotment[row][i] == 0){
  129.                 size = size + 1;   
  130.             }
  131.         }
  132.         // Creating the temporary array to store it
  133.         t_arr = new int[size + 1];
  134.         // Copying those costs in t_arr for which allotment is 0
  135.         for(int i = 1; i <= req_size; i++){
  136.             if(allotment[row][i] == 0){
  137.                 t_arr[index] = cost[row][i] ;
  138.                 index++;
  139.             }
  140.         }
  141.         // Displaying the t_arr elements
  142.         cout << "\n\nt_arr = ";
  143.         for(int i = 1; i <= size; i++){
  144.             cout << t_arr[i] << " ";
  145.         }
  146.         cout << "\n\n\n";
  147.         min_element = minimumElementIn(t_arr, size);
  148.         index_of_min = indexOfElementInCostMatrix(row, min_element);
  149.         min_allotment = min(capacity[row], requirement[index_of_min]);
  150.         allotment[row][index_of_min] = min_allotment;
  151.         // Adjusting capacity and requirement
  152.         capacity[row] = capacity[row] - min_allotment;
  153.         requirement[index_of_min] = requirement[index_of_min] - min_allotment;
  154.        
  155.         if(capacity[row] == 0){
  156.             row = row + 1;
  157.         }
  158.         if(requirement[index_of_min] == 0){
  159.             int next_min;
  160.             // Copy contents of t_arr in temp
  161.             int *temp[] = new int[size];
  162.             for(int i = 1; i <= size; i++){
  163.                 temp[i] = t_arr[i];
  164.             }
  165.             delete[] t_arr;
  166.             size = size - 1;
  167.             t_arr = new int[size];
  168.             index = 1;
  169.             for(int i = 1; i <= size; i++){
  170.                 if(temp[i] != min_element){
  171.                     t_arr[index] = temp[i];
  172.                     index++;
  173.                 }
  174.             }
  175.             // Displaying the t_arr elements
  176.             cout << "\n\nt_arr = ";
  177.             for(int i = 1; i <= size; i++){
  178.                 cout << t_arr[i] << " ";
  179.             }
  180.             cout << "\n\n\n";
  181.             min_element = minimumElementIn(t_arr, size);
  182.             index_of_min = indexOfElementInCostMatrix(row, min_element);
  183.             min_allotment = min(capacity[row], requirement[index_of_min]);
  184.             allotment[row][index_of_min] = min_allotment;
  185.             // Adjusting capacity and requirement
  186.             capacity[row] = capacity[row] - min_allotment;
  187.             requirement[index_of_min] = requirement[index_of_min] - min_allotment;
  188.         }
  189.         iteration = iteration + 1;
  190.         delete[] t_arr;
  191.     }
  192. }
  193.  
  194. bool MatrixMinima::requirementFulfilled(){
  195.     bool req = true, cap = true;
  196.     // Checking if all the elements of the requirement matrix is 0
  197.     for(int i = 1; i <= req_size; i++){
  198.         if(requirement[i] != 0){
  199.             req = false;
  200.             break;
  201.         }
  202.     }
  203.     // Checking if all the elements of the capacity matrix is 0
  204.     for(int i = 1; i <= cap_size; i++){
  205.         if(capacity[i] != 0){
  206.             cap = false;
  207.             break;
  208.         }
  209.     }
  210.     return req && cap;
  211. }
  212.  
  213.  
  214. int main() {
  215.     system("cls");
  216.     cout << "Enter the number of capacities(1-9) = ";
  217.     int cap;
  218.     cin >> cap;
  219.     cout << "Enter the number of requirements(1-9) = ";
  220.     int req;
  221.     cin >> req;
  222.     MatrixMinima obj(cap, req);
  223.     obj.input();
  224.     obj.computeTransportationCost();
  225.     return 0;
  226. }
Add Comment
Please, Sign In to add comment