Advertisement
Aaaaa988

Untitled

May 25th, 2020
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.35 KB | None | 0 0
  1. package ru.kiselev;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.util.ArrayList;
  7.  
  8. public class TransportTask {
  9.     public static final String ANSI_RESET = "\u001B[0m";
  10.     public static final String ANSI_RED = "\033[0;91m";
  11.     public static void main(String[] args) {
  12.         ArrayList<ArrayList<Integer>> MatrixCost= new ArrayList<ArrayList<Integer>>();
  13.         ArrayList<ArrayList<Integer>> MatrixStockAndNeeds= new ArrayList<ArrayList<Integer>>();
  14.         ArrayList<ArrayList<Integer>> MatrixOrder = new ArrayList<ArrayList<Integer>>();
  15.         ReadFromFile(MatrixCost, MatrixStockAndNeeds, "Task.txt");
  16.         int rangMatrix = MatrixCost.size() + MatrixCost.get(0).size() - 1;
  17.         copyMatrix(MatrixOrder, MatrixCost);
  18.         ZeroingMatrix(MatrixOrder);
  19.         System.out.println("\nИсходная таблица\n");
  20.         outputTable(MatrixCost, MatrixOrder, MatrixStockAndNeeds);
  21.         int delta = CheckEqualsStocksAndNeeds(MatrixStockAndNeeds);
  22.         if(delta != 0) {
  23.             AddNewProviderOrStore(MatrixCost, MatrixOrder, MatrixStockAndNeeds, delta);
  24.             outputTable(MatrixCost, MatrixOrder, MatrixStockAndNeeds);
  25.         }
  26.         System.out.print("\n********************Пошаговое решение********************\n");
  27.         MethodNorthWestAngle(MatrixCost, MatrixOrder, MatrixStockAndNeeds);
  28.         System.out.print("\n*********************************************************\n");
  29.         System.out.println("\nИтоговая таблица\n");
  30.         outputTable(MatrixCost, MatrixOrder, MatrixStockAndNeeds);
  31.         resultCost(rangMatrix,MatrixCost,MatrixOrder);
  32.     }
  33.     private static void copyMatrix(ArrayList<ArrayList<Integer>> MatrixOrder, ArrayList<ArrayList<Integer>> MatrixCost){
  34.         for(int i = 0; i < MatrixCost.size(); i++){
  35.             MatrixOrder.add(new ArrayList<Integer>());
  36.             for(int j = 0; j < MatrixCost.get(0).size(); j++){
  37.                 MatrixOrder.get(i).add(0);
  38.             }
  39.         }
  40.     }
  41.  
  42.     private static void ZeroingMatrix(ArrayList<ArrayList<Integer>> MatrixOrder) {
  43.         for (ArrayList<Integer> integers : MatrixOrder) {
  44.             for (int j = 0; j < MatrixOrder.get(0).size(); j++) {
  45.                 integers.set(j, 0);
  46.             }
  47.         }
  48.     }
  49.  
  50.     public static void ReadFromFile(ArrayList<ArrayList<Integer>> MatrixCost,
  51.                                     ArrayList<ArrayList<Integer>> MatrixStockAndNeeds,
  52.                                     String file){
  53.         try {
  54.             BufferedReader reader = new BufferedReader(new FileReader(file));
  55.             String string = reader.readLine();
  56.             String nextString = null;
  57.             String[] separated = null;
  58.             MatrixStockAndNeeds.add(new ArrayList<Integer>());
  59.             MatrixStockAndNeeds.add(new ArrayList<Integer>());
  60.             int rowCounter = 0;
  61.             while((nextString = reader.readLine()) != null){
  62.                 MatrixCost.add(new ArrayList<Integer>());
  63.                 separated = string.split(" ");
  64.                 for(int i = 0; i < separated.length; i++){
  65.                     if((i + 1) == separated.length){
  66.                         MatrixStockAndNeeds.get(0).add(Integer.valueOf(separated[i]));
  67.                         System.out.print(" " + MatrixStockAndNeeds.get(0).get(rowCounter) + "\n");
  68.                         continue;
  69.                     }
  70.                     MatrixCost.get(rowCounter).add(Integer.valueOf(separated[i]));
  71.                     System.out.print(" " + MatrixCost.get(rowCounter).get(i));
  72.                 }
  73.                 string = nextString;
  74.                 rowCounter++;
  75.             }
  76.             separated = string.split(" ");
  77.             for(int i = 0; i < separated.length; i++){
  78.                 MatrixStockAndNeeds.get(1).add(Integer.valueOf(separated[i]));
  79.                 System.out.print(" " + MatrixStockAndNeeds.get(1).get(i) );
  80.             }
  81.             System.out.println();
  82.         } catch (IOException e) {
  83.             e.printStackTrace();
  84.         }
  85.     }
  86.  
  87.     public static void outputTable(ArrayList<ArrayList<Integer>> MatrixCost,
  88.                                    ArrayList<ArrayList<Integer>> MatrixOrder,
  89.                                    ArrayList<ArrayList<Integer>> MatrixStockAndNeeds){
  90.         System.out.println("\t\t\t\t\t\t Магазины");
  91.         System.out.print("Поставщики" + " |");
  92.         for (int i = 0; i < MatrixCost.get(0).size(); i++){
  93.             System.out.print("  B" + (i+1) +"  |");
  94.         }
  95.         System.out.println(" Запасы" + " | ");
  96.         System.out.println("--------------------------------------------------------");
  97.         for (int  i = 0; i < MatrixCost.size() + 1; i++){
  98.  
  99.             if(i < MatrixCost.size()){
  100.                 System.out.print("\t A" + (i+1) + "\t   |");
  101.                 for (int j = 0; j < MatrixCost.get(0).size() + 1; j++){
  102.                     if(j < MatrixCost.get(0).size()){
  103.                         System.out.printf("%6d|", MatrixCost.get(i).get(j));
  104.                     }else{
  105.                         System.out.println("\t\t   |");
  106.                     }
  107.  
  108.                 }
  109.                 System.out.print("\t\t   |");
  110.                 for (int j = 0; j < MatrixOrder.get(0).size() + 1; j++){
  111.                     if(j < MatrixOrder.get(0).size()){
  112.                         if(MatrixOrder.get(i).get(j) > 0){
  113.                             System.out.printf(ANSI_RED+ "%-6d"+ANSI_RESET+"|", MatrixOrder.get(i).get(j));
  114.                         }else{
  115.                             System.out.printf("%-6d|", MatrixOrder.get(i).get(j));
  116.                         }
  117.                     }else{
  118.                         System.out.printf("%8d|", MatrixStockAndNeeds.get(0).get(i));
  119.                     }
  120.  
  121.                 }
  122.                 System.out.println();
  123.                 System.out.println("--------------------------------------------------------");
  124.             }else{
  125.                 System.out.print("Потребности|");
  126.                 for (int j = 0; j < MatrixOrder.get(0).size() + 1; j++){
  127.                     if(j < MatrixOrder.get(0).size()) {
  128.                         System.out.printf("%-6d|", MatrixStockAndNeeds.get(1).get(j));
  129.                     }else{
  130.                         System.out.printf("%8d|", CheckEqualsStocksAndNeeds(MatrixStockAndNeeds));
  131.                     }
  132.                 }
  133.             }
  134.         }
  135.         System.out.println("\n");
  136.     }
  137.     public static void MethodNorthWestAngle(ArrayList<ArrayList<Integer>> MatrixCost,
  138.                                             ArrayList<ArrayList<Integer>> MatrixOrder,
  139.                                             ArrayList<ArrayList<Integer>> MatrixStockAndNeeds){
  140.         int min;
  141.         for(int i = 0; i < MatrixCost.size(); i++){
  142.             for(int j = 0; j < MatrixCost.get(0).size(); j++){
  143.                 if(checkEmptyNeeds(MatrixStockAndNeeds,j)) continue;
  144.                 min = Math.min(MatrixStockAndNeeds.get(0).get(i),MatrixStockAndNeeds.get(1).get(j));
  145.                 MatrixStockAndNeeds.get(0).set(i,MatrixStockAndNeeds.get(0).get(i) - min);
  146.                 MatrixStockAndNeeds.get(1).set(j,MatrixStockAndNeeds.get(1).get(j) - min);
  147.                 MatrixOrder.get(i).set(j,min);
  148.                 outputTable(MatrixCost, MatrixOrder, MatrixStockAndNeeds);
  149.                 if(checkEmptyStock(MatrixStockAndNeeds,i)) break;
  150.             }
  151.         }
  152.     }
  153.     public static boolean checkEmptyStock(ArrayList<ArrayList<Integer>> MatrixStockAndNeeds,int RowStock){
  154.         return MatrixStockAndNeeds.get(0).get(RowStock) == 0;
  155.     }
  156.  
  157.     public static boolean checkEmptyNeeds(ArrayList<ArrayList<Integer>> MatrixStockAndNeeds,int ColumnNeeds){
  158.         return MatrixStockAndNeeds.get(1).get(ColumnNeeds) == 0;
  159.     }
  160.     // возвращает разность между поставщиком и магазином,
  161.     // если пришло отрицательное то добавляем такого поставщика,
  162.     // если положительное то такой магазин, если ноль то successful
  163.     public static int CheckEqualsStocksAndNeeds(ArrayList<ArrayList<Integer>> MatrixStockAndNeeds){
  164.         int summStocks = 0;
  165.         int summNeeds = 0;
  166.         for(int i = 0; i < MatrixStockAndNeeds.get(0).size(); i++){
  167.             summStocks += MatrixStockAndNeeds.get(0).get(i);
  168.         }
  169.         for(int i = 0; i < MatrixStockAndNeeds.get(1).size(); i++){
  170.             summNeeds += MatrixStockAndNeeds.get(1).get(i);
  171.         }
  172.         return summStocks - summNeeds;
  173.     }
  174.     public static void AddNewProviderOrStore(ArrayList<ArrayList<Integer>> MatrixCost,
  175.                                              ArrayList<ArrayList<Integer>> MatrixOrder,
  176.                                              ArrayList<ArrayList<Integer>> MatrixStockAndNeeds,
  177.                                              int deltaStockAndNeeds){
  178.         if(deltaStockAndNeeds < 0){ // Новый поставщик
  179.             System.out.println("\nБыл добавлен новый поставщик\n");
  180.             deltaStockAndNeeds = Math.abs(deltaStockAndNeeds);
  181.             MatrixCost.add(new ArrayList<Integer>());
  182.             MatrixOrder.add(new ArrayList<Integer>());
  183.             for (int i = 0; i < MatrixCost.get(0).size(); i++){
  184.                 MatrixCost.get(MatrixCost.size()-1).add(0);
  185.                 MatrixOrder.get(MatrixOrder.size()-1).add(0);
  186.             }
  187.             MatrixStockAndNeeds.get(0).add(deltaStockAndNeeds);
  188.         }else{ // Новый магазин
  189.             System.out.println("\nБыл добавлен новый магазин\n");
  190.             for(int i = 0; i < MatrixCost.size(); i++){
  191.                 MatrixCost.get(i).add(0);
  192.                 MatrixOrder.get(i).add(0);
  193.             }
  194.             MatrixStockAndNeeds.get(1).add(deltaStockAndNeeds);
  195.         }
  196.  
  197.     }
  198.     public static void resultCost(int rangMatrix, ArrayList<ArrayList<Integer>> MatrixCost, ArrayList<ArrayList<Integer>> MatrixOrder){
  199.         int Z = 0;
  200.         int filledCeils = countFilledCeils(MatrixOrder);
  201.         System.out.println("Ранг исходной матрицы равен = " + rangMatrix + " Заполненных клеток в таблице равно = " + filledCeils);
  202.         if (rangMatrix != filledCeils) System.out.println("Где то ты оступился...");
  203.         System.out.print("Результат алгоритма Zmin = ");
  204.         for(int i = 0; i < MatrixOrder.size(); i++){
  205.             for(int j = 0; j < MatrixOrder.get(0).size(); j++){
  206.                 if(MatrixOrder.get(i).get(j) > 0) {
  207.                     System.out.print("("+ MatrixOrder.get(i).get(j) +" * "+ MatrixCost.get(i).get(j) +")");
  208.                     if(i < MatrixOrder.size()-1 && j < MatrixOrder.get(0).size()) System.out.print("+");
  209.                     Z+= MatrixOrder.get(i).get(j) * MatrixCost.get(i).get(j);
  210.                 }
  211.             }
  212.         }
  213.         System.out.println(" = " + Z);
  214.  
  215.     }
  216.     public static int countFilledCeils(ArrayList<ArrayList<Integer>> MatrixOrder){
  217.         int filledCeils = 0;
  218.         for(int i = 0; i < MatrixOrder.size(); i++){
  219.             for(int j = 0; j < MatrixOrder.get(0).size(); j++){
  220.                 if(MatrixOrder.get(i).get(j) > 0) filledCeils++;
  221.             }
  222.         }
  223.         return filledCeils;
  224.     }
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement