code refactoring
Hill-Climbing refactor
@@ -5,7 +5,6 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Stack;
-import java.util.stream.Collectors;
public class HillClimbing {
public static void main(String[] args) {
@@ -79,6 +78,17 @@ public class HillClimbing {
return listOfStacks.stream()
.map(stack -> {
+ return applyOperationsOnState(listOfStacks, stack, currentStateHeuristics, goalStateStack);
+ })
+ .filter(Objects::nonNull)
+ .findFirst()
+ .orElse(null);
+ }
+
+ /**
+ * This method applies operations on the current state to get a new state
+ */
+ public State applyOperationsOnState(List<Stack<String>> listOfStacks, Stack<String> stack, int currentStateHeuristics, Stack<String> goalStateStack) {
State tempState;
List<Stack<String>> tempStackList = new ArrayList<>(listOfStacks);
String block = stack.pop();
@@ -91,10 +101,6 @@ public class HillClimbing {
if (tempState == null)
stack.push(block);
return tempState;
- })
- .filter(Objects::nonNull)
- .findFirst()
- .orElse(null);
}
/**
@@ -126,6 +132,18 @@ public class HillClimbing {
Optional<State> newState = currentStackList.stream()
.filter(stack -> stack != currentStack)
.map(stack -> {
+ return pushElementToStack(stack, block, currentStackList, currentStateHeuristics, goalStateStack);
+ })
+ .filter(Objects::nonNull)
+ .findFirst();
+
+ return newState.orElse(null);
+ }
+
+ /**
+ * This method pushes a block to the stack and returns new state if its closer to goal
+ */
+ private State pushElementToStack(Stack stack, String block, List<Stack<String>> currentStackList, int currentStateHeuristics, Stack<String> goalStateStack) {
stack.push(block);
int newStateHeuristics = getHeuristicsValue(currentStackList, goalStateStack);
if (newStateHeuristics > currentStateHeuristics) {
@@ -133,11 +151,6 @@ public class HillClimbing {
}
stack.pop();
return null;
- })
- .filter(Objects::nonNull)
- .findFirst();
-
- return newState.orElse(null);
}
/**
@@ -145,10 +158,19 @@ public class HillClimbing {
* state
*/
public int getHeuristicsValue(List<Stack<String>> currentState, Stack<String> goalStateStack) {
-
Integer heuristicValue;
heuristicValue = currentState.stream()
.mapToInt(stack -> {
+ return getHeuristicsValueForStack(stack, currentState, goalStateStack);
+ })
+ .sum();
+ return heuristicValue;
+ }
+
+ /**
+ * This method returns heuristics value for a particular stack
+ */
+ public int getHeuristicsValueForStack(Stack<String> stack, List<Stack<String>> currentState, Stack<String> goalStateStack) {
int stackHeuristics = 0;
boolean isPositioneCorrect = true;
int goalStartIndex = 0;
@@ -162,9 +184,6 @@ public class HillClimbing {
goalStartIndex++;
}
return stackHeuristics;
- })
- .sum();
- return heuristicValue;
}
}
