0% found this document useful (0 votes)
51 views11 pages

TSP Java

This document contains the code for a Java applet that simulates the self-organizing map (SOM) algorithm. It defines classes for cities, neurons, and the main TSP applet class. The TSP applet initializes cities and neurons, calculates distance matrices, and runs the SOM algorithm in a thread to update neuron weights based on randomly selected input cities. It displays the cities, neurons and their connections.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
51 views11 pages

TSP Java

This document contains the code for a Java applet that simulates the self-organizing map (SOM) algorithm. It defines classes for cities, neurons, and the main TSP applet class. The TSP applet initializes cities and neurons, calculates distance matrices, and runs the SOM algorithm in a thread to update neuron weights based on randomly selected input cities. It displays the cities, neurons and their connections.
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOC, PDF, TXT or read online on Scribd
You are on page 1/ 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