VBAサンプル集
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№2

ExcelマクロVBAの実用サンプル、エクセルVBA集と解説
公開日:2013年5月以前 最終更新日:2017-11-26

数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№2


数独(ナンプレ)を解くアルゴリズムを例に、アルゴリズムの要点と、それによるパフォーマンスを検証します、



候補数値の少ないマスからチェックするように改造します。

変更は、getBlankだけになります。

このプロシージャーで、次に試行するマスを決定しているので、

この時に、候補数値のより少ないマスを返すように変更します。


Function getBlank(ByRef SuAry() As Integer, ByRef i1 As Integer, ByRef i2 As Integer) As Boolean
  Dim i3 As Integer
  Dim cnt As Integer
  Dim tryMin As Integer
  Dim i1Min As Integer
  Dim i2Min As Integer
  tryMin = 10
  For i1 = 1 To 9
    For i2 = 1 To 9
      If SuAry(i1, i2) = 0 Then
        cnt = 0
        For i3 = 1 To 9
          If chkSu(SuAry, i1, i2, i3) = True Then
            cnt = cnt + 1
          End If
        Next
        If tryMin > cnt Then
          i1Min = i1
          i2Min = i2
          tryMin = cnt
        End If
      End If
    Next
  Next
  If tryMin = 10 Then
    getBlank = False
  Else
    i1 = i1Min
    i2 = i2Min
    getBlank = True
  End If
End Function

1~9を回し、chkSuがTrueのカウントをとり、最も小さいマスを返すようにしています。


実際に動かしてやってみて下さい。

違いは歴然です。

当然、問題にもよりますが、一般に上級とされる問題なら、

以前は、試行回数が数万程度だったものが、数百程度に減っています。

当然、処理時間も激減しています。

数種類の問題で、セルへの途中表示をコメントアウトし試したところ、

№1のアルゴリズムは、1万~7万の試行回数で、0.2秒~0.8秒

№2のアルゴリズムは、90~800の試行回数で、0.1秒~0.4秒


いきなり、大幅に改善されてしまいました。

まさに、ここがアルゴリズムの要点だったのです。

ここに手を付けずに、他の箇所をいろいろ工夫したところで、

労多くして実り少ない事になるでしょう。

どうしても、全数チェックではダメだと考えた時、

数独を解くセオリーを調べ、それをプログラミングしようとしてしまいます。

しかし、生半可なアルゴリズムでは、結局複数候補のマスが多く残ってしまい、

最期は全数チェックに頼らざる負えなくなります。

つまり、この全数チェックのアルゴリズムは避けて通れないのです。

ならば、この全数チェックを、より有効なアルゴリズムにする事が、

パフォーマンスを上げる一番の近道だと考える事も出来ます。


この時、アルゴリズムの要点をどう見つけるか・・・

これには、経験と勘が必要であり、

また、実際の動きを注意深く観察する事も重要なのです。

理論と実践、この繰り返しになります。


№3へ続きます。

数独を解くアルゴリズムの要点とパフォーマンスの検証 №1 №2 №3 №4



こちらの最終完成版のダウンロード



同じテーマ「マクロVBAサンプル集」の記事

アメブロの記事本文をVBAでバックアップする№1
数独(ナンプレ)を解くVBAに挑戦№1
数独(ナンプレ)を解くアルゴリズムの要点とパフォーマンスの検証№1
ナンバーリンク(パズル)を解くVBAに挑戦№1
ナンバーリンクを解くVBAのパフォーマンス改善№1
オセロを作りながらマクロVBAを学ぼう
他ブックへのリンクエラーを探し解除
Excelシートの複雑な計算式を解析するVBA
Excel将棋:マクロVBAの学習用(№1)
Excel囲碁:万波奈穂先生に捧ぐ
Excel囲碁:再起動後も続けて打てるように改造


新着記事NEW ・・・新着記事一覧を見る

第5章:AI×VBAでつまづかない!トラブルシューティングとAIとの付き合い方 |生成AI活用研究(2025-05-20)
第4章:【事例で学ぶ】AIとVBAでExcel作業を劇的に効率化する! |生成AI活用研究(2025-05-20)
第3章:AIを「自分だけのVBA先生」にする!質問・相談の超実践テクニック|生成AI活用研究(2025-05-19)
第2章 VBAって怖くない!Excelを「言葉で動かす」(超入門)|生成AI活用研究(2025-05-18)
第1章:AIって一体何?あなたのExcel作業をどう変える?(AI超基本)|生成AI活用研究(2025-05-18)
AI時代のExcel革命:AI×VBAで“書かない自動化”超入門|生成AI活用研究(2025-05-17)
Geminiと100本ノック 23本目:シート構成の一致確認|生成AI活用研究(5月16日)
AIが問う出版の未来は淘汰か進化か:AIと書籍の共存の道とは|生成AI活用研究(2025-05-16)
Geminiと100本ノック 22本目:FizzBuzz発展問題|生成AI活用研究(5月15日)
すぐに使える!生成AI プロンプト作成 実践ガイド|生成AI活用研究(2025-05-15)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.繰り返し処理(For Next)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
5.ひらがな⇔カタカナの変換|エクセル基本操作
6.RangeとCellsの使い方|VBA入門
7.メッセージボックス(MsgBox関数)|VBA入門
8.セルのクリア(Clear,ClearContents)|VBA入門
9.FILTER関数(範囲をフィルター処理)|エクセル入門
10.条件分岐(Select Case)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ