2017-03-02 7 views
0

Ich habe ein kleines Problem, wo meine Instanzvariablen irgendwie als Klassenvariablen funktionieren, zumindest das ist, was ich denke.2 Instanzvariablen, die sich ständig gegenseitig aktualisieren

public class Lab10 { 
    public static void main(String[] args) { 
     CannonSolution MaxRange = MAXRMHC(10); 
     MaxRange.println(); 
    } 

    public static CannonSolution MAXRMHC(int iter){ 
     double range =0; 
     double newrange; 
     CannonSolution sol = new CannonSolution(1,1); 
     CannonSolution NewSol = new CannonSolution(sol.SendCanang(),sol.SendCanvel()); 
     range = Cannon.GetMaxRange(sol.SendCanang(),sol.SendCanvel()); 
     for(int i =0;i<iter;i++){ 
      NewSol.smallChange(); 
      newrange = Cannon.GetMaxRange(NewSol.SendCanang(), NewSol.SendCanvel()); 
      if(range <= newrange){ 
       System.out.println(range+" is smaller than "+newrange); 
       NewSol.println(); 
       range = newrange; 
       sol = NewSol; 
      }else if (range > newrange){ 
       NewSol.println(); 
       sol.println(); 
      }else{ 
       System.out.println("I don't work"); 
      } 
     } 
     System.out.println(); 
     System.out.println(range); 
     return (sol); 
    } 
} 


public class CannonSolution { 


    private double canang; 
    private double canvel; 

    public CannonSolution(double ang, double vel){ 

     if(ang <25.0 || ang >55.0){ 
      canang = Randomang(); 
     }else{ 
      canang = ang; 
     } 
     if(vel <1500.0 || vel > 1650.0){ 
      canvel = Randomvel(); 
     }else{ 
      canvel = vel; 
     } 
    } 
    public double SendCanang(){ 
     return (canang); 
    } 
    public double SendCanvel(){ 
     return (canvel); 
    } 

    private static double Randomang(){ 
     double ang = RandomNumber.RandomNum(25,55); 
     return ang; 
    } 
    private static double Randomvel(){ 
     double vel = RandomNumber.RandomNum(1500,1650); 
     return vel; 
    } 
    private void smallChangeVel(){ 
     double vel = canvel; 
     double number = (double) RandomNumber.UI(1,30); 
     double updown = RandomNumber.UI(1,2); 
     if(updown ==1){ 
      vel = vel + number; 
     }else{ 
      vel = vel - number; 
     } 
     if(vel <1500){ 
      vel =1500.0; 
     }else if (vel > 1650){ 
      vel = 1650.0; 
     } 
     canvel = vel; 
    } 
    private void smallChangeAng(){ 
     double ang = canang; 
     double number = RandomNumber.UI(1,3); 
     double updown = RandomNumber.UI(1,2); 
     if(updown ==1){ 
      ang = ang + number; 
     }else{ 
      ang = ang - number; 
     } 
     if(ang <25){ 
      ang =25.0; 
     }else if (ang > 55){ 
      ang = 55.0; 
     } 
     canang= ang; 
    } 
    public void smallChange(){ 
     double updown = RandomNumber.UI(1,2); 
     if(updown == 1){ 
      smallChangeAng(); 
     }else{ 
      smallChangeVel(); 
     } 
    } 
     public void print() 
     { 
      System.out.println(canang); 
      System.out.print(canvel); 
     } 

     public void println() 
     { 
      print(); 
      System.out.println(); 
     } 
    } 

http://pastebin.com/zJWPyz7Q http://pastebin.com/EYugr96p

Das Problem ist, dass, wenn Newsol wird unter Verwendung der Smallchange Methode geändert es sowohl newsol und Sol ändert. Ich war eine Weile auf dieser Sache.

Sorry, ich war mir nicht sicher, wie man das formatiert, um in Stackoverflow zu fragen.

+0

Warum ist das in Ihrem Code: '// sol = Newsol;'? Ist es in dem Code, den Sie ausführen, auskommentiert? –

+0

Ich habe etwas getestet und vergessen, das zu entfernen. Behebt die Verwirrung. –

Antwort

0

Nach der Linie

sol = Newsol; 

Sie das alte Objekt von sol verwiesen verworfen haben und nun beiden Variablen sol und Newsol das gleiche Objekt identifizieren. Dies würde zu dem Verhalten führen, das Sie sehen.

+0

ist es nur dazu gedacht, Sol zu aktualisieren, wenn es einen größeren Wert für die Entfernung findet, da es versucht, die maximale Reichweite der Kanone zu finden. Dies ist eine zufällige Mutation Hill Climber Versuch. –

Verwandte Themen