2015-01-19 4 views
0

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

    } 

}

+0

당신은 (재 페인트를 호출 할 때마다 자신의 paintComponent를 호출 해달라고); 무한 루프를 닫았나요? – Solano

+0

죄송합니다. 답변을 다시 말씀해 주시겠습니까? – monsterbasher

+0

여기에 설명 된대로 [http://stackoverflow.com/questions/16875572/paint-repaint-paintcomponent] repaint()를 호출하면 paintComponent가 호출됩니다. 그래서 당신의 경우에 당신은 무한 루프에 들어갈 것입니다. – Solano

답변

1

구현 연장된다. 내 솔루션은 매우 좋지 않지만 약간의 감정을 줄 수 있습니다.

내 생각은 : Logic 메서드와 Draw 메서드간에 그릴 때 사용할 변수를 공유하십시오. 그래서 당신은 당신이 원하는 때마다 다시 그리기 메소드를 호출 할 수 있으며, paintComponent에 만 공유의 읽기를 실행 바르 tempCitys

같은

뭔가 :

class MyPanel extends JPanel{ 
    private ArrayList<City> tempCity; 
    private ArrayList<City> tempCity2; 

    int delay = 5000; // 5 sec delay. 
    int interval = 1000; // 1 sec interval. 
    Timer timer; 

    public MyPanel(){ 
     timer = new Timer(); 

     timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      doGA(); 
     } 
     }, delay, interval); 
    } 

    public void doGA(){ 
      tempCity = new ArrayList<City>(); 
      tempCity2 = new ArrayList<City>(); 
      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++){ 
        tempCity.add(population.getFittest().getCity(x2)); 
        tempCity2.add(population.getFittest().getCity(x2+1)); 
        repaint(); 
       } 
       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 i=0; i<tempCity.size(); i++){ //Assuming tempCity size = tempcity 2 size (worst way ever) 
      g2.fillOval(tempCity.get(i).getX(), tempCity.get(i).getY(), 10, 10); 
      g2.drawLine(tempCity.get(i).getX(),tempCity.get(i).getY() , tempCity2.get(i).getX(), tempCity2.get(i).getY()); 
     } 
    } 
} 
+0

JFrame을 페인팅하는 createAndDrawGui 메소드에서 doGA() 메소드를 호출했지만 올바른 것으로 보이지 않습니다. doga()라고 불러야하는 아이디어가 있습니까? – monsterbasher

+0

JPanel을 창에 추가 한 후 doGA()를 호출 해보십시오. jpanel을 창에 추가하는 방법을 기억하지 못합니다. – Solano

+0

이 논리는 도시를 나타내는 한 줄과 타원 만 그립니다. 어떤 아이디어라도 난처한 데. – monsterbasher