Traveling Salesman 알고리즘을 Swing GUI로 다시 구현하려고하는데 지금까지 대부분의 작업을 수행 한 것처럼 보입니다. 그러나 생성 크기를 10으로 설정하면 종료 될 때까지 무한 루프가 실행됩니다.유전 알고리즘 여행하기 Salesman prob가 반복적으로 반복합니다
class MyPanel extends JPanel{
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
City city = new City(60, 200);
TourManager.addCity(city);
City city2 = new City(180, 200);
TourManager.addCity(city2);
City city3 = new City(80, 180);
TourManager.addCity(city3);
City city4 = new City(140, 180);
TourManager.addCity(city4);
City city5 = new City(20, 160);
TourManager.addCity(city5);
City city6 = new City(100, 160);
TourManager.addCity(city6);
City city7 = new City(200, 160);
TourManager.addCity(city7);
City city8 = new City(140, 140);
TourManager.addCity(city8);
City city9 = new City(40, 120);
TourManager.addCity(city9);
City city10 = new City(100, 120);
TourManager.addCity(city10);
Population population = new Population(50, true);
for(int i = 0; i<10; i++){
for(int x2 = 0; x2<9;x2++){
City tempCity = population.getFittest().getCity(x2);
City tempCity2 = population.getFittest().getCity(x2+1);
g2.setStroke(new BasicStroke(3));
g2.fillOval(tempCity.getX(), tempCity.getY(), 10, 10);
g2.drawLine(tempCity.getX(),tempCity.getY() , tempCity2.getX(), tempCity2.getY());
}
population = GA.evolvePopulation(population);
repaint();
System.out.println(population.getFittest().getFitness());
}
}
}
갱신 2! :
클래스 MyPanel2 내가 페인트로부터 로직을 분리하려고 말했듯 JPanel에가있는 ActionListener {
private final static int POINTWIDTH = 8;
private final static Color POINTCOLOR = Color.RED;
private final static Color LINECOLOR = Color.GREEN;
private JLabel label = new JLabel();
private City city,city2,city3,city4,city5,city6,city7,city8,city9,city10,city11,city12,city13,city14,city15,city16,city17,city18,city19,city20;
private Population population;
private ArrayList tempCity = new ArrayList<City>();
private ArrayList tempCity2 = new ArrayList<City>();
Timer timer = new Timer(1000, this);
public void doGA(){
city = new City(60, 200);
TourManager.addCity(city);
city2 = new City(180, 200);
TourManager.addCity(city2);
city3 = new City(80, 180);
TourManager.addCity(city3);
city4 = new City(140, 180);
TourManager.addCity(city4);
city5 = new City(20, 160);
TourManager.addCity(city5);
city6 = new City(100, 160);
TourManager.addCity(city6);
city7 = new City(200, 160);
TourManager.addCity(city7);
city8 = new City(140, 140);
TourManager.addCity(city8);
city9 = new City(40, 120);
TourManager.addCity(city9);
city10 = new City(100, 120);
TourManager.addCity(city10);
city11 = new City(180, 100);
TourManager.addCity(city11);
city12 = new City(60, 80);
TourManager.addCity(city12);
city13 = new City(120, 80);
TourManager.addCity(city13);
city14 = new City(180, 60);
TourManager.addCity(city14);
city15 = new City(20, 40);
TourManager.addCity(city15);
city16 = new City(100, 40);
TourManager.addCity(city16);
city17 = new City(200, 40);
TourManager.addCity(city17);
city18 = new City(20, 20);
TourManager.addCity(city18);
city19 = new City(60, 20);
TourManager.addCity(city19);
city20 = new City(160, 20);
TourManager.addCity(city20);
population = new Population(50, true);
for (int i = 0; i < 100; i++) {
population = GA.evolvePopulation(population);
repaint();
System.out.println(population.getFittest().getFitness());
}
}
public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setStroke(new BasicStroke(3));
for(int x = 0; x<19;x++){
g2.setColor(LINECOLOR);
//g2.drawLine(tempCity.get(x).getX(), tempCity.get(x).getY(), tempCity2.get(x).getX(), tempCity2.get(x).getY());
g2.drawLine(population.getFittest().getCity(x).getX(), population.getFittest().getCity(x).getY(), population.getFittest().getCity(x+1).getX(), population.getFittest().getCity(x+1).getY());
g2.setColor(POINTCOLOR);
g2.fillOval(population.getFittest().getCity(x).getX() - POINTWIDTH/2, population.getFittest().getCity(x).getY() - POINTWIDTH/2, POINTWIDTH, POINTWIDTH);
}
g2.setColor(LINECOLOR);
g2.drawLine(population.getFittest().getCity(19).getX(), population.getFittest().getCity(19).getY(), population.getFittest().getCity(0).getX(), population.getFittest().getCity(0).getY());
g2.setColor(POINTCOLOR);
g2.fillOval(population.getFittest().getCity(0).getX() - POINTWIDTH/2, population.getFittest().getCity(0).getY() - POINTWIDTH/2, POINTWIDTH, POINTWIDTH);
}
}
당신은 (재 페인트를 호출 할 때마다 자신의 paintComponent를 호출 해달라고); 무한 루프를 닫았나요? – Solano
죄송합니다. 답변을 다시 말씀해 주시겠습니까? – monsterbasher
여기에 설명 된대로 [http://stackoverflow.com/questions/16875572/paint-repaint-paintcomponent] repaint()를 호출하면 paintComponent가 호출됩니다. 그래서 당신의 경우에 당신은 무한 루프에 들어갈 것입니다. – Solano