001 002 package algo; 003 004 import java.io.Serializable; 005 006 /** 007 * A sequential algorithm for an euclidean 2d TSP Problem. 008 * @author Heinz Kredel. 009 */ 010 public class SeqByteTSP implements TSPInf, Serializable { 011 012 protected Graph graph; 013 protected Point[] points; 014 protected double best; // beware of threads 015 protected Path bestPath; // beware of threads 016 protected long iter; 017 protected long maxiter; 018 019 020 /** 021 * @param p the cities. 022 */ 023 public SeqByteTSP(Point[] p) { 024 this.points = p; 025 graph = new PlaneGraph(p); 026 bestPath = PathByteArray.standardPath(graph); // standard path 027 best = bestPath.cost(); 028 iter = 0; 029 maxiter = Long.MAX_VALUE; 030 } 031 032 033 /** 034 * @param p the cities. 035 * @param g the corresponding graph. 036 */ 037 public SeqByteTSP(Point[] p, Graph g) { 038 this.points = p; 039 graph = g; 040 bestPath = PathByteArray.standardPath(graph); // standard path 041 best = bestPath.cost(); 042 iter = 0; 043 maxiter = Long.MAX_VALUE; 044 } 045 046 047 /** 048 * @return number of iterations. 049 */ 050 public long getIterations() { 051 return iter; 052 } 053 054 055 /** 056 * @return maxiter. 057 */ 058 public long getMaxIterations() { 059 return maxiter; 060 } 061 062 063 /** 064 * @param m new maxIter. 065 * @return old maxIter. 066 */ 067 public long setMaxIterations(long m){ 068 long x = maxiter; 069 maxiter = m; 070 return x; 071 } 072 073 074 /** 075 * @return the actual best Path. 076 */ 077 public Path actualBest() { 078 return bestPath; 079 } 080 081 082 /** 083 * @param b a possible new best path. 084 */ 085 public void setBest(Path b) { 086 if ( b == null ) { 087 return; 088 } 089 if ( b.cost() < best ) { 090 bestPath = b; 091 best = b.cost(); 092 } 093 } 094 095 096 /** 097 * @return getBest(Long.MAX_VALUE). 098 */ 099 public Path getBest() { 100 return getBest(Long.MAX_VALUE); 101 } 102 103 104 /** 105 * @param max maximal number of iterations. 106 * @return best Path. 107 */ 108 public Path getBest(long max) { 109 iter = 0; 110 maxiter = max; 111 bestPath = PathByteArray.standardPath(graph); // standard path 112 best = bestPath.cost(); 113 if ( bestPath.length() <= 2 ) { 114 return bestPath; 115 } 116 Path path = PathByteArray.onePath(graph); // one/empty path 117 getBest(path); 118 System.out.println("iterations = " + iter); 119 return bestPath; 120 } 121 122 123 /** 124 * @param path a starting path. 125 */ 126 public void getBest(Path path) { 127 Path[] ps = path.nextPaths(); 128 iter += ps.length; 129 if ( path.length()+1 == path.maxsize() ) { 130 for ( int i = 0; i < ps.length; i++ ) { // branch 131 //System.out.println("seq path = " + ps[i]); 132 if ( ps[i].cost() < best ) { 133 best = ps[i].cost(); 134 bestPath = ps[i]; 135 System.out.println("seq best = " + bestPath); 136 } 137 } 138 return; 139 } 140 if ( iter >= maxiter ) { 141 return; 142 } 143 if ( path.length()+5 >= path.maxsize() ) { 144 for ( int i = 0; i < ps.length; i++ ) { // branch 145 if ( ps[i].cost() < best ) { // cut 146 //System.out.print("#"); 147 getBestRec( ps[i].copyMax(), path.length()+1 ); // changes best and bestPath 148 //stack.add( ps[i] ); 149 } 150 } 151 return; 152 } 153 for ( int i = 0; i < ps.length; i++ ) { // branch 154 //System.out.println("seq path part = " + ps[i]); 155 if ( ps[i].cost() < best ) { // cut 156 getBest( ps[i] ); // changes best and bestPath 157 } 158 } 159 return; 160 } 161 162 163 /** 164 * @param path a starting path. 165 * @param depth length of this path. 166 */ 167 public void getBestRec(Path path, int depth) { 168 for ( int k = 0; k < path.maxsize()-depth; k++ ) { // branch 169 Path ps = path.nextPath(k); 170 iter++; 171 if ( depth+1 == path.maxsize() ) { 172 if ( ps.cost() < best ) { 173 best = ps.cost(); 174 bestPath = (Path)ps.clone(); 175 System.out.println("seq best = " + ps); 176 } 177 } 178 if ( iter >= maxiter ) { 179 return; 180 } 181 if ( ps.cost() < best ) { // cut 182 getBestRec( ps, depth+1 ); // changes best and bestPath 183 //stack.add( ps[i] ); 184 } 185 } 186 return; 187 } 188 189 }