宇宙破壊ソートを実装する

Tips

スポンサーリンク

この記事で扱っていること

  • 宇宙破壊ソートを実装する方法

を紹介しています。

以前別の記事で、ジョークソートのLabVIEWでの実装方法を紹介しました。

ジョークソートを実装する
本記事では、ジョークソートを実装する方法を紹介しています。

今回はそこで紹介していなかった別のジョークソートである、宇宙破壊ソート(量子ボゴソート)の実装方法を紹介します。

知っている人からしてみると、「え、どうやってこれを実装するの?」という感じだと思いますが、まずこれがどのようなソートであるかを紹介し、私なりに考えた実装方法を紹介していきます。

スポンサーリンク

宇宙破壊ソートとその実行結果

まずそもそも宇宙破壊ソートとは何か、についてですが、英語の論文などの文脈だと量子ボゴソートと表現されるものになります。

ソート対象の要素をランダムにシャッフルし、シャッフルした結果が昇順になっているかを確認、もし昇順になっていなければ、その宇宙を破壊します。
これを行うと、昇順になっていた宇宙だけが残るため、結果として必ずソートが完了しています。
理論上は一瞬でソートが終わりますが、その代わり、ほとんどの宇宙が消滅します。

SF的な、多世界解釈に関連し、ソートができた世界線だけ生き残っている、といった感じです。

これをどうLabVIEWで実装するのか、当然まともには実装できないのでここでは無理やり、「一つのvi」を「一つの宇宙」と見立てるとして、大量のviを用意してボゴソートを行い、その結果ソートされていたらそのviは表示し続け、ソートされていなかったらviを閉じる、という方法で実装しようと思います。

プログラムの構造

ソートを実行するための複数のviをそれぞれ用意するのですが、多くのviを用意するときに、メインviにサブviを直に配置するだけだと、サブviの実行が完了するまでメインviで次の処理ができません。

また、メインviの方で大量のサブviを配置する、ということもできるとは思いますが、柔軟性がありません(例えば100個サブviを置いてうまくいかなかった場合に200個おくとなるとまた労力がかかります)。

なので、サブviを直にメインviのブロックダイアグラムにおくのではなくviサーバーを使って非同期呼び出しをしていきます。

これであれば、Forループの反復回数を変えるだけでいくらでも「宇宙」が作れます。

そんな、呼び出される側のviは以下のようにソートした結果の配列とその結果宇宙がどうなるかをステータスとして文字列で表示するようなフロントパネルを持ちます。

ブロックダイアグラムの方では適当な回数シャッフルを行い、正しく昇順にソートされていたかどうかでその後の処理が決まります。

ソートされていない場合には、自分自身のフロントパネルを閉じてしまいます。

呼び出す側のプログラムは非同期呼び出しを開始を行うのですが、位置を指定しないと適当な場所に重なって表示されることになるため、表示する位置も指定します。

横に何個か並べて、下に移動しさらにまた横に並べる、という処理を実装するために、長いワイヤが多くあります

以下の図では横に5個並べる想定です。

380という定数は使用している画面の横方向に収まる適度な大きさ、200という定数は縦方向に収まる適度な大きさを指定していますが、これらはプログラムを動かす環境(画面の大きさ)により変わるので適宜調整してください。

非同期呼び出しを開始時に定数配列を与えている部分がありますが、これは0から3までの値の配列で、受け取った側でシャッフルします。

4つの数字を並べる並べ方は4!通りあり、25個のサブVIを呼び出すため、おおよそ1個は生き残る世界線があることを想定しています。

VIサーバーの扱い方に慣れる

今回、他のviを非同期で複数呼び出すために使用しているのはVIサーバーを使用した方法です。

これは、VIのリファレンスを開く際のオプション設定が複数あり、結構迷いがちです(今回のプログラムを用意する際に自分も迷いました)。

ただ、単にメインVI上にサブVIを配置するよりも柔軟にVIの呼び出しができるようになるので、この方法に慣れておくに越したことはありません。

NIサンプルファインダの中のVIのプログラム的制御のフォルダにいくつかの例が載っているので、ここを参考にVIサーバーを使ったVIの呼び出し方の他の方法についても見ておくのがいいと思います。

今回は宇宙破壊ソートを疑似的に実装する方法を紹介しました。

現実的には無理なことでも、シミュレーション的に(そして都合よく解釈することによって)目的を達成することができる、という意味では学びがある題材かなと思います。

ただし実装した内容そのものには実用性があるわけではないので、あくまでLabVIEWに慣れること以外はメリットのある話ではないと思いますが、何かの参考になればと思います。

ここまで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました