import java.awt.*; import java.applet.*; import java.util.*; import java.io.*; import java.awt.event.*; /** * THIS SOFTWARE IS PROVIDED AS-IS AND I CAN TAKE NO RESPONSIBILITY * FOR ANY INDIRECT DAMAGE INCURRED ON ANY MACHINE THIS IS RUN ON. IT * HAS BEEN FULLY TESTED TO ENSURE THAT NO SIDE EFFECTS WILL HARM YOUR * MACHINE IN ANY WAY. * * THIS SOURCE CODE IS FREE TO DISTRIBUTE UNDER THE 'GNU' LICENSE SO LONG * AS THIS HEADER IS ALWAYS ATTACHED TO IT AND YOU DONT MAKE ANY PROFIT * FROM ITS DISTRIBUTION. * * TOBY SKINNER * toby@hc2.co.uk */ public class Maze extends Applet implements Runnable { /*GRID RELATED DATA*/ private Point[][] grid = null; private Vector edges = new Vector (0,1); private Point start = null; private Point end = null; private AntSystem as = null; private Thread loop = null; /*MEASUREMENTS*/ private int width = 400; private int height = 400; private int grid_width = 10; private int grid_height = 10; private Point current_node = null; public boolean selected = false; private int xinterval = 0; private int yinterval = 0; public int mx = 0; public int my = 0; /*GUI HANDLERS*/ private EventHandler evt_hndlr = null; public Applet infopanel = null; boolean select_start = false; boolean select_end = false; Image buffer = null; Graphics bg = null; /*PARAMETERS*/ public double alpha = 0.0; //pheromone multiplier public double beta = 0.0; //heuristic multiplier, local public double gamma = 0.0; //heuristic multiplier, global public int tmax = 20; public int n = grid_width*grid_height; public int m = n/4; public double pmax = 0.05; //max decay rate of pheromone public double p = pmax; //decay rate of pheromone public double q = 100.0; public double t0 = 0.0000001; public Ant[] ants = null; public Vector T = new Vector(0,1); public Vector BT = new Vector(0,1); //best tour public double L = 0.0; //length of T public double BL = 0.0; //length of BT public int epoch = 0; public int cntr = 0; public int alpha_div = 7; public int beta_div = 7; public int gamma_div = 7; public int[][] sarray = null; public File data = null; public FileWriter data_writer = null; public File success = null; public FileWriter success_writer = null; public static final int LOCAL = 0; public static final int GLOBAL = 1; public static final int COMBINED = 2; public int nav_type = LOCAL; public void init() { while(infopanel == null) { infopanel = getAppletContext().getApplet("info"); } ((InfoPanel)infopanel).displayString("AS-RFP vers 0.1, 0.2, 0.3\n"); ((InfoPanel)infopanel).displayString("\n"); ((InfoPanel)infopanel).displayString("initGrid() @ "+new Date().toString()+"\n"); initGrid(); ((InfoPanel)infopanel).displayString("initEdges() @ "+new Date().toString()+"\n"); initEdges(); buildHandlers(); setBackground(Color.white); as = new AntSystem(this); loop = new Thread(this); ((InfoPanel)infopanel).displayString("setStartNode() -> "+setStartNode()+"\n"); ((InfoPanel)infopanel).displayString("setEndNode() -> "+setEndNode()+"\n"); } private void buildHandlers() { evt_hndlr = new EventHandler(this); this.addMouseMotionListener(evt_hndlr); this.addMouseListener(evt_hndlr); } public void run() { try { for(int x=0;x<3;x++) { nav_type = x; cntr = 0; ((InfoPanel)infopanel).displayString("Nav type = "+nav_type); //data = new File("variables["+nav_type+"]"); //data_writer = new FileWriter(data); //success = new File("success["+nav_type+"]"); //success_writer = new FileWriter(success); if(nav_type < 2) { ((InfoPanel)infopanel).displayString("Constructing avg_earray..."); int[][][] avg_earray = new int[10][(alpha_div+1)][(beta_div+1)]; ((InfoPanel)infopanel).displayString("done\n"); for(int p=0;p<10;p++) { ((InfoPanel)infopanel).displayString("Iteration "+p+"\n"); sarray = new int[(alpha_div+1)*(beta_div+1)][tmax]; int[][] earray = new int[(alpha_div+1)][(beta_div+1)]; int in1 = 0; int in2 = 0; for(double i=0.0;i<=2.0;i+=(2.0/alpha_div)) { for(double j=0.0;j<=2.0;j+=(2.0/beta_div)) { alpha = i; beta = j; begin(); earray[in1][in2] = acc(sarray[cntr]); cntr++; in2++; } in1++; in2=0; } for(int i=0;i max) { id = i; max = current; } } best = (Edge)e.elementAt(id); */ //probabilistic selection Edge best = (Edge)e.elementAt((int)(Math.random()*e.size())); double p = prob[0]; double r = Math.random()*acc(prob); double s = 0.0; for(int i=0;i= r) { best = (Edge)e.elementAt(i); break; } else { s+=p; } } ant.addEdge(best, cud(best.getStartPoint().getX(), best.getStartPoint().getY(), best.getEndPoint().getX(), best.getEndPoint().getY())); ant.setCurrentNode(best.getOther(ant.getCurrentNode())); ant.getCurrentNode().setColor(Color.blue); ant.getCurrentNode().setSpecial(true); if(ant.getCurrentNode() == end) { success++; break; } try {Thread.sleep(50);}catch(Exception exc) {} repaint(); } for(int i=0;i (mx-(xinterval/2))) && (grid[i][j].getX() < (mx-(xinterval/2)+xinterval))) { if((grid[i][j].getY() > (my-(yinterval/2))) && (grid[i][j].getY() < (my-(yinterval/2)+yinterval))) { selected=true; current_node = grid[i][j]; } else selected = false; } else selected = false; if(selected) { grid[i][j].setSelected(true); } else { grid[i][j].setSelected(false); } if(end != null) { grid[i][j].str = (int)cud(grid[i][j].getX(), grid[i][j].getY(), end.getX(), end.getY()); } grid[i][j].paint(bg); } } //draw mouse area bg.setColor(Color.blue); bg.drawRect(mx-(xinterval/2), my-(yinterval/2), xinterval, yinterval); g.drawImage(buffer, 0, 0, width, height, this); } } class EventHandler implements MouseListener, MouseMotionListener { Maze master = null; public EventHandler(Maze env) { master = env; } public void mouseMoved(MouseEvent evt) { int mx = evt.getX(); int my = evt.getY(); master.mx = mx; master.my = my; master.repaint(); } public void mouseDragged(MouseEvent evt) { int mx = evt.getX(); int my = evt.getY(); } public void mouseEntered(MouseEvent evt) { } public void mouseExited(MouseEvent evt) { } public void mousePressed(MouseEvent evt) { int mx = evt.getX(); int my = evt.getY(); master.mx = mx; master.my = my; master.repaint(); if(master.select_start) { master.setStartNode(); } else if(master.select_end) { master.setEndNode(); } } public void mouseReleased(MouseEvent evt) { int mx = evt.getX(); int my = evt.getY(); } public void mouseClicked(MouseEvent evt) { } } class AntSystem extends Thread { private Maze master = null; public AntSystem(Maze m) { master = m; } public void run() { while(true) { try { Thread.sleep(100); master.repaint(); } catch(InterruptedException ie) {} } } }