/************************************************************************* Strathclyde Planning Group,* Department of Computer and Information Sciences,* University of Strathclyde, Glasgow, UK* http://planning.cis.strath.ac.uk/** Copyright 2007, Keith Halsey* Copyright 2008, Andrew Coles and Amanda Smith** (Questions/bug reports now to be sent to Andrew Coles)** This file is part of JavaFF.** JavaFF is free software: you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Foundation, either version 2 of the License, or* (at your option) any later version.** JavaFF is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.** You should have received a copy of the GNU General Public License* along with JavaFF. If not, see <http://www.gnu.org/licenses/>.*************************************************************************/package javaff.search;import javaff.planning.State;import javaff.planning.Filter;import java.util.Set;import java.util.SortedSet;import java.util.TreeSet;import java.util.LinkedList;import java.util.Comparator;import java.math.BigDecimal;import java.util.Hashtable;import java.util.Iterator;import javaff.search.SuccessorSelector;public class LocalSearch extends Search{protected BigDecimal bestHValue;protected Hashtable closed;protected LinkedList open;protected Filter filter = null;protected SuccessorSelector successorSelector = null;protected int depthBound = 10000;protected int restartBound = 10000;//protected State bestState = null;public LocalSearch(State s){this(s, new HValueComparator());}public LocalSearch(State s, Comparator c){super(s);setComparator(c);closed = new Hashtable();open = new LinkedList();}public void setFilter(Filter f){filter = f;}public State removeNext(){return (State) ((LinkedList) open).removeFirst();}public boolean needToVisit(State s) {Integer Shash = new Integer(s.hashCode()); // compute hash for stateState D = (State) closed.get(Shash); // see if its on the closed listif (closed.containsKey(Shash) && D.equals(s)) return false; // if it is return falseclosed.put(Shash, s); // otherwise put it onreturn true; // and return true}public void setSelector(SuccessorSelector s){successorSelector = s;}public void setDepthBound(int db){depthBound = db;}public void setRestartBound(int rb){restartBound = rb;}public State search() {int depth = 0;int restarted = 0;if (start.goalReached()) { // wishful thinkingreturn start;}//BigDecimal bestHValue = null;needToVisit(start); // dummy call (adds start to the list of 'closed' states so we don't visit it againopen.add(start); // add it to the open lbestHValueist//bestHValue = start.getHValue(); // and take its heuristic value as the best so far//javaff.JavaFF.infoOutput.println("initial heuristic: " + bestHValue);while (restarted < restartBound){while (!open.isEmpty() && depth < depthBound) // whilst still states to consider{State s = removeNext(); // get the next oneSet successors = s.getNextStates(filter.getActions(s)); // and find its neighbourhoodif (successorSelector == null){Iterator succItr = successors.iterator();BigDecimal bestHValue = s.getHValue(); //Need to check if the heuristic we want be inf or the heuristic value of current nodewhile (succItr.hasNext()) {State succ = (State) succItr.next(); // next successor//NOTE: It's possible that the heuristic value of current successor is greater than bestHValue i.e. succ.getHValue().compareTo(bestHValue) == 1if (needToVisit(succ)) {if (succ.goalReached()) { // if we've found a goal state - return it as the solutionreturn succ;} else if (succ.getHValue().compareTo(bestHValue) < 0) {// if we've found a state with a better heuristic value than the best seen so farbestHValue = succ.getHValue(); // note the new best avlue//javaff.JavaFF.infoOutput.println(bestHValue);open = new LinkedList(); // clear the open listopen.add(succ); // put this on it} else if (succ.getHValue().compareTo(bestHValue) == 0){open.add(succ); // otherwise, add to the open list}else{continue;}}}if (open.size() <= 0){//return null;open.add(s);break;}else{int seed = open.size();int randomNum = javaff.JavaFF.generator.nextInt(seed);State selected = (State) open.get(randomNum);open = new LinkedList();open.add(selected);}}else{/**if (successors.size() == 0){break; // Prevent null pointer}*/State selected_succ = successorSelector.choose(successors);//successors.add(selected_succ); // Should I ?open = new LinkedList();open.add(selected_succ);if (selected_succ.goalReached()){return selected_succ;}}/**if (open.size() <= 0){open = new LinkedList(); // Alternative solution: open.clear(), actually I don't really want to create that many LinkedList instances}else{int seed = open.size();int randomNum = javaff.JavaFF.generator.nextInt(seed);State selected = (State) open.get(randomNum);open = new LinkedList();open.add(selected);}*/depth++;//End of finding neighborhood of current successor//Maybe not necessary as LinkedList open is tracking the best state all the time/**if (open.size() != 0 ){bestState = (State) open.getFirst();}*/}restarted++;}return null;}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。