Javaで書いたコードをRubyで書きたい
Javaで書いた動的計画法(ナップザック問題)のコードをRubyで書きたいです。
Java
1public class KnapsackDP { 2 // ナップザックの耐重量 3 public static final int KNAP_MAX = 6; 4 5 // 品物の種類 6 public static final int ITEM_NUM = 5; 7 8 // 品物の名称 9 public static char[] name = { 'A', 'B', 'C', 'D', 'E' }; 10 11 // 品物の重量 12 public static int[] weight = { 1, 2, 3, 4, 5 }; 13 14 // 品物の価値 15 public static int[] value = { 100, 300, 350, 500, 650 }; 16 17 // 品物を吟味した直後の価値 18 public static int[][] maxValue = new int[ITEM_NUM][KNAP_MAX + 1]; 19 20 // 最後に入れた品物 21 public static int[] lastItem = new int[KNAP_MAX + 1]; 22 23 // item番目の品物を吟味した直後のナップザックの内容を表示するメソッド 24 public static void showKnap(int item) { 25 int knap; // 0kg~6kgのナップザックを指す 26 27 // 吟味した品物の情報を表示する 28 System.out.printf("<%c, %dkg, %d円を吟味した結果>\n", 29name[item], weight[item],value[item]); 30 31 // ナップサックの耐重量を表示する 32 for (knap = 0; knap <= KNAP_MAX; knap++) { 33 System.out.printf("%dkg¥t", knap); 34 } 35 System.out.printf("\n"); 36 37 // ナップザックに詰められた品物の価値の合計を表示する 38 for (knap = 0; knap <= KNAP_MAX; knap++) { 39 System.out.printf("%d円¥t", maxValue[item][knap]); 40 } 41 System.out.printf("\n"); 42 43 // ナップザックに最後に入れた品物を表示する 44 for (knap = 0; knap <= KNAP_MAX; knap++) { 45 if (lastItem[knap] != -1) { 46 System.out.printf("%c¥t", name[lastItem[knap]]); 47 } 48 else { 49 System.out.printf("なし¥t"); 50 } 51 } 52 System.out.printf("¥n¥n"); 53 } 54 55 // プログラムの実行開始位置となるmainメソッド 56 public static void main(String[] args) { 57 int item; // 品物の番号 58 int knap; // 0kg~6kgのナップザックを指す 59 int selVal; // 仮に選んだ場合の価値の合計値 60 int totalWeight; // 重量の合計値 61 62 // 0番目の品物を吟味する 63 item = 0; 64 // 0kg~KNAP_MAXkgのナップザックで吟味する 65 for (knap = 0; knap <= KNAP_MAX; knap++) { 66 // 耐重量以下なら選ぶ 67 if (weight[item] <= knap) { 68 maxValue[item][knap] = value[item]; 69 lastItem[knap] = item; 70 } 71 // 耐重量以下でないなら選ばない 72 else { 73 maxValue[0][knap] = 0; 74 lastItem[knap] = -1; 75 } 76 } 77 showKnap(item); 78 79 // 1番目~ITEM_NUM-1番目の品物を吟味する 80 for (item = 1; item < ITEM_NUM; item++) { 81 // 0kg~KNAP_MAXkgのナップザックで吟味する 82 for (knap = 0; knap <= KNAP_MAX; knap++) { 83 // 耐重量以下の場合 84 if (weight[item] <= knap) { 85 // 選んだ場合の価値を求めてみる 86 selVal = maxValue[item - 1][knap - weight[item]] + value[item]; 87 // 価値が大きくなるなら選ぶ 88 if (selVal > maxValue[item - 1][knap]) { 89 maxValue[item][knap] = selVal; 90 lastItem[knap] = item; 91 } 92 // 価値が大きくならないなら選ばない 93 else { 94 maxValue[item][knap] = maxValue[item - 1][knap]; 95 } 96 } 97 // 耐重量以下でないなら選ばない 98 else { 99 maxValue[item][knap] = maxValue[item - 1][knap]; 100 } 101 } 102 showKnap(item); 103 } 104 105 // ナップザックに入っている品物を調べて、解を表示する 106 System.out.printf("<ナップザックに入っている品物を調べる>¥n"); 107 totalWeight = 0; 108 for (knap = KNAP_MAX; knap > 0; knap -= weight[item]) { 109 item = lastItem[knap]; 110 System.out.printf("%dkgのナップザックに入れた品物は%cです。¥n", knap, name[item]); 111 totalWeight += weight[item]; 112 System.out.printf("%c, %dkg, %d円¥n", name[item], weight[item], value[item]); 113 System.out.printf("%dkg - %dkg = %dkgです。¥n", knap, weight[item], knap - weight[item]); 114 } 115 System.out.printf("¥n<解を表示する>¥n"); 116 System.out.printf(" 重量の最大値 = %dkg¥n", totalWeight); 117 System.out.printf("価値の最大値 = %d円¥n", maxValue[ITEM_NUM - 1][KNAP_MAX]); 118 } 119}
どんな小さなことでもいいので、少しでもアドバイスしてもらえたら幸いです。
できれば、まず、自分でできるところまで書いてもらった方が。
なにも書いてないならアドバイスしようがないところもあります。質問者がどの程度できるかとか、知ってるかとか、そういう情報もないので
何に困っているんですか?
そもそも論ですが、Rubyで書き直したい理由は何でしょうか?(状況によっては「元のコードはJavaのまま、RubyのコードをJRubyで実行することで連携する」という選択も可能です)
ここに書かれている内容でアドバイスをするとしたら「Rubyの入門書を読むところから始めましょう」以上の回答はない気がするんですが。
Javaは全く触れたことがなくて、どの行が何をしているのかが分からないので、変数の宣言と初期化の両立はこうやってやる、みたいなことを知りたいです。
それは推奨されない質問です。
https://teratail.com/help/avoid-asking
「まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。」
でも結局Rubyで組むのでしたらアルゴリズムや設計だけ持ってきてJavaのコードは忘れた方が良いのでは?
すみません。では、showKnapメソッドの「int knap;」は、Rubyでどのように書けば良いのでしょうか。
Javaで書いたコードということなので、Javaのコードはご自分で書いたものなのでしょう。
なので、Javaのコードは全て理解出来ているはずです。
であれば後はRubyの基礎(for文、if文、配列操作、関数等)が分かれば出来るのでは?
すみません。Javaは触れたことがなくて、このコードは僕が書いたコードではないです。Rubyは大体分かります。
Rubyに明示的な変数宣言がないことも知らないようなら、Rubyも触れたことが無いんですよね?
ならやっぱり「Rubyの入門書を読むところから始めましょう」以上の回答はない気がするんですが。
Rubyの文法を1から10まで質問するつもりですか?
まずは書いてみましょう。
class KnapsackDP
KNAP_MAX = 6
ITEM_NUM = 5
name = ["A","B","C","D","E"]
weight = [1,2,3,4,5]
value = [100,200,300,350,500,650]
max_Value = [[ITEM_NUM],[KNAP_MAX + 1]]
last_Item = [KNAP_MAX + 1]
def showKnap(int, item)
end
end
今ここまで出来たのですが、「int knap;」の部分をRubyでどうやって書けばいいのか分かりません。
ま、まさか、今まで型指定しないで、変数とかメンバの宣言してたんですか?
Rubyやっておきながら。
記載のコードは全部型推論で宣言してるようなので、心配になりました。
型に関しては、理解されておりますか??
失礼しました、Rubyは動的型付けでしたね、すみません。勘違いしてました。
型に関する理解があれば、
int knap;をRubyでどう宣言すればいいかは自ずと答えが出るかと思います。
なので、型に関しての理解を聞きました。
Javaは静的型付けなので、型に関して理解ないと、翻訳は難しいかと思います。
自分で書いてないと言うことは、タイトルが間違っていたと言うことですね。
誤:Javaで書いたコードをRubyで書きたい
正:Javaで書かれたコードをRubyで書きたい
ozwkさんの回答をさらにザックリとRuby知らない観点で書いた私の回答で解決とされたのがなぜかが気になります。
https://teratail.com/help/question-tips#questionTips4-2
ありがとうございました。もう一度自分で整理してみます
回答2件
あなたの回答
tips
プレビュー