デジタル推進課

KNIME・Excel Macro・Power Automateなど日々の業務で使用できる自動化ツールを中心に書き綴ります

KNIME - 無限列車!? 終了条件まで無限回数繰り返すには?~Recursive Loop Start / End 再帰型ループ~

 

f:id:makkynm:20210509214545p:plain

 

はじめに

こんにちは、まっきーです。今回は少し高度なループ、再帰型ループ(Recursive Loop)について解説したいと思います。

例は実用的ではないですが、習得すれば色々応用が効くのでぜひ習得してみてください!また、今回初の試みで問題を出題してみました。ブログは一方的なツールなので、少しでもインタラクティブにできたらなーと思っています。ぜひコメント等いただけると非常に嬉しいです!

 

 今回のテーマ ~Recursive Loop 再帰型ループ~

f:id:makkynm:20210509181903p:plain

 今回のテーマ ~Recursive Loop~

 

覚えてほしいこと

再帰ループは前のLoopの結果を次のLoopのInputとして使いたい時に使う

 

やりたいこと

Recursive Loop(再帰ループ)は例を難しくすると理解が大変だと思うので、算数の問題を解くことを例として説明したいと思います。

この問題の答えをKNIMEのRecursive Loop(再帰ループ)を使って解いてみたいと思います。

 

問題

初期値が下記の数字だとします。

初期値:1, 5, 6, 9, 13

これらの数字に3ずつ足して行ったとき、20以上になるのは何回3を足した時でしょうか。

 

答え

初期値

3を足した回数

20以上になった時の数

1

7

22

5

5

20

6

5

21

9

4

21

13

3

22

 

解説

問題文が分かりにくかったらすみません。。。

初期値が1の時、7回3を足すと22になるので初めて20以上になりますよね。プログラミング的なフローチャートで書くとこんな風な形です。

f:id:makkynm:20210509180442p:plain

フローチャート

 

Recursive Loop Start / End(再帰型ループ)の使い方

Recursive Loopとは、再帰型ループと言われるものです。1つ前のLoopのOutputが次のLoopのInputとして帰ってくるので、再帰型なんですかね。

 

終了条件

 無限ループに陥らないように、終了条件を設ける必要があります。

 終了条件は、3種類あります。

  1.  次のInputが最低行数を下回る(Recursive Loop Endの下のPortの行数)
  2.  最大繰り返し回数に達する(Recursive Loop EndのConfigureで設定)
  3.  変数を指定してtrueを流す(任意 - Recursive Loop EndのConfigureで設定)

注意点

 OutputのTableの形がInputと同じでなければいけない

 ※出てきたOutputをInputで使うので、基本的にはTableの形(コラムの数等)は同じにしたの方がエラーが少ないWorkflowになる。

 

Workflow - Recursive Loop 

今回のような、条件付きLoopを行う場合、直前にRow Splitter系のNodeを置くと便利です。

その他ののConfigurationは下の方につけておきます。

f:id:makkynm:20210509185914p:plain

Workflow - Recursive Loop 

Workflowは下記からダウンロードできます。

無限回繰り返す再帰型 - Recurrsive Loop – KNIME Hub

Confirm - Recursive Loop 

最初のTable Creatorと最後のOutputを見てみましょう。

最初のTableで定義した初期値(Valueコラム)が、繰り返し処理によって20以上の数字まで足されていることが分かります。また、Iterationは20以上になった時の繰り返し回数を記録しています。(0スタートなので、答えの回数は + 1 した数字になります。)

f:id:makkynm:20210509190043p:plain

Confirm - Recursive Loop 

 

Recursive Loopの一番重要な点は、Recursive Loop EndのInput Portの意味を理解することです。

上のPort(上のInput):結果を保存するPort。このPortに入ってきたTableは繰り返されない。

下のPort(下のInput):次のLoopのInputとしてRecursive Loop StartのInputに戻ってくる。このTableの行数も終了条件の一つ。

f:id:makkynm:20210509181903p:plain

 Recursive Loop - Portの意味

 

Configure - Recursive Loop Start / End

設定が難しそうに感じるかもしれませんが、WorkflowのPortさえ間違えなければ特にConfigureはすることありません!どれも任意項目です。Recursive Loop StartはConfigureの設定することがないのでスキップします。

Recursive Loop EndはOptionがあるのでそちらを解説しますね。

f:id:makkynm:20210509190811p:plain

Configure - Recursive Loop EndのOption
Step1 - End settings 終了条件の指定

無限ループを避けるため、3つの終了条件があります。

  • Maximal number of iterations 最低行数:Loopを回す最低行数を指定します。

これを下回った時、Loopが終了します。デフォルトでは1になっているので、下のInputのPortに0行のTableが入力された時にLoopを終了することになります。

 

  • The maximum number of iterations 最大繰り返し回数:Loopの最大繰り返し回数を指定します。

無限ループを避けるためにこの条件があります。今回の場合、100回繰り返してもまだ最低行数や変数の終了条件に当てはまらない場合、強制的に終了させることができます。

 

  • End Loop with Variable 変数:指定した変数が"true"という値を持った時に終了させます。Rule Engineと相性がいいでしょう。これは任意なので指定しなくてもOKです。
Step2 - Data settings データの設定

続いて上のOutputのTableをどうするかの設定です。

  • Collect data from last iteration only:終了した時、最後のLoopで出てきたOutputだけを取り込む設定です。それまで蓄積されていた上のPortに流れてくるTableのデータは捨てます。

 

  • Add iteration column:繰り返し回数のコラムとして追加します。0がスタートになっているので少し注意が必要です。

 

 ちょっと一言

その他のNodeのConfiguration

先ほど使用したWorkflowのその他のNodeのConfigurationを貼り付けます。中級編まで終わっている人は見なくてもできると思いますが、わからん!って人は真似してみてください。

Node1 - Table Creator

degitalization.hatenablog.jp

 

f:id:makkynm:20210509193201p:plain

Node1 - Table Creator
Node2 - Math Formula

初期値として値をコピーします。整数型に変換も行なっています。

degitalization.hatenablog.jp

 

f:id:makkynm:20210509193252p:plain

Node2 - Math Formula

 

Node3 - Recursive Loop Start

f:id:makkynm:20210509193436p:plain

Node3 - Recursive Loop Start

Node4 - Math Formula

3ずつ足していく部分です。値を置き換える設定にしている点が必須です。

f:id:makkynm:20210509193516p:plain

Node4 - Math Formula
Node5 - Row Splitter

20以上かどうかを判断する部分です。これが再帰型ループには必須ですね。 

degitalization.hatenablog.jp

f:id:makkynm:20210509193604p:plain

Node5 - Row Splitter

 

類題 - フィボナッチ数列を計算してみよう

みなさん、フィボナッチ数列はご存知ですか?

F0 = 0
F1 = 1
Fn+2 = Fn + Fn+1 (n ≥ 0)

参考:フィボナッチ数 - Wikipedia

 

このフィボナッチ数列が初めて1,000,000を超えた時の数字をRecursive Loopを使用して求めてみてください!

また、それまでのフィボナッチ数列を全て一度に出力してみてください。

ぜひコメントでその数字がなんだったのか、どうやって作ったかを投稿してみてください〜!お待ちしております!!

 

 

どんなWorkflowでもいいのですが、私は最初のTable Creatorをこのように作りました。

f:id:makkynm:20210509195333p:plain

最初のTable Creator

 

おわりに

お疲れ様でした!

 

 

  

KNIMEに関する本

KNIMEに関する日本語の本って今これくらいしかないと思うんですよね、、

本がいいなーと言う人はぜひ試してみてください。

 

参考リンク