鉛筆パズルの整数計画法による解法定式化集 52. 天体ショー http://www.nikoli.co.jp/ja/puzzles/astronomical_show.html 例題 (ニコリのパズル紹介より) 解答 ルール マスの境界に太線を引いて、盤面をいくつかのブロックにに分割する。 ①すべてのブロックが星(○か●)を一つずつ含み、しかも星を中心とした点対称の図形 になるようにしなければならない。 ②●の入ったブロックは、すべて黒くぬりつぶす。 ○と●は、パズルを解く上では区別をする必要がない。ルール②は正解を求めることとは 関係がないので、ルールではない。 マスの行番号をI、列番号をJとし、星にも番号を振っておく。星はマスの境界線上に置かれた ものがあるので、星用の座標(II,JJ)も用意する。 JJ → 1 II 1 ↓ 2 I 1 ↓ 3 2 3 . . . 2*Nr-1 . . . Nr 2 3 J → 1 2 2*Nc-1 3 ① . . . ②Nc ③ 星の入ったマス、或いは境界線上に星があるマスは その星の所属マスとなるので、所属を選択できる自由な マスは意外と数が少なく、この例題では、左図で灰色に 塗ったマスだけである。 各星の、これらの灰色マスの点対称の位置を調べて、 点対称マスが全て盤の外または、他の星の領域上に重なって しまい、灰色マスと重なるものが一つもないとき、その星 のブロックは拡張の可能性がなく、境界は最小領域に確定 してしまう。 盤の4隅、辺に並んだ星などは、調べるまでもなく、 単独マスブロックとなる。 境界が決定してしまう星は、事前に調べておく。 この例題の場合、左図の赤描きの星が該当し、その境界も 図のように決定する。 この例では、整数計画法に残された仕事が殆どなくなって いるが、普通の問題では、こうはならない。 変数 S(I,J,K) = 1 = 0 マス(I,J)が星Kのブロックに所属するとき 〃 しないとき 目的関数 minimize (ダミー) x 制約式 subject to 1.マスはどれかの星に属する Ns S(I,J,K)= Σ K=1 1 (I=1,2,....Nr) (J=1,2,....Nc) Nsは星の総数 2.星のあるマスはその星のブロックに所属する S(I,J,K)= 1 (I=1,2,....Nr) (J=1,2,....Nc) (K=1,2,....Ns) (I,J)は星Kのあるマスまたは 星が掛かっているマスの座標 3.点対称自由マスを持たない星Kのブロックは領域が確定する S(I,J,K)= 0 (K=1,2,....Ns) (I,J)は星Kの最小領域以外のマス 4.マス(I,J)がKの星に属すればその点対称位置のマスもKに属する S(I,J,K) ≦ S(II,JJ,K) (K=1,2,....Ns) (I,J)は自由マス座標、(II,JJ)はその星 Kに関する点対称位置 5.自由マスは単独ブロックにならない S(I,J,K) ≦ S(I-1,J,K)+S(I+1,J,K)+S(I,J+1,K)+S(I-1,J,K) (I,J)は自由マス座標 (K=1,2,....Ns) 6.自由マスは2マスブロックにならない タテ S(I,J,K)+S(I+1,J,K)-1 ≦ S(I-1,J,K)+S(I,J-1,K)+S(I+1,J-1,K)+S(I+2,J,K) +S(I+1,J+1,K)+S(I,J+1,K) ヨコ S(I,J,K)+S(I,J+1,K)-1 ≦ S(I,J-1,K)+S(I-1,J,K)+S(I-1,J+1,K)+S(I,J+2,K) +S(I+1,J+1,K)+S(I+1,J,K) (K=1,2,....Ns) (I,J)は自由マス座標 7.自由マスは3マスL型ブロックにならない S(I,J,K)+S(I+1,J,K)+S(I+1,J+1,K)-2 ≦ S(I-1,J,K)+S(I,J-1,K)+S(I+2,J,K)+S(I+2,J+1,K) +S(I+1,J+2,K)+S(I+1,J+2,K)+S(I,J+1,K) S(I,J+1,K)+S(I+1,J,K)+S(I+1,J+1,K)-2 ≦ S(I,J,K)+S(I+1,J-1,K)+S(I+2,J,K)+S(I+2,J+1,K) +S(I+1,J+2,K)+S(I,J+2,K)+S(I-1,J+1,K) S(I,J,K)+S(I+1,J,K)+S(I,J+1,K)-2 ≦ S(I-1,J+1,K)+S(I-1,J,K)+S(I,J-1,K)+S(I+1,J-1,K) +S(I+2,J,K)+S(I,J+2,K)+S(I+1,J+1,K) S(I,J,K)+S(I,J+1,K)+S(I+1,J+1,K)-2 ≦ S(I-1,J+1,K)+S(I-1,J,K)+S(I,J-1,K)+S(I+2,J+1,K) +S(I,J+2,K)+S(I+1,J+2,K)+S(I+1,J,K) (K=1,2,....Ns) (I,J)は自由マス座標 上下界 bounds 変数型 binary S(I,J,K) (I=1,2….…Nr) (J=1,2….…Nc) (K=1,2….…Ns) 終端 end 本来、一つの星に所属するマスは繋がっている、という条件式を書くべきであるが、サボって 5、6、7のような条件で誤魔化した。その代わり解析は非常に早く、大きなサイズの問題も 一瞬で終わる。 参考 Excel VBAで問題を解く人のために、星の図形座標を読み取る部分のコードを示す。 星をExcelの図形として扱うのは面倒で、単に問題が解ければよいのであれば、境界線上の星は 「下●」「右○」「角○」などとしてセル内の入力文字として読み込む方が楽であろう。 Dim X As Single, Y As Single, Cw As Single, Rh As Single, MH As Single Dim Nmark As Integer, markI(100) As Integer, markJ(100) As Integer, markC(100) As Integer ' 星座標読み込み ActiveSheet.Range("A1").Select Rh = Selection.RowHeight Cw = Selection.ColumnWidth * 7 ActiveSheet.Shapes.SelectAll KK = Selection.Count Nmark = 0 For K = 1 To KK If Left(Selection.Item(K).Name, 13) <> "CommandButton" Then X = Selection.Item(K).Left Y = Selection.Item(K).Top MH = Selection.Item(K).Height Nmark = Nmark + 1 markI(Nmark) = (Y + MH / 2) / Rh * 2 markJ(Nmark) = (X + MH / 2) / Cw * 2 markC(Nmark) = Selection.Item(K).ShapeRange.Fill.Visible End If Next K ' ActiveSheet.Range("A1").Select 点対称マスの座標 マスのマス座標を(I,J)、星の星座標を(Is,Js)とするとき この星に関する点対称マスのマス座標(Im,Jm)は Im = Is - I + 1 Jm = Js - J + 1
© Copyright 2024 ExpyDoc