top of page

​タグ一覧

配列処理(73)

階層化フォーム(33)

ファイル操作(28)

開発事例(22)

シート・セル操作(19)

図形操作(15)

ユーザーフォーム(10)

コード自動生成(10)

設計思想(9)

講座実施報告(9)

文字列操作(8)

開発効率化(6)

数学(6)

GAS(5)

アニメーション(5)

技術解説(4)

イミディエイトウィンドウ(4)

Googleスプレッドシート(4)

副業(4)

クリップボード(4)

条件付き書式(4)

その他(4)

イベントプロシージャ(3)

ココナラ(3)

小説(3)

HTML(3)

JavaScript(3)

OneDrive(2)

Enum(2)

PDF(2)

フリーランス(2)

リスキリング(2)

Outlook(2)

介護(2)

Discord(2)

シフト表(2)

LookerStudio(2)

日報(2)

カレンダー(2)

罫線(2)

パズル(2)

小ネタ(2)

コード解説(2)

クラスモジュール(2)

ステータスバー(1)

コード解析(1)

バックアップ(1)

可変長引数配列(1)

ブック処理(1)

スクレイピング(1)

スプレッドシート(1)

coconala(1)

リボン登録マクロ(1)

QRコード(1)

実行予約(1)

給与計算(1)

VBA不使用(1)

リボン(1)

超勉強会(1)

スピログラフ(1)

図名描写(1)

連想配列(1)

溶接ロボット(1)

保育士(1)

楽天市場(1)

経理(1)

医療(1)

文書作成(1)

発注書(1)

ショートカット(1)

WebAPI(1)

色操作(1)

スーパー開発ショートカット(1)

ライブラリ処理(1)

放課後等デイサービス(1)

児童福祉支援(1)

学校(1)

UI(1)

CAD(1)

カーソル操作(1)

チェックボックス(1)

Antigravity(1)

Webアプリ(1)

イラストロジックの自動解答アルゴリズム 第2章

前回に引き続きイラストロジックの解答アルゴリズムを紹介します。


前回記事↓

イラストロジックの自動解答アルゴリズム 第1章


前回記事では1マスの解答パターンを「○」「・」「●」の3種類を分けて説明していましたが、これらの3種類の解答を数字とおいて行列演算で解答アルゴリズムを構築していきます。

行列演算を行うことでより高速に計算を処理することができます。

なぜなら、前回記事における「○」「・」「●」はそれぞれを判定するためにプログラム上では文字列操作で行う必要があり、1つ1つのマスを検証したりする必要があります。代わりに行列演算だとそれらを一括で行えたりします。

またプログラムのコード自体もより簡略化することができます。


具体的に数字に置き換えるのは次の通りです。

白マス「・」=0

未確定マス「○」=1

黒マス「●」=2


前回記事における初回解答の図1は次のようになります。

図1:初回解答
図1:初回解答

具体的に追加解答でのアルゴリズムは次のようになります。

図2:追加解答(黒マスが追加、該当数字が1つ) その1
図2:追加解答(黒マスが追加、該当数字が1つ) その1

追加解答に該当する数字3のパターン行列に計算を適応します。

解行列A、パターン行列Cとおき、CAにおいて最大値と一致する要素が有効(OK)で、それ以外を無効(NG)と判定できます。

有効、無効をもとに無効化行列Dを作成します。

DCを計算するとパターン行列で無効な行を0にしたC'が計算されます。

C'において行合計行列QをかけてC'Qを計算すると、C'の各行での合計が計算されます。このC'Qの総和を数字(=3)で割った値が有効パターンの数となります。

列合計行列PとC'をかけてPC'において0の要素は白マス「・」、有効パターン数と一致する要素は黒マス「●」、それ以外は未確定マス「○」となります。


以上で1つの数字におけるパターン行列に新しい追加解を適応して新しい解を出力できます。


追加解がほかの数字に該当する場合は次のようになります。

図3:追加解答(黒マスが追加、該当数字が1つ) その2
図3:追加解答(黒マスが追加、該当数字が1つ) その2

次に追加解が白マス「・」の場合も考えます。

先ほどの演算と同様に計算することができます。

図5:パターン行列から開始位置、終了位置を計算 その1
図5:パターン行列から開始位置、終了位置を計算 その1

連番基本行列B、逆連番基本行列B'を用意します。

終了位置はBC'Qの最大値を数字で割った値で求まります。

開始位置はB’C'Qの最大値と解答パターン個数などを利用して求まります。


なお、開始位置はBC'Qの最小値で求まりそうな気もしますが、これは演算上必ず最小値は0になってしまうので一工夫しています。


図5ではわかりにくいと思いますので、より大きなパターン行列での計算例は図6のようになります。

図6:パターン行列から開始位置、終了位置を計算 その2
図6:パターン行列から開始位置、終了位置を計算 その2

ここで出てきた行合計行列Q、列合計行列P、連番基本行列B、連番逆基本行列B'はプログラムの中では最初に用意しておいて、大きさを指定して必要な時に呼び出すことで計算を高速化することができます。

またmax,sumなどはVBAでの標準の関数を利用することができます。



イラストロジックの解答アルゴリズムの紹介は以上です。

実際に開発したプログラムは技術流出の懸念から公開は致しません。

興味のある方は直接ご連絡ください。


あと、詳しく調べていませんが今回紹介したアルゴリズムはどこにも転がっていなかったので、あわよくばまだ誰も発表していないものかもしれません。

自分で論文で出すのはめんどくさいので、共著で論文出したいって人もまた連絡ください。

Excel VBAによる業務自動化・ツール開発をご検討の方へ

​"脱Excel"の前に、現状のExcelの潜在能力を120%発揮してみませんか?

Softex-Celware

​インボイス登録番号:T5810983887134

  • Facebook
  • Twitter
  • YouTube

©2023 softex-celware。Wix.com で作成されました。

bottom of page