Votre question

problème applet java !!! (simulation TSP)

Tags :
  • souris
  • Java
  • Applet
  • Programmation
Dernière réponse : dans Programmation
23 Mai 2012 10:56:21

salut tout le monde,
j'ai un grand problème, mon code est zéro erreur mais l'exécution ne marche pas, je veut déplacer une image avec la souris , mais le problème que les coordonnés de cette image lié avec une autre classe (tsp) qui permet de calcule le plus court chemin relian ces image à l'aide du problème de voyageur de commerce, tout simplement c'est une simulation d'un réseau internet ... quelqu'un m'aide SVP !! et merci d'avance :) 
voilà le code
  1. import java.applet.*;
  2. import java.io.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import java.lang.reflect.*;
  6. import java.util.*;
  7. import java.applet.Applet ;
  8.  
  9. import java.awt.BorderLayout;
  10. import java.awt.Graphics;
  11. import java.awt.event.MouseEvent;
  12. import java.awt.event.MouseListener;
  13. import java.awt.event.MouseMotionListener;
  14.  
  15. import javax.swing.JFrame;
  16. import javax.swing.JLabel;
  17. import javax.swing.SwingConstants;
  18. public class essai extends Applet implements MouseListener, MouseMotionListener{
  19.  
  20. int xa, yb;
  21. boolean dragging;
  22. boolean dragRedSquare;
  23. int offsetX, offsetY;
  24. //-------
  25. boolean NoeudVisitee,AgentFourmi,QtePhero;
  26. String sauv_res_cycl="nombre de cycle bonne chemain\n";
  27. tsp myTsp;
  28. colony myColony;
  29. double averages[];
  30. TextField textNoeud,textAlpha,textBeta,textAnt,textVrate,textAmount,textRounds;
  31. Label labelBestPath;
  32. Button buttonGenerate,buttonGo;
  33. Image ord;
  34.  
  35. public void init() {
  36. xa = 10;
  37. yb = 10;
  38. setBackground(Color.lightGray);
  39. addMouseListener(this);
  40. addMouseMotionListener(this);
  41. //---------
  42. NoeudVisitee = false;
  43. AgentFourmi = false;
  44. QtePhero = false;
  45. MediaTracker mt= new MediaTracker(this);
  46. ord = getImage(getCodeBase(),"ord1.jpg");
  47. mt.addImage(ord,0);
  48. //Panel stat_cyc=new Panel();
  49. Panel panelRight = new Panel(new GridLayout(15, 2, 4, 4));
  50. //bl.setVgap(4);
  51. Panel panelLeft = new Panel(bl);
  52. Label labelNoeud = new Label("Noeud", Label.RIGHT);
  53. Label labelAnt = new Label("Fourmi", Label.RIGHT);
  54. Label labelVrate = new Label("Evaporation", Label.RIGHT);
  55. Label labelAmount = new Label("Pheromone", Label.RIGHT);
  56. Label labelRounds = new Label("Cycle", Label.RIGHT);
  57. Label labelAlpha = new Label("Alpha", Label.RIGHT);
  58. Label labelBeta = new Label("Beta", Label.RIGHT);
  59. labelBestPath = new Label("0.0", Label.CENTER);
  60. labelBestPath.setBackground(Color.red);
  61. textNoeud = new TextField("5", 6);
  62. textAnt = new TextField("1", 6);
  63. textVrate = new TextField("0.5", 6);
  64. textAmount = new TextField("1", 6);
  65. textRounds = new TextField("40", 6);
  66. textAlpha = new TextField("1", 6);
  67. textBeta = new TextField("5", 6);
  68. buttonGenerate = new Button("Generer");
  69. buttonGo = new Button("Demarrer!");
  70. buttonGo.setEnabled(false);
  71. buttonGenerate.addActionListener(new buttonAL());
  72. buttonGo.addActionListener(new buttonAL());
  73. panelRight.add(labelNoeud); panelRight.add(textNoeud);
  74. panelRight.add(labelAnt); panelRight.add(textAnt);
  75. panelRight.add(labelVrate); panelRight.add(textVrate);
  76. panelRight.add(labelAmount); panelRight.add(textAmount);
  77. panelRight.add(labelRounds); panelRight.add(textRounds);
  78. panelRight.add(labelAlpha); panelRight.add(textAlpha);
  79. panelRight.add(labelBeta); panelRight.add(textBeta);
  80. panelRight.add(new Label()); panelRight.add(buttonGenerate);
  81. panelRight.add(new Label()); panelRight.add(buttonGo);
  82. panelRight.add(new Label("MeilleurTrajet", Label.RIGHT));
  83. panelRight.add(labelBestPath);
  84. Panel panelMain = new Panel();
  85. panelMain.add(panelLeft);
  86. panelMain.add(panelRight);
  87. Panel panelTop = new Panel(new BorderLayout());
  88. panelTop.add("Center", panelMain);
  89. setBackground(new Color (30,210,242));
  90. add(panelTop);
  91. //---------
  92. }
  93. public void mousePressed(MouseEvent evt) {
  94. if (dragging)
  95. return;
  96. int x = evt.getX();
  97. int y = evt.getY();
  98. if (x >= xa && y >= yb ) {
  99. dragging = true;
  100. dragRedSquare = true;
  101. offsetX = x - xa;
  102. offsetY = y - yb;
  103. }
  104.  
  105. System.out.println("PRESSED");
  106. repaint();
  107. this.update(this.getGraphics());
  108. }
  109. public void mouseReleased(MouseEvent evt) {
  110. dragging = false;
  111. System.out.println("released");
  112. repaint();
  113. this.update(this.getGraphics());
  114. }
  115. public void mouseDragged(MouseEvent evt) {
  116. if (dragging == false)
  117. return;
  118. int x = evt.getX();
  119. int y = evt.getY();
  120. if (dragRedSquare) {
  121. xa = x - offsetX;
  122. yb = y - offsetY;
  123. }
  124. System.out.println("dragged");
  125. repaint();
  126. this.update(this.getGraphics());
  127. }
  128. public void mouseMoved(MouseEvent evt) { }
  129. public void mouseClicked(MouseEvent evt) { }
  130. public void mouseEntered(MouseEvent evt) { }
  131. public void mouseExited(MouseEvent evt) { }
  132. //-------
  133. class buttonAL implements ActionListener {
  134. public void actionPerformed(ActionEvent e) {
  135. if (e.getActionCommand() == "Demarrer!") {
  136. labelBestPath.setBackground(Color.blue);
  137. int n = Integer.parseInt( textRounds.getText() );
  138. int next_nbr_round=n+1;
  139. String nouv_round="";
  140. averages = new double[n];
  141. for(int i = 0; i < n; i++)
  142. averages[i] = myColony.runOneCycle();
  143. labelBestPath.setBackground(Color.yellow);
  144. AgentFourmi = true;
  145. labelBestPath.setText( Double.toString(
  146. Math.rint( myColony.bestLength*10000 ) / 10000) );
  147. paint(getGraphics());
  148. }
  149.  
  150. if (e.getActionCommand() == "Generer") {
  151. myTsp = new tsp();
  152. long t = (new Date()).getTime();
  153.  
  154. myTsp.GenererNoeud(Integer.parseInt(textNoeud.getText()), t);
  155. myColony = new colony(Integer.parseInt(textAnt.getText()),1,1,myTsp);
  156. NoeudVisitee = true;
  157. paint(getGraphics());
  158. buttonGo.setEnabled(true);
  159.  
  160. }
  161.  
  162.  
  163.  
  164. }
  165. }
  166. public void paint (Graphics g2) {
  167. super.paintComponents(g2);
  168. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
  169. addMouseListener(this);
  170. addMouseMotionListener(this);
  171. int w = getSize().width,h = getSize().height;
  172. g.fillRect(0, 0, w, h);
  173. if (!NoeudVisitee) return;
  174. int n = myTsp.getNbreN();
  175. g.setColor(Color.red);
  176. for(int i = 0; i < n; i++) {g.drawImage(ord,(int)(myTsp.Noeud[i].x * w - 1),(int)(myTsp.Noeud[i].y * h - 1),this);}
  177. System.out.println("on repeint le panel");
  178. //for(int i = 0; i < n; i++) {g.fill3DRect((int)(myTsp.Noeud[i].x * w - 1),(int)(myTsp.Noeud[i].y * h - 1), 3, 3, true);}
  179. if (QtePhero) {
  180. double minV = Double.MAX_VALUE, maxV = Double.MIN_VALUE;
  181. for(int i = 0; i < n-1; i++)
  182. for(int j = i+1; j < n; j++) {
  183. if (minV > myColony.phMat[i][j])
  184. minV = myColony.phMat[i][j];
  185. if (maxV < myColony.phMat[i][j])
  186. maxV = myColony.phMat[i][j];
  187. }
  188. double s = maxV - minV;
  189. for(int i = 0; i < n-1; i++)
  190. for(int j = i+1; j < n; j++) {
  191. float t = (float)((myColony.phMat[i][j] - minV) / s);
  192. g.setColor(new Color(t, t, t));
  193. int x1 = (int)(myTsp.Noeud[i].x * w);
  194. int y1 = (int)(myTsp.Noeud[i].y * h);
  195. int x2 = (int)(myTsp.Noeud[j].x * w);
  196. int y2 = (int)(myTsp.Noeud[j].y * h);
  197. g.drawLine(x1, y1, x2, y2);
  198. }
  199. g.setColor(Color.yellow);
  200. //for(int i = 0; i < n; i++) {g.fill3DRect((int)(myTsp.Noeud[i].x * w - 1),(int)(myTsp.Noeud[i].y * h - 1), 3, 3, true);}
  201. for(int i = 0; i < n; i++) {g.drawImage(ord,(int)(myTsp.Noeud[i].x * w - 1),(int)(myTsp.Noeud[i].y * h - 1),this);}
  202. repaint();
  203. return;
  204. }
  205. if (!AgentFourmi) return;
  206. g.setColor(Color.white);
  207. for(int i = 0; i < n - 1; i++) {
  208. int c1 = myColony.bestPath[i];
  209. int c2 = myColony.bestPath[i+1];
  210. int x1 = (int)(myTsp.Noeud[c1].x * w);
  211. int y1 = (int)(myTsp.Noeud[c1].y * h);
  212. int x2 = (int)(myTsp.Noeud[c2].x * w);
  213. int y2 = (int)(myTsp.Noeud[c2].y * h);
  214. g.drawLine(x1, y1, x2, y2);
  215. }
  216. int c1 = myColony.bestPath[n-1];
  217. int c2 = myColony.bestPath[0];
  218. int x1 = (int)(myTsp.Noeud[c1].x * w);
  219. int y1 = (int)(myTsp.Noeud[c1].y * h);
  220. int x2 = (int)(myTsp.Noeud[c2].x * w);
  221. int y2 = (int)(myTsp.Noeud[c2].y * h);
  222. g.drawLine(x1, y1, x2, y2);
  223.  
  224. }
  225. public void update(Graphics g2) // to stop refresh flickering
  226. {
  227. paint(g2);
  228. }
  229.  
  230.  
  231. } // end class DragTwoSquares
  232.  
  233.  
  234. //______
  235.  
  236.  
  237. class tsp {
  238.  
  239. int NbreN; // nombre des noeuds
  240. public node Noeud[]; // tableau contenant les noeuds de type node
  241. double distMat[][]; // distance entre les noeuds (matrice)
  242. public int getNbreN() { return NbreN; }
  243.  
  244. //**** classe caractérise un noeud****
  245. public class node {
  246.  
  247.  
  248. double x, y; // x est l'absisse du noeud, y est l'ordonné
  249.  
  250. public node(double a, double b) { x = a; y = b; }
  251. public void setX(double t) { x = t; }
  252. public void setY(double t) { y = t; }
  253. public double getX() { return x; }
  254. public double getY() { return y; }
  255.  
  256.  
  257. }
  258.  
  259.  
  260. // générer un ensemble des noeuds aléatoir
  261.  
  262. public void GenererNoeud(int n, long s) {
  263. NbreN = n;
  264. Random r = new Random(s);
  265. Noeud = new node[n];
  266. for(int i = 0; i < n; i++) {
  267. Noeud[i] = new node(r.nextDouble(), r.nextDouble());
  268.  
  269. }
  270. determineDistMat();
  271.  
  272.  
  273. }
  274.  
  275.  
  276. // ***calculer la distance entre 2 points***
  277. public double dist(int i, int j) {
  278. double t1 = Noeud[i].getX() - Noeud[j].getX(),
  279. t2 = Noeud[i].getY() - Noeud[j].getY();
  280. return Math.sqrt(t1*t1 + t2*t2);
  281. }
  282.  
  283. // ***créer la matrice qui contient les distances entre les noeuds***
  284. public void determineDistMat() {
  285. distMat = new double[NbreN][NbreN];
  286. for(int i = 0; i < NbreN; i++)
  287. for(int j = i; j < NbreN; j++) {
  288. distMat[i][j] = dist(i, j);
  289. distMat[j][i] = dist(j, i);
  290. }
  291. }
  292.  
  293.  
  294.  
  295. //----------------------------------------
  296. public double pathLength(int p[]) {// longeur de chemin
  297.  
  298. double t = 0;
  299. for(int i = 0; i < NbreN - 1; i++)
  300. t += dist(p[i], p[i+1]);
  301. t += dist(p[NbreN-1], p[0]);
  302. return t;
  303. }
  304. //----------------------------------------
  305. public double getDist(int i, int j) {
  306. return distMat[i][j];
  307. }
  308. }
  309.  
  310. class colony {
  311. public double phMat[][];
  312. double phAmt; // pheromone sur les arcs
  313.  
  314. public int controlAnt;
  315. public int bestPath[];
  316. public double bestLength;
  317.  
  318. public ant myAnts[];
  319. tsp myTsp;
  320. int na; // nombre de Fourmis
  321. double vRate; // taux de vaporisation
  322. Random rg;
  323.  
  324. //**** calsse Fourmi*****
  325. class ant {
  326. public int path[], mark[]; // caractèristique du fourmi tableau liste des noeud visité,path = les chemins
  327. int noeudActuel;
  328. double traveledLength;
  329. public String ListeVisite[];
  330.  
  331. // *****constructeur de la classe ant*****
  332. public ant(int n) {
  333. mark = new int[n];
  334. path = new int[n];
  335. ListeVisite= new String[n];
  336. }
  337. //*******fin de constructeur*****
  338.  
  339. public double calculateTraveledLength()
  340. {
  341. traveledLength = myTsp.pathLength(path);
  342. return traveledLength;
  343. }
  344.  
  345. public double getTraveledLength()
  346. { return traveledLength; }
  347.  
  348.  
  349.  
  350. public void reset() {
  351. noeudActuel =0;
  352. path[0] = 0; // commencer au noeud[0]
  353. for(int i = 0; i < myTsp.getNbreN(); i++)
  354. mark[i] = 0;
  355. mark[0] = 1; // noeud[0]a été visitée
  356. }
  357.  
  358. //----------------------------------------
  359. public void determineNextNoeud() {
  360. int n = myTsp.getNbreN();
  361. int countCandi = 0;// compteur
  362. double alpha=0.5 , beta=0.3;
  363. int[] candidate = new int[n];
  364. double[] prCandi = new double[n];
  365. for(int i = 0; i < n; i++) {
  366. if (mark[i] == 0) {
  367. candidate[countCandi] = i;// tableau des noeud non visité
  368.  
  369. prCandi[countCandi] = Math.pow(phMat[ path[noeudActuel] ][i],alpha) /
  370. Math.pow(myTsp.getDist( path[noeudActuel], i ),beta);
  371. ++countCandi;// compteur des noeuds non visités
  372. }
  373. }
  374.  
  375. double s = 0;
  376. for(int i = 0; i < countCandi; i++)
  377. s += prCandi[i];
  378. for(int i = 0; i < countCandi; i++)
  379. prCandi[i] /= s;
  380. // probabilité à choi
  381.  
  382. double hit = rg.nextDouble(),
  383. t = prCandi[0];
  384. int w = 0;
  385. for(w = 0; w < countCandi - 1; w++) {
  386. if (t > hit) break;
  387. t += prCandi[w + 1];
  388. }
  389. ++noeudActuel;
  390. path[noeudActuel] = candidate[w];
  391. mark[ candidate[w] ] = 1;
  392. }
  393. }
  394. //******fin de la classe Fourmi*******
  395.  
  396. // constructeur de la classe colony
  397. public colony(int n, double t, double p, tsp s) {
  398. na = n; //nombre des Fourmi
  399. vRate = t;
  400. phAmt = p;
  401. myTsp = s;
  402. bestLength = Double.MAX_VALUE;
  403.  
  404. bestPath = new int[myTsp.getNbreN()];
  405. phMat = new double[myTsp.getNbreN()][myTsp.getNbreN()];
  406. myAnts = new ant[n];
  407. rg = new Random();
  408. for(int i = 0; i < n; i++)
  409. myAnts[i] = new ant(myTsp.getNbreN());
  410. for(int i = 0; i < myTsp.getNbreN(); i++)
  411. for(int j = 0; j < myTsp.getNbreN(); j++) {
  412. phMat[i][j] = 1;
  413. phMat[j][i] = 1;
  414. }
  415. }
  416. //----------------------------------------
  417. public void runOneAnt(int x) {
  418. int i=0 , j=0 ;
  419. myAnts[x].reset();
  420. if (myTsp.distMat[i][j] < 2) // condition ne fonctionne pas !!
  421. {for(int k = 0; k < myTsp.getNbreN() - 1; k++)
  422. myAnts[x].determineNextNoeud();
  423.  
  424. myAnts[x].calculateTraveledLength();
  425. }}
  426. //----------------------------------------
  427. public double runOneCycle() {
  428. for(int i = 0; i < na; i++)
  429. runOneAnt(i);
  430. return updatePhMat();
  431. }
  432. //----------------------------------------
  433. public double updatePhMat() {
  434. int n = Array.getLength( myAnts );
  435. int m = myTsp.getNbreN();
  436.  
  437. controlAnt = -1;
  438.  
  439. for(int j = 0; j < myTsp.getNbreN(); j++)
  440. for(int k = 0; k < myTsp.getNbreN(); k++)
  441. phMat[j][k] *= vRate;
  442.  
  443. for(int i = 0; i < n; i++) {
  444. double t = myAnts[i].getTraveledLength();
  445.  
  446. if (t < bestLength) {
  447. controlAnt = i;// plusieur Fourmi
  448. bestLength = t;
  449. for(int j = 0; j < m; j++)
  450. bestPath[j] = myAnts[i].path[j];
  451. }
  452.  
  453. for(int j = 0; j < m - 1; j++) {
  454. phMat[ myAnts[i].path[j] ][ myAnts[i].path[j+1] ] += phAmt / t;
  455. phMat[ myAnts[i].path[j+1] ][ myAnts[i].path[j] ] += phAmt / t;
  456. }
  457.  
  458. }
  459.  
  460.  
  461.  
  462.  
  463.  
  464. return bestLength;
  465.  
  466. }
  467. }

Autres pages sur : probleme applet java simulation tsp

a b L Programmation
24 Mai 2012 20:10:44

Quel est ton problème?
m
0
l
24 Mai 2012 20:16:28

CRicky a dit :
Quel est ton problème?


je veut déplacer une image parmi les images qui ont été générés aléatoire, et lorsque je déplace l'image le plus cours chemin sera calculer de nouveau . mon problme est que l'application detecte la souris (clique et glisse) mais l'image ne se déplace pas !!
m
0
l
Contenus similaires
24 Mai 2012 20:20:25

voilà une autre essai , mais aussi reste le problème!
maintenant toutes les image se déplace , moi je veut q'une seule se déplace :(  ..
  1. import java.applet.*;
  2. import java.io.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import java.lang.reflect.*;
  6. import java.util.*;
  7. import java.applet.Applet ;
  8.  
  9. import java.awt.BorderLayout;
  10. import java.awt.Graphics;
  11. import java.awt.event.MouseEvent;
  12. import java.awt.event.MouseListener;
  13. import java.awt.event.MouseMotionListener;
  14.  
  15. import javax.swing.JFrame;
  16. import javax.swing.JLabel;
  17. import javax.swing.SwingConstants;
  18. public class essai extends Applet
  19. node myNode;
  20.  
  21. int xa, yb;
  22. boolean dragRedSquare;
  23. int offsetX, offsetY;
  24.  
  25. //-------
  26. boolean NoeudVisitee,AgentFourmi,QtePhero;
  27. String sauv_res_cycl="nombre de cycle bonne chemain\n";
  28. tsp myTsp;
  29. colony myColony;
  30. double averages[];
  31.  
  32. TextField textNoeud,
  33. textAlpha,
  34. textBeta,
  35. textAnt,
  36. textVrate,
  37. textAmount,
  38. textRounds;
  39.  
  40. Label labelBestPath;
  41. Button buttonGenerate,buttonGo;
  42.  
  43. Image ord;
  44.  
  45. public void init() {
  46. xa = 10;
  47. yb = 10;
  48. setBackground(Color.lightGray);
  49. addMouseListener(this);
  50. addMouseMotionListener(this);
  51.  
  52. //---------
  53. NoeudVisitee = false;
  54. AgentFourmi = false;
  55. QtePhero = false;
  56. //MediaTracker mt= new MediaTracker(this);
  57. ord = getImage(getCodeBase(),"ord1.jpg");
  58. //mt.addImage(ord,0);
  59. try {
  60. MediaTracker mt = new MediaTracker(this);
  61. mt.addImage(ord, 0);
  62. mt.waitForID(0);
  63. }
  64. e.printStackTrace();
  65. }
  66. Panel stat_cyc=new Panel();
  67. Panel panelRight = new Panel(new GridLayout(15, 2, 4, 4));
  68. bl.setVgap(4);
  69. Panel panelLeft = new Panel(bl);
  70. Label labelNoeud = new Label("Noeud", Label.RIGHT);
  71. Label labelAnt = new Label("Fourmi", Label.RIGHT);
  72. Label labelVrate = new Label("Evaporation", Label.RIGHT);
  73. Label labelAmount = new Label("Pheromone", Label.RIGHT);
  74. Label labelRounds = new Label("Cycle", Label.RIGHT);
  75. Label labelAlpha = new Label("Alpha", Label.RIGHT);
  76. Label labelBeta = new Label("Beta", Label.RIGHT);
  77. labelBestPath = new Label("0.0", Label.CENTER);
  78. labelBestPath.setBackground(Color.red);
  79. textNoeud = new TextField("5", 6);
  80. textAnt = new TextField("1", 6);
  81. textVrate = new TextField("0.5", 6);
  82. textAmount = new TextField("1", 6);
  83. textRounds = new TextField("40", 6);
  84. textAlpha = new TextField("1", 6);
  85. textBeta = new TextField("5", 6);
  86. buttonGenerate = new Button("Generer");
  87. buttonGo = new Button("Demarrer!");
  88. buttonGo.setEnabled(false);
  89. buttonGenerate.addActionListener(new buttonAL());
  90. buttonGo.addActionListener(new buttonAL());
  91. panelRight.add(labelNoeud); panelRight.add(textNoeud);
  92. panelRight.add(labelAnt); panelRight.add(textAnt);
  93. panelRight.add(labelVrate); panelRight.add(textVrate);
  94. panelRight.add(labelAmount); panelRight.add(textAmount);
  95. panelRight.add(labelRounds); panelRight.add(textRounds);
  96. panelRight.add(labelAlpha); panelRight.add(textAlpha);
  97. panelRight.add(labelBeta); panelRight.add(textBeta);
  98. panelRight.add(new Label()); panelRight.add(buttonGenerate);
  99. panelRight.add(new Label()); panelRight.add(buttonGo);
  100. panelRight.add(new Label("MeilleurTrajet", Label.RIGHT));
  101. panelRight.add(labelBestPath);
  102.  
  103. Panel panelMain = new Panel();
  104. panelMain.add(panelLeft);
  105. panelMain.add(panelRight);
  106. Panel panelTop = new Panel(new BorderLayout());
  107. panelTop.add("Center", panelMain);
  108. setBackground(new Color (30,210,242));
  109. add(panelTop);
  110.  
  111.  
  112. //---------
  113. }
  114. public void mousePressed(MouseEvent evt) {
  115. int x = evt.getX();
  116. int y = evt.getY();
  117. if (x >= xa && y >= yb ) {
  118. dragRedSquare = true;
  119. offsetX = x - xa;
  120. offsetY = y - yb;
  121. }
  122.  
  123. System.out.println("PRESSED");
  124.  
  125. this.update(this.getGraphics());
  126. }
  127. public void mouseReleased(MouseEvent evt) {
  128. System.out.println("released");
  129.  
  130. this.update(this.getGraphics());
  131. }
  132. public void mouseDragged(MouseEvent evt) {
  133. int x = evt.getX();
  134. int y = evt.getY();
  135. if (dragRedSquare) {
  136. xa = x - offsetX;
  137. yb = y - offsetY;
  138. }
  139. Graphics g = getGraphics();
  140. System.out.println("dragged "+xa+", "+yb);
  141.  
  142. this.update(this.getGraphics());
  143. }
  144. public void mouseMoved(MouseEvent evt) { }
  145. public void mouseClicked(MouseEvent evt) { }
  146. public void mouseEntered(MouseEvent evt) { }
  147. public void mouseExited(MouseEvent evt) { }
  148. //-------
  149. class buttonAL implements ActionListener {
  150. public void actionPerformed(ActionEvent e) {
  151. if (e.getActionCommand() == "Demarrer!") {
  152. labelBestPath.setBackground(Color.blue);
  153. int n = Integer.parseInt( textRounds.getText() );
  154. int next_nbr_round=n+1;
  155. String nouv_round="";
  156. averages = new double[n];
  157. for(int i = 0; i < n; i++)
  158. averages[i] = myColony.runOneCycle();
  159. labelBestPath.setBackground(Color.yellow);
  160. AgentFourmi = true;
  161. labelBestPath.setText( Double.toString(
  162. Math.rint( myColony.bestLength*10000 ) / 10000) );
  163. paint(getGraphics());
  164. }
  165.  
  166. if (e.getActionCommand() == "Generer") {
  167. myTsp = new tsp();
  168. long t = (new Date()).getTime();
  169.  
  170. myTsp.GenererNoeud(Integer.parseInt(textNoeud.getText()), t);
  171. myColony = new colony(Integer.parseInt(textAnt.getText()),1,1,myTsp);
  172. NoeudVisitee = true;
  173. paint(getGraphics());
  174. buttonGo.setEnabled(true);
  175.  
  176. }
  177.  
  178.  
  179.  
  180. }
  181. }
  182. public void paint (Graphics g2) {
  183.  
  184. super.paintComponents(g2);
  185. g.translate(xa, yb);
  186. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
  187. RenderingHints.VALUE_ANTIALIAS_ON);
  188. addMouseListener(this);
  189. addMouseMotionListener(this);
  190. int w = getSize().width,h = getSize().height;
  191.  
  192. g.fillRect(0, 0, w, h);
  193. if (!NoeudVisitee) return;
  194. int n = myTsp.getNbreN();
  195. g.setColor(Color.red);
  196. for(int i = 0; i < n; i++) {g.drawImage(ord,(int)(myTsp.Noeud[i].x * w - 1),(int)(myTsp.Noeud[i].y * h - 1),this);}
  197. System.out.println("on repeint le panel");
  198.  
  199. if (QtePhero) {
  200. double minV = Double.MAX_VALUE, maxV = Double.MIN_VALUE;
  201. for(int i = 0; i < n-1; i++)
  202. for(int j = i+1; j < n; j++) {
  203. if (minV > myColony.phMat[i][j])
  204. minV = myColony.phMat[i][j];
  205. if (maxV < myColony.phMat[i][j])
  206. maxV = myColony.phMat[i][j];
  207. }
  208. double s = maxV - minV;
  209. for(int i = 0; i < n-1; i++)
  210. for(int j = i+1; j < n; j++) {
  211. float t = (float)((myColony.phMat[i][j] - minV) / s);
  212. g.setColor(new Color(t, t, t));
  213. int x1 = (int)(myTsp.Noeud[i].x * w);
  214. int y1 = (int)(myTsp.Noeud[i].y * h);
  215. int x2 = (int)(myTsp.Noeud[j].x * w);
  216. int y2 = (int)(myTsp.Noeud[j].y * h);
  217. g.drawLine(x1, y1, x2, y2);
  218. }
  219. g.setColor(Color.yellow);
  220.  
  221. for(int i = 0; i < n; i++) {g.drawImage(ord,(int)(myTsp.Noeud[i].x * w - 1),(int)(myTsp.Noeud[i].y * h - 1),this);}
  222.  
  223. }
  224. if (!AgentFourmi) return;
  225. g.setColor(Color.white);
  226. for(int i = 0; i < n - 1; i++) {
  227. int c1 = myColony.bestPath[i];
  228. int c2 = myColony.bestPath[i+1];
  229. int x1 = (int)(myTsp.Noeud[c1].x * w);
  230. int y1 = (int)(myTsp.Noeud[c1].y * h);
  231. int x2 = (int)(myTsp.Noeud[c2].x * w);
  232. int y2 = (int)(myTsp.Noeud[c2].y * h);
  233. g.drawLine(x1, y1, x2, y2);
  234. }
  235. int c1 = myColony.bestPath[n-1];
  236. int c2 = myColony.bestPath[0];
  237. int x1 = (int)(myTsp.Noeud[c1].x * w);
  238. int y1 = (int)(myTsp.Noeud[c1].y * h);
  239. int x2 = (int)(myTsp.Noeud[c2].x * w);
  240. int y2 = (int)(myTsp.Noeud[c2].y * h);
  241. g.drawLine(x1, y1, x2, y2);
  242. g.translate(-xa, -yb);
  243. }
  244. public void update(Graphics g2) // to stop refresh flickering
  245. {
  246. paint(g2);
  247. }
  248.  
  249.  
  250. }
  251.  
  252.  
  253. //______
  254.  
  255. //**** classe caractérise un noeud****
  256. class node {
  257.  
  258.  
  259. double x, y; // x est l'absisse du noeud, y est l'ordonné
  260.  
  261. public node(double a, double b) { x = a; y = b; }
  262. public void setX(double t) { x = t; }
  263. public void setY(double t) { y = t; }
  264. public double getX() { return x; }
  265. public double getY() { return y; }
  266.  
  267.  
  268. }
  269. class tsp {
  270.  
  271. int NbreN; // nombre des noeuds
  272. public node Noeud[]; // tableau contenant les noeuds de type node
  273. double distMat[][]; // distance entre les noeuds (matrice)
  274. public int getNbreN() { return NbreN; }
  275.  
  276.  
  277.  
  278.  
  279. // générer un ensemble des noeuds aléatoir
  280.  
  281. public void GenererNoeud(int n, long s) {
  282. NbreN = n;
  283. Random r = new Random(s);
  284. Noeud = new node[n];
  285. for(int i = 0; i < n; i++) {
  286. Noeud[i] = new node(r.nextDouble(), r.nextDouble());
  287.  
  288. }
  289. determineDistMat();
  290.  
  291.  
  292. }
  293.  
  294.  
  295. // ***calculer la distance entre 2 points***
  296. public double dist(int i, int j) {
  297. double t1 = Noeud[i].getX() - Noeud[j].getX(),
  298. t2 = Noeud[i].getY() - Noeud[j].getY();
  299. return Math.sqrt(t1*t1 + t2*t2);
  300. }
  301.  
  302. // ***créer la matrice qui contient les distances entre les noeuds***
  303. public void determineDistMat() {
  304. distMat = new double[NbreN][NbreN];
  305. for(int i = 0; i < NbreN; i++)
  306. for(int j = i; j < NbreN; j++) {
  307. distMat[i][j] = dist(i, j);
  308. distMat[j][i] = dist(j, i);
  309. }
  310. }
  311.  
  312.  
  313.  
  314. //----------------------------------------
  315. public double pathLength(int p[]) {// longeur de chemin
  316.  
  317. double t = 0;
  318. for(int i = 0; i < NbreN - 1; i++)
  319. t += dist(p[i], p[i+1]);
  320. t += dist(p[NbreN-1], p[0]);
  321. return t;
  322. }
  323. //----------------------------------------
  324. public double getDist(int i, int j) {
  325. return distMat[i][j];
  326. }
  327. }
  328.  
  329. class colony {
  330. public double phMat[][];
  331. double phAmt; // pheromone sur les arcs
  332.  
  333. public int controlAnt;
  334. public int bestPath[];
  335. public double bestLength;
  336.  
  337. public ant myAnts[];
  338. tsp myTsp;
  339. int na; // nombre de Fourmis
  340. double vRate; // taux de vaporisation
  341. Random rg;
  342.  
  343. //**** calsse Fourmi*****
  344. class ant {
  345. public int path[], mark[]; // caractèristique du fourmi tableau liste des noeud visité,path = les chemins
  346. int noeudActuel;
  347. double traveledLength;
  348. public String ListeVisite[];
  349.  
  350. // *****constructeur de la classe ant*****
  351. public ant(int n) {
  352. mark = new int[n];
  353. path = new int[n];
  354. ListeVisite= new String[n];
  355. }
  356. //*******fin de constructeur*****
  357.  
  358. public double calculateTraveledLength()
  359. {
  360. traveledLength = myTsp.pathLength(path);
  361. return traveledLength;
  362. }
  363.  
  364. public double getTraveledLength()
  365. { return traveledLength; }
  366.  
  367.  
  368.  
  369. public void reset() {
  370. noeudActuel =0;
  371. path[0] = 0; // commencer au noeud[0]
  372. for(int i = 0; i < myTsp.getNbreN(); i++)
  373. mark[i] = 0;
  374. mark[0] = 1; // noeud[0]a été visitée
  375. }
  376.  
  377. //----------------------------------------
  378. public void determineNextNoeud() {
  379. int n = myTsp.getNbreN();
  380. int countCandi = 0;// compteur
  381. double alpha=0.5 , beta=0.3;
  382. int[] candidate = new int[n];
  383. double[] prCandi = new double[n];
  384. for(int i = 0; i < n; i++) {
  385. if (mark[i] == 0) {
  386. candidate[countCandi] = i;// tableau des noeud non visité
  387.  
  388. prCandi[countCandi] = Math.pow(phMat[ path[noeudActuel] ][i],alpha) /
  389. Math.pow(myTsp.getDist( path[noeudActuel], i ),beta);
  390. ++countCandi;// compteur des noeuds non visités
  391. }
  392. }
  393.  
  394. double s = 0;
  395. for(int i = 0; i < countCandi; i++)
  396. s += prCandi[i];
  397. for(int i = 0; i < countCandi; i++)
  398. prCandi[i] /= s;
  399. // probabilité à choi
  400.  
  401. double hit = rg.nextDouble(),
  402. t = prCandi[0];
  403. int w = 0;
  404. for(w = 0; w < countCandi - 1; w++) {
  405. if (t > hit) break;
  406. t += prCandi[w + 1];
  407. }
  408. ++noeudActuel;
  409. path[noeudActuel] = candidate[w];
  410. mark[ candidate[w] ] = 1;
  411. }
  412. }
  413. //******fin de la classe Fourmi*******
  414.  
  415. // constructeur de la classe colony
  416. public colony(int n, double t, double p, tsp s) {
  417. na = n; //nombre des Fourmi
  418. vRate = t;
  419. phAmt = p;
  420. myTsp = s;
  421. bestLength = Double.MAX_VALUE;
  422.  
  423. bestPath = new int[myTsp.getNbreN()];
  424. phMat = new double[myTsp.getNbreN()][myTsp.getNbreN()];
  425. myAnts = new ant[n];
  426. rg = new Random();
  427. for(int i = 0; i < n; i++)
  428. myAnts[i] = new ant(myTsp.getNbreN());
  429. for(int i = 0; i < myTsp.getNbreN(); i++)
  430. for(int j = 0; j < myTsp.getNbreN(); j++) {
  431. phMat[i][j] = 1;
  432. phMat[j][i] = 1;
  433. }
  434. }
  435. //----------------------------------------
  436. public void runOneAnt(int x) {
  437. int i=0 , j=0 ;
  438. myAnts[x].reset();
  439. if (myTsp.distMat[i][j] < 2) // condition ne fonctionne pas !!
  440. {for(int k = 0; k < myTsp.getNbreN() - 1; k++)
  441. myAnts[x].determineNextNoeud();
  442.  
  443. myAnts[x].calculateTraveledLength();
  444. }}
  445. //----------------------------------------
  446. public double runOneCycle() {
  447. for(int i = 0; i < na; i++)
  448. runOneAnt(i);
  449. return updatePhMat();
  450. }
  451. //----------------------------------------
  452. public double updatePhMat() {
  453. int n = Array.getLength( myAnts );
  454. int m = myTsp.getNbreN();
  455.  
  456. controlAnt = -1;
  457.  
  458. for(int j = 0; j < myTsp.getNbreN(); j++)
  459. for(int k = 0; k < myTsp.getNbreN(); k++)
  460. phMat[j][k] *= vRate;
  461.  
  462. for(int i = 0; i < n; i++) {
  463. double t = myAnts[i].getTraveledLength();
  464.  
  465. if (t < bestLength) {
  466. controlAnt = i;// plusieur Fourmi
  467. bestLength = t;
  468. for(int j = 0; j < m; j++)
  469. bestPath[j] = myAnts[i].path[j];
  470. }
  471.  
  472. for(int j = 0; j < m - 1; j++) {
  473. phMat[ myAnts[i].path[j] ][ myAnts[i].path[j+1] ] += phAmt / t;
  474. phMat[ myAnts[i].path[j+1] ][ myAnts[i].path[j] ] += phAmt / t;
  475. }
  476.  
  477. }
  478.  
  479.  
  480.  
  481.  
  482.  
  483. return bestLength;
  484.  
  485. }
  486. }
m
0
l
a b L Programmation
5 Juin 2012 23:31:53

le comportement dans la console est correct ?
Si c'est le cas, c'est un problème d'actualisation d'affichage
m
0
l
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS