2017-03-02 9 views
0

私のインスタンス変数がクラス変数としてちょっとしたことがあると思っています。2つのインスタンス変数が常に互いに更新されています

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

問題がNewsolがsmallchange法を使用して変更されたとき、それはnewsolゾルの両方を変化させることです。私はしばらくこれに固執してきた。

申し訳ありませんが、私はどのようにこの形式の新しい方法は、stackoverflowで尋ねることに新しい。あなたはsolで参照される古いオブジェクトを破棄し、現在は両方の変数solNewsolが同じオブジェクトを識別しているライン

sol = Newsol; 

+0

これはあなたのコードでなぜですか: '// sol = Newsol;'?実行しているコードでコメントアウトされていますか? –

+0

私は何かを試していたので、私はそれを削除するのを忘れてしまった。混乱をおかけして申し訳ありませんが修正されました。 –

答えて

0

。これはあなたが見ている動作につながります。

+0

それは大砲の最大範囲を見つけようとするときに範囲のより大きな値を見つけたらsolを更新することを意味します。これは、ランダム突然変異ヒルクライマーの試みです。 –

関連する問題