You are on page 1of 11

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;

public void kohonenInit()

theta = 0.5;

phi = 0.5;

momentum = 0.995;

NCITY = cscroll.getValue()/10;

NGEONEURON = NCITY*2;

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;

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];

public void run() {

int idx,j; double x1,x2,mindist; int count = 0; while(!please_stop) {

counter++;

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++;

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++;

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));

phi *= momentum;

theta *= momentum;

makeR(theta);

count = (count++)%10;

if(count==0){

paint(this.getGraphics());

try {Thread.sleep(10);}

catch (InterruptedException e){};

} } animator = null; }

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);

g.setColor(bkC);

g.fillRect(0, 0, w, h);

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)); }

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);

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; g.setColor(bkC);

g.fillRect(0, 0, w, h);

g.setFont(sF);

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.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));
}

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);

//Rectangle(to2XReal(0),to2YReal(0),to2XReal(COUNTRY),to2YReal(COUNTRY));

clip = null;

goff = null;

g1 = null;

System.gc();

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);

public void start() {

animator = new Thread(this);

animator.start();

public void stop() {

if (animator != null) animator.stop();

animator = null;

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;

City.java

public class City{

public double x,y;

public int update,choose;

public City(double x,double y){

this.x = x;

this.y = y;
update = 0;

choose = 0;

public double dist(City c){

double dx = this.x - c.x;

double dy = this.y - c.y;

return Math.sqrt(dx*dx + dy*dy);

geoNeuron.java

public class geoNeuron{

public double x,y;


public double wx,wy;
public int update,choose;

public geoNeuron(double x,double y){


this.x = x;
this.y = y;

this.wx = Math.random();
this.wy = Math.random();

update = 0;
choose = 0;

public double dist(geoNeuron c){


double dx = this.x - c.x;
double dy = this.y - c.y;
return Math.sqrt(dx*dx + dy*dy);

public double wdist(geoNeuron c){


double dx = this.wx - c.wx;
double dy = this.wy - c.wy;

return Math.sqrt(dx*dx + dy*dy);

You might also like