2017-04-10 11 views
1

私は、スウォームパーティクルアルゴリズムを使用してモバイルリソースを最適化するAndroid Studioプロジェクトを持っています。私は自分のフィットネス機能でこのエラーが発生し続けているので、私の主な活動は決して実行されません。これは私が基本的に、私は主な活動からのユーザ入力を受け取り、中にビットとして使用されているint型の値で、これらの入力を割り当て、ハッシュマップを実装し...PSOのフィットネス機能が自分のコードで機能していませんか?

public class CustomService implements Goodness { 


public static int numOfServices = MainActivity.servicenames.size(); 
public static final int NUM_DIMENSIONS = 1 + numOfServices; 
public static HashMap<String, Integer> serviceMap = new HashMap<String, Integer>(); //hashmap to store values 
ArrayList<String> serviceNames = MainActivity.servicenames; 
ArrayList<Double> costData = MainActivity.costDATA; 
ArrayList<Double> costWlan = MainActivity.costWLAN; 
ArrayList<Double> costUtilities = MainActivity.costUTILITY; 
double batteryCost; 

public void setBatteryCost(double batteryCost) { 
    this.batteryCost = batteryCost; 
} 

public CustomService(double batteryCost, ArrayList<Double> costData, ArrayList<Double> costWlan, 
        ArrayList<Double> costUtilities) { 
    if (costUtilities == null || costUtilities.size() < 1 || costData.size() < 1 || costWlan.size() < 1) { 
     throw new RuntimeException("Please add atleast 1 cost to Data, WLAN and Utility"); 
    } 
    this.batteryCost = batteryCost; //make sure you add battery field to UI, user enters battery level 
    this.costData = costData; 
    this.costWlan = costWlan; 
    this.costUtilities = costUtilities; 
} 


public double getGoodness(boolean[] bits) { 
    double utility = 0.0; 
    double rcost = 0.0; 
    ArrayList<Double> resourceCost = new ArrayList<Double>(); 
    Collections.sort(costUtilities); 
    double maxValue = Collections.max(costUtilities); 
    int NumOfDimensions = serviceMap.size(); 
    serviceMap.put("DATA", 0); 
    serviceMap.put("WLAN", 1); 
    int data = serviceMap.get("DATA"); 
    int wlan = serviceMap.get("WLAN"); 
    for (int i = 2; i <= NumOfDimensions; i++) { //hashmap that stores the service names with a bit value i 
     for (int k = 0; k < numOfServices; k++) { 
      serviceMap.put(serviceNames.get(k), i); //if i = 2, k = 1, put(2, Facebook), put(3, Twitter) 
     } 

     if (bits[data] && bits[wlan]) { 
      return -500; 
     } 
     if (!bits[data] || bits[wlan]) { 
      return -1000; //particle goodness always returns this?? 
     } 
     if (bits[data]) { 
      resourceCost = costData; 
     } else if (bits[wlan]) { 
      resourceCost = costWlan; 
     } 


     for (int n = 2; n <= numOfServices; n++) { 
      if (bits[serviceMap.get(n)]) { 
       utility += costUtilities.get(n - 1); 
       rcost += resourceCost.get(n - 1); 
      } 
     } 
     if (rcost < batteryCost) { 
      return utility; 
     } 
    } 
     return utility * 0.50; 
    } 

} 

上の問題を得続ける私のクラスでありますビット[]配列。これらはあなたが入力/出力パラメータとしてbits配列を使用したい

Caused by: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 
        at test_classes.CustomService.getGoodness(CustomService.java:60) 
        at bpso.BinaryPso.optimize(BinaryPso.java:45) 
        at android_tests.CustomUseCase.test(CustomUseCase.java:56) 
        at ai69.psoui.ParticleActivity.runTest(ParticleActivity.java:108) 
        at ai69.psoui.ParticleActivity$runTests.doInBackground(ParticleActivity.java:59) 
        at ai69.psoui.ParticleActivity$runTests.doInBackground(ParticleActivity.java:56) 
        at android.os.AsyncTask$2.call(AsyncTask.java:295) 
        at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
+0

エラーについては不明な点がありますか? 'bits []'は明らかに長さゼロの配列です。 – john16384

+0

@ john16384ハッシュマップの値を配列に渡したいと思います。ブール値の配列ですが、ユーザが入力したハッシュマップ内のサービスがオン(true)かオフ(false)かに基づいています。 –

答えて

0

それは私には思える...私のエラーです。ただし、作成したアレイのサイズを変更することはできません。だから、いくつかのオプションがあります:

1)の配列は、あなたがそれを渡すserviceNamesと同じサイズを持っていることを確認してください

2)がBitSetList<Boolean>などのサイズを変更できるオブジェクトを(使用します)。配列の代わりに。

3)はgetGoodness内部配列を作成しdoublegetGoodnessの戻り値として作成bitsアレイを有する複合値を返します。

+0

atmに何もない場合、配列がserviceNamesと同じサイズであることを確認する方法はありますか?元のアルゴリズムの実装(Goodnessインタフェース)がgoodness関数のパラメータとしてboolean [] positionを取り、それを変更できないため、配列でなければならない。どうもありがとうございました:) –

+0

'serviceMap.size()'は、 'bits'配列の大きさと思われます。 'getGoodness'を呼び出す呼び出し元コードを制御できない場合、それはうまくいかないでしょう - 呼び出し元がゼロ長の配列を渡しているようです。 – john16384

+0

getGoodnessは私が変更できない実際のアルゴリズム 'bpso'によって呼び出されています。 boolean []ビットはgetGoodness関数のパラメータでなければなりません。私はこれを数日間コード化しようとしてきましたが、最後の静的int型として宣言しない限り、まだビットでサービスを渡すことはできません。サービスの数とサービス名がユーザーの入力内容によって異なるため、私はそれを行うことはできません。とにかく助けてくれてありがとう! –

関連する問題