From: Stefan F. <ste...@us...> - 2010-05-20 23:13:29
|
Update of /cvsroot/rails/18xx/rails/algorithms In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv26538/rails/algorithms Modified Files: NetworkTrain.java RevenueCalculator.java RevenueAdapter.java RevenueTrainRun.java RevenueManager.java NetworkVertex.java Added Files: RevenueDynamicModifier.java Log Message: Added support for 18EU Pullman, introduced RevenueDynamicModifier Index: RevenueCalculator.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/algorithms/RevenueCalculator.java,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** RevenueCalculator.java 20 May 2010 19:57:01 -0000 1.15 --- RevenueCalculator.java 20 May 2010 23:13:21 -0000 1.16 *************** *** 89,92 **** --- 89,95 ---- private RevenueAdapter revenueAdapter; + // activate dynamic revenue modifiers + private boolean callDynamicModifiers; + // termination results private static enum Terminated { *************** *** 155,158 **** --- 158,163 ---- useRevenuePrediction = false; + + callDynamicModifiers = false; } *************** *** 221,224 **** --- 226,233 ---- } + void setDynamicModifiers(boolean activate) { + callDynamicModifiers = activate; + } + int[][] getOptimalRun() { log.info("RC: currentBestRun = " + Arrays.deepToString(currentBestRun)); *************** *** 226,229 **** --- 235,253 ---- } + int[][] getCurrentRun() { + int[][] currentRun = new int[nbTrains][nbVertexes+1]; + for (int j = startTrainSet; j <= finalTrainSet; j++) { + for (int v = 0; v < nbVertexes + 1; v++) { + if (v < trainStackPos[j]) { + currentRun[j][v] = trainVertexStack[j][v]; + } else { + currentRun[j][v] = -1; // terminator + break; + } + } + } + return currentRun; + } + int getNumberOfEvaluations() { return nbEvaluations; *************** *** 680,683 **** --- 704,709 ---- // } } + + if (callDynamicModifiers) totalValue += revenueAdapter.dynamicEvaluation(); nbEvaluations++; *************** *** 747,750 **** --- 773,778 ---- } + if (callDynamicModifiers) totalValue += revenueAdapter.dynamicPrediction(); + nbPredictions++; --- NEW FILE: RevenueDynamicModifier.java --- package rails.algorithms; /** * Classes that change properties of the revenue calculation * after the actual calculation started implement the dynamic modifier. * * They have to register themselves to the RevenueManager via the GameManager instance. * @author freystef * */ public interface RevenueDynamicModifier { /** after the setup of the revenueAdapter, but before the actual calculation * if return is false => deactivate */ public boolean prepareModifier(RevenueAdapter revenueAdapter); /** returns the value used for prediction */ public int predictionValue(RevenueAdapter revenueAdapter); /** returns the value used for evaluation */ public int evaluationValue(RevenueAdapter revenueAdapter); /** returns the prettyPrintName */ public String prettyPrint(RevenueAdapter revenueAdapter); } Index: RevenueManager.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/algorithms/RevenueManager.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** RevenueManager.java 18 May 2010 21:36:12 -0000 1.2 --- RevenueManager.java 20 May 2010 23:13:21 -0000 1.3 *************** *** 30,36 **** --- 30,38 ---- private Set<RevenueStaticModifier> staticModifiers; + private Set<RevenueDynamicModifier> dynamicModifiers; public RevenueManager() { staticModifiers = new HashSet<RevenueStaticModifier>(); + dynamicModifiers = new HashSet<RevenueDynamicModifier>(); } *************** *** 61,64 **** --- 63,91 ---- } } + + // define dynamic modifiers + modifierTags = tag.getChildren("DynamicModifier"); + + if (modifierTags != null) { + for (Tag modifierTag:modifierTags) { + // get classname + String className = modifierTag.getAttributeAsString("class"); + if (className == null) { + throw new ConfigurationException(LocalText.getText( + "ComponentHasNoClass", "DynamicModifier")); + } + // create modifier + RevenueDynamicModifier modifier; + try { + modifier = (RevenueDynamicModifier) Class.forName(className).newInstance(); + } catch (Exception e) { + throw new ConfigurationException(LocalText.getText( + "ClassCannotBeInstantiated", className), e); + } + // add them to the revenueManager + dynamicModifiers.add(modifier); + log.info("Added modifier " + className); + } + } } *************** *** 74,78 **** public void addStaticModifier(RevenueStaticModifier modifier) { staticModifiers.add(modifier); ! log.info("Added modifier " + modifier); } --- 101,123 ---- public void addStaticModifier(RevenueStaticModifier modifier) { staticModifiers.add(modifier); ! log.info("Revenue Manager: Added modifier " + modifier); ! } ! ! public boolean removeStaticModifier(RevenueStaticModifier modifier) { ! boolean result = staticModifiers.remove(modifier); ! if (result) { ! log.info("RevenueManager: Removed modifier " + modifier); ! } else { ! log.info("RevenueManager: Cannot remove" + modifier); ! } ! return result; ! } ! ! Set<RevenueStaticModifier> getStaticModifiers() { ! return staticModifiers; ! } ! ! Set<RevenueDynamicModifier> getDynamicModifiers() { ! return dynamicModifiers; } *************** *** 81,85 **** modifier.modifyCalculator(revenueAdapter); } ! } --- 126,138 ---- modifier.modifyCalculator(revenueAdapter); } ! } ! ! Set<RevenueDynamicModifier> callDynamicModifiers(RevenueAdapter revenueAdapter) { ! Set<RevenueDynamicModifier> activeModifiers = new HashSet<RevenueDynamicModifier>(); ! for (RevenueDynamicModifier modifier:dynamicModifiers) { ! if (modifier.prepareModifier(revenueAdapter)) ! activeModifiers.add(modifier); ! } ! return activeModifiers; } Index: NetworkVertex.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/algorithms/NetworkVertex.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** NetworkVertex.java 20 May 2010 19:57:01 -0000 1.13 --- NetworkVertex.java 20 May 2010 23:13:21 -0000 1.14 *************** *** 298,301 **** --- 298,312 ---- } + /** + * Returns the maximum positive value (lower bound zero) + */ + public static int maxVertexValue(Collection<NetworkVertex> vertices) { + int maximum = 0; + for (NetworkVertex vertex:vertices) { + maximum = Math.max(maximum, vertex.getValue()); + } + return maximum; + } + public static void initAllRailsVertices(Collection<NetworkVertex> vertices, PublicCompanyI company, PhaseI phase) { Index: RevenueAdapter.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/algorithms/RevenueAdapter.java,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** RevenueAdapter.java 20 May 2010 19:57:01 -0000 1.17 --- RevenueAdapter.java 20 May 2010 23:13:21 -0000 1.18 *************** *** 3,7 **** import java.awt.EventQueue; import java.awt.geom.GeneralPath; - import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Arrays; --- 3,6 ---- *************** *** 61,64 **** --- 60,65 ---- private List<NetworkEdge> rcEdges; private List<RevenueTrainRun> optimalRun; + private Set<RevenueDynamicModifier> dynamicModifiers; + // revenue listener to communicate results *************** *** 135,138 **** --- 136,143 ---- } } + + public void removeTrain(NetworkTrain train) { + trains.remove(train); + } public boolean addTrainByString(String trainString) { *************** *** 194,198 **** --- 199,205 ---- gameManager.getRevenueManager().callStaticModifiers(this); } + } + private void defineVertexVisitSets() { // define map of all locationNames *************** *** 245,252 **** public void initRevenueCalculator(){ // optimize graph (optimizeGraph clones the graph) rcGraph = NetworkGraphBuilder.optimizeGraph(graph, protectedVertices); ! // define the vertices and edges lists rcVertices = new ArrayList<NetworkVertex>(rcGraph.vertexSet()); --- 252,266 ---- public void initRevenueCalculator(){ + + // add all dynamic modifiers + if (gameManager.getRevenueManager() != null) { + dynamicModifiers = gameManager.getRevenueManager().callDynamicModifiers(this); + } else { + dynamicModifiers = null; + } // optimize graph (optimizeGraph clones the graph) rcGraph = NetworkGraphBuilder.optimizeGraph(graph, protectedVertices); ! // define the vertices and edges lists rcVertices = new ArrayList<NetworkVertex>(rcGraph.vertexSet()); *************** *** 396,399 **** --- 410,415 ---- } + // activate dynamic modifiers + rc.setDynamicModifiers(dynamicModifiers != null); } *************** *** 458,464 **** --- 474,507 ---- return value; } + public List<RevenueTrainRun> getOptimalRun() { return optimalRun; } + + public List<RevenueTrainRun> getCurrentRun() { + return convertRcRun(rc.getCurrentRun()); + } + + /** + * is called by rc for dynamic evaluations + */ + int dynamicEvaluation() { + int value = 0; + for (RevenueDynamicModifier modifier:dynamicModifiers) { + value += modifier.evaluationValue(this); + } + return value; + } + + /** + * is called by rc for dynamic predictions + */ + int dynamicPrediction() { + int value = 0; + for (RevenueDynamicModifier modifier:dynamicModifiers) { + value += modifier.predictionValue(this); + } + return value; + } public void addRevenueListener(RevenueListener listener) { *************** *** 494,497 **** --- 537,545 ---- runPrettyPrint.append(run.prettyPrint()); } + // add dynamic Modifier + for (RevenueDynamicModifier modifier:dynamicModifiers) { + runPrettyPrint.append(modifier.prettyPrint(this)); + } + return runPrettyPrint.toString(); } Index: RevenueTrainRun.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/algorithms/RevenueTrainRun.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** RevenueTrainRun.java 20 May 2010 19:57:01 -0000 1.4 --- RevenueTrainRun.java 20 May 2010 23:13:21 -0000 1.5 *************** *** 36,41 **** } ! void addVertex(NetworkVertex vertex) { ! vertices.add(vertex); } --- 36,45 ---- } ! public List<NetworkVertex> getVertices() { ! return vertices; ! } ! ! public NetworkTrain getTrain() { ! return train; } *************** *** 57,60 **** --- 61,68 ---- } + void addVertex(NetworkVertex vertex) { + vertices.add(vertex); + } + private String prettyPrintHexName(NetworkVertex vertex) { if (vertex.isVirtual()) { Index: NetworkTrain.java =================================================================== RCS file: /cvsroot/rails/18xx/rails/algorithms/NetworkTrain.java,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -d -r1.8 -r1.9 *** NetworkTrain.java 20 May 2010 19:57:01 -0000 1.8 --- NetworkTrain.java 20 May 2010 23:13:21 -0000 1.9 *************** *** 46,55 **** String trainName = railsTrain.getName(); ! if (majors == -1) { ! return null;// protection against pullman ! } else { ! return new NetworkTrain(majors, minors, ignoreMinors, multiplyMajors, multiplyMinors, trainName, railsTrain); - } } --- 46,51 ---- String trainName = railsTrain.getName(); ! return new NetworkTrain(majors, minors, ignoreMinors, multiplyMajors, multiplyMinors, trainName, railsTrain); } |