?? tsp.java
字號:
import java.applet.*;import java.util.*;import java.awt.*;import java.net.*;import java.io.*;public class TSP extends Applet implements Runnable { public int NCITY = 5; public int NGEONEURON; public static final double COUNTRY = 1.00; public static final double NEAR = 0.05; public static final Color bkC = new Color(0x000090); public static final Color bk2C = new Color(0x000050); public static final Color lnC = new Color(0xff0000); public static final Color ln2C = new Color(0xcccc00); public static final Color fgC = new Color(0xffffff); public Image homeI,offscreen; public int imagewidth ,imageheight; public Thread animator = null; public boolean please_stop = false; Font mF = new Font("Courier", Font.BOLD, 12); Font sF = new Font("Courier", Font.BOLD, 8); public int counter; public City city[]; public geoNeuron gn[]; public double r[][]; public double theta, phi, momentum; public Scrollbar cscroll; /////////////////////////////////////////////////////////////////// // // Init section // /////////////////////////////////////////////////////////////////// public void kohonenInit(){ theta = 0.5; phi = 0.5; momentum = 0.995; NCITY = cscroll.getValue()/10; NGEONEURON = NCITY*3; city = new City[NCITY]; for(int i = 0; i<NCITY; i++) city[i] = new City(Math.random()*COUNTRY, Math.random()*COUNTRY); double alpha = 0.0; gn = new geoNeuron[NGEONEURON]; for(int i = 0; i<NGEONEURON; i++){ gn[i] = new geoNeuron(0.5+0.5*Math.cos(alpha),0.5+0.5*Math.sin(alpha)); alpha += Math.PI *2.0 / (double)(NGEONEURON); } r = new double[NGEONEURON][NGEONEURON]; makeR(theta); counter = 0; } /////////////////////////////////////////////////////////////////// // // Problem section // /////////////////////////////////////////////////////////////////// //計算鄰域關系 public void makeR(double th){ for(int i=0; i<NGEONEURON; i++){ r[i][i]= 1.0; for(int j=i+1; j<NGEONEURON; j++){ r[i][j] = Math.exp( -1.0 * ( gn[i].dist(gn[j])*gn[i].dist(gn[j]) )/(2.0*th*th)); r[j][i] = r[i][j]; } } } // The body of the animator thread. public void run() { int idx,j; double x1,x2,mindist; int count = 0; while(!please_stop) { counter++; // CHOSE A RANDOM PATTERN idx = (int)(Math.random()*NCITY); x1 = city[idx].x+(Math.random()*NEAR)-NEAR/2; x2 = city[idx].y+(Math.random()*NEAR)-NEAR/2; city[idx].choose++; // SEARCH FOR MINIMAL mindist = 100000.0; j = -1; for(int i=0; i<NGEONEURON;i++){ double d = (x1 - gn[i].wx)*(x1 - gn[i].wx) + (x2 - gn[i].wy)*(x2 - gn[i].wy); if(d < mindist){ mindist = d; j = i; } } gn[j].update++; // UPDATE WEIGHTS for(int i=0; i<NGEONEURON;i++){ gn[i].wx += (phi * r[i][j] * (x1 - gn[i].wx)); gn[i].wy += (phi * r[i][j] * (x2 - gn[i].wy)); } // DECREASE LEARNING PARAMETERS phi *= momentum; theta *= momentum; // RE-COMPUTE r MATRIX makeR(theta); // PLOT RESULT EVERY 10 SESSIONS count = (count++)%10; if(count==0){ paint(this.getGraphics()); try {Thread.sleep(10);} catch (InterruptedException e){}; } } animator = null; } /////////////////////////////////////////////////////////////////// // // Functional section // /////////////////////////////////////////////////////////////////// public void init() { cscroll = new Scrollbar(Scrollbar.HORIZONTAL,NCITY*10, 10, 20, 2000); cscroll.setLineIncrement(10); cscroll.setPageIncrement(10); add(cscroll); kohonenInit(); } private int toXReal(double val){int w = this.size().width;return (int)(val *((double)w/2.0-50.0) / COUNTRY +25.0);} private int toYReal(double val){int h = this.size().height;return (int)(val *((double)h-50.0) / COUNTRY +25.0);} public void paintLeft(Graphics g) { Dimension size = this.size(); int w = size.width, h = size.height; g.setFont(mF); // CLEAR ALL g.setColor(bkC); g.fillRect(0, 0, w, h); // DRAW GRID g.setColor(bk2C); for(double i=0; i<=COUNTRY; i+=(COUNTRY/20.0)){ g.drawLine(toXReal(0.0),toYReal(i),toXReal(COUNTRY),toYReal(i)); g.drawLine(toXReal(i),toYReal(0.0),toXReal(i),toYReal(COUNTRY)); } //DRAW PATH g.setColor(lnC); for(int i=0; i<NGEONEURON; i++){ g.drawLine( toXReal(gn[i].wx),toYReal(gn[i].wy), toXReal(gn[(i+1)%NGEONEURON].wx),toYReal(gn[(i+1)%NGEONEURON].wy) ); //g.drawString(""+i+"-"+(gn[i].update*100/counter)+"%",toXReal(gn[i].wx),toYReal(gn[i].wy)); } g.setColor(fgC); // DRAW CITYS for(int i=0; i<NCITY; i++){ g.drawOval( toXReal(city[i].x)-4, toYReal(city[i].y)-4,8,8); //g.drawString(""+i+"-"+(city[i].choose*100/counter)+"%",toXReal(city[i].x),toYReal(city[i].y)+8); } } public void paint(Graphics g) { Dimension size = this.size(); int w = size.width, h = size.height; this.setBackground(bkC); if ((offscreen == null) || ((imagewidth != w) || (imageheight != h))) { offscreen = this.createImage(w, h); imagewidth = w; imageheight = h; } Rectangle clip = new Rectangle(toXReal(0),toYReal(0),toXReal(COUNTRY),toYReal(COUNTRY)); Graphics goff = offscreen.getGraphics(); goff.clipRect(clip.x, clip.y, clip.width, clip.height); Graphics g1 = this.getGraphics(); g1.clipRect(clip.x, clip.y, clip.width, clip.height); paintLeft(goff); g1.drawImage(offscreen, 0, 0, this); clip = null; goff = null; g1 = null; System.gc(); // CLEAR ALL g.setColor(bkC); g.fillRect(w/2+30,0,w/2+130, 20); g.setColor(fgC); g.drawString("# of city:"+cscroll.getValue()/10,w/2+30,20); } // Start the animation public void start() { animator = new Thread(this); animator.start(); } // Stop it. public void stop() { if (animator != null) animator.stop(); animator = null; } // Stop and start animating on mouse clicks. // if running, stop it. Otherwise, start it. public boolean mouseDown(Event e, int x, int y) { if (animator != null){ please_stop = true; } else{ please_stop = false; animator = new Thread(this); kohonenInit(); animator.start(); } return true; }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -