Advertisement
Guest User

State_Space_Explorer_1.java

a guest
Feb 13th, 2021
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.72 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class State_Space_Explorer_1 {
  4.    
  5.     //private static final String fileName = "test.txt";
  6.     private static final String fileName = "sokwhole.txt";
  7.     private static final int mapIndex = 23;
  8.    
  9.     private static MapHandler .NetworkRep netrep;
  10.     private static Queue     <State> stateQueue = new ArrayDeque <> ();
  11.     private static SortedSet <State> forwardStateSet, backwardStateSet;
  12.     private static ArrayList <State> uniqueForwardStates, uniqueBackwardStates;
  13.     private static ArrayList <State> matchedForwardStates, matchedBackwardStates;
  14.    
  15.     private static String formatString;
  16.    
  17.     public static void main (String [] args) {
  18.        
  19.         String [] mapLines = MapLoader .load (fileName, mapIndex);
  20.         if (null == mapLines) {
  21.             System .out .println ("File reading error");
  22.             return;
  23.         }
  24.         if (!MapHandler .process (mapLines)) {
  25.             System .out .println (MapHandler .errorMessage ());
  26.             return;
  27.         }
  28.         MapHandler .setMarkersType (3);
  29.         MapHandler .displayState (MapHandler .stateCells ());
  30.         displayMapStats ();
  31.         //MapHandler .displayMaze ();
  32.         //MapHandler .displayMap ();
  33.        
  34.         netrep = MapHandler .networkRepresentation ();
  35.         State .init (netrep);
  36.         processForward ();
  37.         processBackward ();
  38.         matchStates ();
  39.        
  40.         displaySetStats ();
  41.         //displayForwardSet ();
  42.     }
  43.    
  44.     private static void processForward () {
  45.         int k;
  46.         State state;
  47.         State [] states;
  48.        
  49.         stateQueue .clear ();
  50.         forwardStateSet = new TreeSet <> ();
  51.         state = new State (MapHandler .stateCells ());
  52.         forwardStateSet .add (state);
  53.         stateQueue      .add (state);
  54.        
  55.         while (!stateQueue .isEmpty ()) {
  56.             states = stateQueue .poll () .expandForth ();
  57.             for (k = 0; states .length > k; ++k) {
  58.                 state = states [k];
  59.                 if (forwardStateSet .add (state)) {
  60.                     stateQueue      .add (state);
  61.                     //MapHandler .displayState (state .stateCells ());
  62.                 }
  63.             }
  64.         }
  65.     }
  66.    
  67.     private static void processBackward () {
  68.         int k, l, length, limit;
  69.         short cell;
  70.         short [] netrepValues, stateCells, newStateCells;
  71.         int   [] netrepIndices;
  72.         State state;
  73.         State [] states;
  74.        
  75.         netrepValues  = netrep .values ();
  76.         netrepIndices = netrep .indices ();
  77.         stateQueue .clear ();
  78.         backwardStateSet = new TreeSet <> ();
  79.         stateCells = MapHandler .targetCells ();
  80.         Arrays .sort (stateCells);
  81.         length = stateCells .length;
  82.        
  83.         for (k = 0; length > k; ++k) {
  84.             cell = stateCells [k];
  85.             limit = netrepIndices [cell + 1];
  86.             for (l = netrepIndices [cell] + 1; limit > l; l += 4) {
  87.                 cell = netrepValues [l];
  88.                 if (0 > Arrays .binarySearch (stateCells, cell)) {
  89.                     newStateCells = Arrays .copyOf (stateCells, length + 1);
  90.                     newStateCells [length] = cell;
  91.                     state = new State (newStateCells);
  92.                     if (backwardStateSet .add (state)) {
  93.                         stateQueue       .add (state);
  94.                         //MapHandler .displayState (newStateCells);
  95.                     }
  96.                 }
  97.             }
  98.         }
  99.        
  100.         while (!stateQueue .isEmpty ()) {
  101.             states = stateQueue .poll () .expandBack ();
  102.             for (k = 0; states .length > k; ++k) {
  103.                 state = states [k];
  104.                 if (backwardStateSet .add (state)) {
  105.                     stateQueue       .add (state);
  106.                     //MapHandler .displayState (state .stateCells ());
  107.                 }
  108.             }
  109.         }
  110.     }
  111.    
  112.     private static void matchStates () {
  113.         Iterator <State> forwardStatesIterator, backwardStatesIterator;
  114.         State forwardState, backwardState;
  115.        
  116.         uniqueForwardStates    = new ArrayList <> ();
  117.         uniqueBackwardStates   = new ArrayList <> ();
  118.         matchedForwardStates   = new ArrayList <> ();
  119.         matchedBackwardStates  = new ArrayList <> ();
  120.         forwardStatesIterator  = forwardStateSet  .iterator ();
  121.         backwardStatesIterator = backwardStateSet .iterator ();
  122.         forwardState  = forwardStatesIterator  .next ();
  123.         backwardState = backwardStatesIterator .next ();
  124.        
  125.         while (forwardStatesIterator .hasNext () && backwardStatesIterator .hasNext ()) {
  126.             switch (forwardState .compareTo (backwardState)) {
  127.             case 0:
  128.                 matchedForwardStates  .add (forwardState);
  129.                 matchedBackwardStates .add (backwardState);
  130.                 forwardState  = forwardStatesIterator  .next ();
  131.                 backwardState = backwardStatesIterator .next ();
  132.                 break;
  133.             case -1:
  134.                 uniqueForwardStates   .add (forwardState);
  135.                 forwardState  = forwardStatesIterator  .next ();
  136.                 break;
  137.             case 1:
  138.                 //MapHandler .displayState (backwardState .stateCells ());
  139.                 uniqueBackwardStates  .add (backwardState);
  140.                 backwardState = backwardStatesIterator .next ();
  141.                 break;
  142.             }
  143.         }
  144.        
  145.         if (forwardStatesIterator .hasNext ()) {
  146.             while (forwardStatesIterator  .hasNext () && 0 != forwardState .compareTo (backwardState)) {
  147.                 uniqueForwardStates   .add (forwardState);
  148.                 forwardState  = forwardStatesIterator .next ();
  149.             }
  150.             if (forwardStatesIterator .hasNext ()) {
  151.                 matchedForwardStates  .add (forwardState);
  152.                 matchedBackwardStates .add (backwardState);
  153.                 while (forwardStatesIterator .hasNext ()) {
  154.                     uniqueForwardStates .add (forwardStatesIterator .next ());
  155.                 }
  156.             } else {
  157.                 uniqueForwardStates   .add (forwardState);
  158.                 uniqueBackwardStates  .add (backwardState);
  159.             }
  160.         } else {
  161.             while (backwardStatesIterator .hasNext () && 0 != forwardState .compareTo (backwardState)) {
  162.                 uniqueBackwardStates  .add (backwardState);
  163.                 backwardState = backwardStatesIterator .next ();
  164.             }
  165.             if (backwardStatesIterator .hasNext ()) {
  166.                 matchedForwardStates  .add (forwardState);
  167.                 matchedBackwardStates .add (backwardState);
  168.                 while (backwardStatesIterator .hasNext ()) {
  169.                     uniqueBackwardStates .add (backwardStatesIterator .next ());
  170.                 }
  171.             } else {
  172.                 uniqueForwardStates   .add (forwardState);
  173.                 uniqueBackwardStates  .add (backwardState);
  174.             }
  175.         }
  176.     }
  177.    
  178.     private static int countPlacements (Collection <State> statesCollection) {
  179.         int result;
  180.         Iterator <State> statesIterator;
  181.         State state, oldState;
  182.        
  183.         if (statesCollection .isEmpty ()) {
  184.             return 0;
  185.         }
  186.        
  187.         statesIterator = statesCollection .iterator ();
  188.         oldState = statesIterator .next ();
  189.         result = 1;
  190.        
  191.         while (statesIterator .hasNext ()) {
  192.             state = statesIterator .next ();
  193.             if (oldState .isSamePlacementAs (state)) {
  194.                 continue;
  195.             }
  196.             oldState = state;
  197.             ++result;
  198.         }
  199.        
  200.         return result;
  201.     }
  202.    
  203.     @SuppressWarnings ("unused")
  204.     private static void displayStates (Collection <State> statesCollection) {
  205.         Iterator <State> statesIterator;
  206.         State state;
  207.        
  208.         statesIterator = statesCollection .iterator ();
  209.        
  210.         while (statesIterator .hasNext ()) {
  211.             state = statesIterator .next ();
  212.             System .out .println (String .format ("Moves: %d, pushes: %d", state .moveCount (), state .pushCount ()));
  213.             MapHandler .displayState (state .stateCells ());
  214.         }
  215.     }
  216.    
  217.     private static long nchoosek (int n, int k) {
  218.         long result = 1;
  219.         for (int l = 1; 0 < k; ++l, --k, --n) {
  220.             result *= n;
  221.             result /= l;
  222.         }
  223.         return result;
  224.     }
  225.    
  226.     private static void displayMapStats () {
  227.         int cellsCount, boxesCount;
  228.         long placementsCount, statesCount;
  229.         String placementsString, statesString;
  230.        
  231.         cellsCount = MapHandler .cellsCount ();
  232.         boxesCount = MapHandler .boxesCount ();
  233.         placementsCount = nchoosek (cellsCount, boxesCount);
  234.         statesCount = placementsCount * (cellsCount - boxesCount);
  235.        
  236.         placementsString = formattedNumber (placementsCount);
  237.         statesString     = formattedNumber (statesCount);
  238.         formatString = String .format (
  239.                 "%%s   %%%ds   %%%ds",
  240.                 Integer .max (10, placementsString .length ()),
  241.                 Integer .max (6,  statesString     .length ()));
  242.        
  243.         System .out .println (String .format ("Cells: %5d", cellsCount));
  244.         System .out .println (String .format ("Boxes: %5d", boxesCount));
  245.         System .out .println (String .format (formatString, "                ", "Placements", "States"));
  246.         System .out .println (String .format (formatString, "Theoretical:    ", placementsString, statesString));
  247.     }
  248.    
  249.     private static void displaySetStats () {
  250.         String placementsString, statesString;
  251.        
  252.         placementsString = formattedNumber (countPlacements (forwardStateSet));
  253.         statesString     = formattedNumber (forwardStateSet      .size ());
  254.         System .out .println (String .format (formatString, "Forward total:  ", placementsString, statesString));
  255.         placementsString = formattedNumber (countPlacements (uniqueForwardStates));
  256.         statesString     = formattedNumber (uniqueForwardStates  .size ());
  257.         System .out .println (String .format (formatString, "Forward dead:   ", placementsString, statesString));
  258.         placementsString = formattedNumber (countPlacements (matchedForwardStates));
  259.         statesString     = formattedNumber (matchedForwardStates .size ());
  260.         System .out .println (String .format (formatString, "Matched:        ", placementsString, statesString));
  261.         placementsString = formattedNumber (countPlacements (uniqueBackwardStates));
  262.         statesString     = formattedNumber (uniqueBackwardStates .size ());
  263.         System .out .println (String .format (formatString, "Backward dead:  ", placementsString, statesString));
  264.         placementsString = formattedNumber (countPlacements (backwardStateSet));
  265.         statesString     = formattedNumber (backwardStateSet     .size ());
  266.         System .out .println (String .format (formatString, "Backward total: ", placementsString, statesString));
  267.         System .out .println ();
  268.     }
  269.    
  270.     private static String formattedNumber (long number) {
  271.         int k, l, length;
  272.         String numberString;
  273.         StringBuilder result;
  274.        
  275.         numberString = Long .toString (number);
  276.         length = numberString .length ();
  277.         k = 0;
  278.         l = length % 3;
  279.         if (0 == l) {
  280.             l = 3;
  281.         }
  282.         result = new StringBuilder ();
  283.        
  284.         while (true) {
  285.             result .append (numberString .substring (k, l));
  286.             k = l;
  287.             l += 3;
  288.             if (length == k) {
  289.                 break;
  290.             }
  291.             result .append (' ');
  292.         }
  293.        
  294.         return result .toString ();
  295.     }
  296. }
  297.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement