2016-11-18 14 views
0

動的プログラミングを使用してScalaのナップザック問題を解決しようとしています。要件の一部として、Knapsackで埋められるアイテムを選択する必要もあります。しかし、 "ArrayIndexOutOfBoundException"が表示されます。 そして、これまでのところ、私はコードは次のようである持っているもの:ArrayIndexOutofBoundsExceptionナップザックScala

availableMoney is equivalent to weight of knapsack.products.channels is equivalent to value[] in knapsack.products.price is equivalent to weight[] in knapsack. 

def knapSack(availableMoney: Int, products: List[Product]) : Int = { 
    var wt = List[Int](products.length) 
    var value = List[Int](products.length) 
    for (product <- products) { 
     value ::= product.channels.length 
     wt ::= product.price 
    } 

    val matrix = Array.fill(2, 2)(0) 
    val picks = Array.fill(2, 2)(0) 


    for (i <- 1 to products.length){ 
     for (j <- 0 to availableMoney){ 
      if (wt(i-1)<=j){ 
       matrix(i)(j) = max(matrix(i-1)(j),value(i-1)+matrix(i-1)(j-wt(i-1))); 
       if (value(i-1)+matrix(i-1)(j-wt(i-1))>matrix(i-1)(j)) 
        picks(i)(j)= 1; 
       else 
        picks(i)(j)= -1; 
      } 
      else{ 
       picks(i)(j) = -1; 
       matrix(i)(j) = matrix(i-1)(j); 
      } 
     } 
    } 

    matrix(products.length)(availableMoney) 

} 
+1

どこで例外がありますか? – Carcigenicate

+1

'for(i < - 1 to products.length)'はおそらく 'for(i < - 1(products.length - 1))'であるべきです。範囲内の最大値が排他的かどうかはわかりません。 – Carcigenicate

+1

演算子 'to'はRange.Inclusiveで、' until'はRange.Exclusiveです。 IDEを使用してこれらの演算子にカーソルを合わせると、その説明(包括的/排他的)が表示されます。したがって、おそらく 'products.length'まででなければなりません。 – radumanolescu

答えて

0

私が考える問題のカップルがあります:

  • jは0からavailableMoneyに実行し、その後、picksへのインデックスとして使用され、特定のサイズに初期化されているので、availableMoneyがそれらの寸法を超えた場合、それは私がproducts.length 1から実行もpicksmatrixへのインデックスとして使用される
  • を失敗するので、0を見逃すことになり、matrix場合が2次元目のサイズよりも多くの製品が失敗すると、エラーが発生します。

何が起こっているのかをさらに詳しく調べるには、printlnデバッグを使用してください。興味深いアルゴリズムのように見えます。一度あなたがそれを働かせたら私達に解決策を投稿してください:)