⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tsp.java

📁 针对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*2;			   		//URL url;              //homeI = this.getImage(this.getDocumentBase(), "home.gif");              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){		//System.out.println("");      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];     			//System.out.print(" "+r[i][j]);      	}      	//System.out.println("");      }		}    // 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);            	//double d = x1*gn[i].wx + x2*gn[i].wy;            	//System.out.println("d="+d);            	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){      				//System.out.println("theta = "+theta+"  phi = "+phi);							paint(this.getGraphics());            							// Call Garbage Collect							//System.gc();			            	try {Thread.sleep(10);} catch (InterruptedException e){};            }        }        animator = null;    }        ///////////////////////////////////////////////////////////////////    //    //  Functional section    //    ///////////////////////////////////////////////////////////////////        public void init() {        	cscroll = new Scrollbar(Scrollbar.HORIZONTAL,NCITY*10, 10, 30, 200);    	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);}       private int to2XReal(double val){int w = this.size().width;return (int)((double)w/2.0 + val *((double)w/2.0-50.0) / COUNTRY +25.0);}    private int to2YReal(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 paintRight(Graphics g) {        		Dimension size = this.size();						int w = size.width, h = size.height;							// CLEAR ALL            g.setColor(bkC);            g.fillRect(0, 0, w, h);						g.setFont(sF);            // DRAW CITYS            g.setColor(fgC);            for(int i=0; i<NCITY; i++){            	g.drawOval( to2XReal(city[i].x)-4, to2YReal(city[i].y)-4,8,8);             	//g.drawString("["+city[i].wx+";"+gn[i].wy+"]",to2XReal(gn[i].x),to2YReal(gn[i].y));            }                       g.setColor(ln2C);            for(int i=0; i<NGEONEURON; i++)      				for(int j=i+1; j<NGEONEURON; j++){      					g.drawLine( to2XReal(gn[i].x),to2YReal(gn[i].y),            	              to2XReal(gn[j].x),to2YReal(gn[j].y));      				  g.drawString(""+r[i][j],to2XReal((gn[i].x+gn[j].x)/2),to2YReal((gn[i].y+gn[j].y)/2));      					//r[i][j] = Math.exp( -1.0 * (double)( gn[i].dist(gn[j])*gn[i].dist(gn[j]) )/(2.0*th));      					      				}						g.setFont(mF);            g.setColor(fgC);     			  g.drawString("phi="+phi+" theta="+theta,to2XReal(0.0),to2YReal(0.0)+20);    }        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 = new Rectangle(to2XReal(0),to2YReal(0),to2XReal(COUNTRY),to2YReal(COUNTRY));            											  //goff = offscreen.getGraphics();						//goff.clipRect(clip.x, clip.y, clip.width, clip.height);            //g1 = this.getGraphics();						//g1.clipRect(clip.x, clip.y, clip.width, clip.height);						            //paintRight(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.    public boolean mouseDown(Event e, int x, int y) {    // if running, stop it.  Otherwise, start it.      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 + -