ぬりめいず - 鉛筆パズルの整数計画法による解法定式化集

鉛筆パズルの整数計画法による解法定式化集 78.
ぬりめいず
http://www.nikoli.co.jp/ja/puzzles/nurimeizu.html
例題 (ニコリのパズル紹介より)
解答
S
G
S
G
○
△
○
△
△
△
ルール
①盤面のいくつかのマスを黒くぬって壁を作り、白マスをたどると
SからGまで通ることができる迷路を作る。
②盤太線で区切られたそれぞれの部屋にあるマスは、すべて黒マスになるか、
すべて白マスになるかのどちらかとする。
③すべての白マスはタテヨコにひとつながりになるが、白マスで輪っかができてはいけない。
④SG○△があるマスはすべて白マスになる。すべての○は、SからGまでの
最短経路上にあるようにし、すべての△は、最短経路から外れるようにする。
⑤白マスも黒マスも、2×2以上のカタマリになってはいけない。
マスの行番号をI、列番号をJとし、部屋に番号を振り、マス座標との対応を取った表を用意する。
J →
1
2
3
. . . Nc
I 1
↓
1
2
3
4
2
1
2
5
6
3
7
5
5
8
7
9
9
8
.
.
.
Nr
変数
B(I,J) = 1
= 0
マス(I,J)を黒く塗るとき
〃 塗らないとき
W(I,J) = 1
= 0
マス(I,J)を黒く塗らないとき
〃 塗るとき
TB(K) =
=
TW(K) =
=
部屋(K)を黒く塗るとき
〃 塗らないとき
1
0
1
0
部屋(K)を黒く塗らないとき
〃 塗るとき
C(I,J) = 1
= 0
マス(I,J)がSからGへの最短経路のとき
〃 でないとき
R(I,J) =
=
L(I,J) =
=
白マス(I,J)に右向き矢印が付くとき
〃 付かないとき
1
0
1
0
白マス(I,J)に左向き矢印が付くとき
〃 付かないとき
U(I,J) = 1
= 0
白マス(I,J)に上向き矢印が付くとき
〃 付かないとき
白マス(I,J)に下向き矢印が付くとき
〃 付かないとき
D(I,J) = 1
= 0
bR(I,J) =
=
bL(I,J) =
=
黒マス(I,J)に右向き矢印が付くとき
〃 付かないとき
1
0
1
0
黒マス(I,J)に左向き矢印が付くとき
〃 付かないとき
bU(I,J) = 1
= 0
黒マス(I,J)に上向き矢印が付くとき
〃 付かないとき
黒マス(I,J)に下向き矢印が付くとき
〃 付かないとき
bD(I,J) = 1
= 0
bRD(I,J) =
=
bLD(I,J) =
=
1
0
1
0
bRU(I,J) = 1
= 0
bLU(I,J) = 1
= 0
黒マス(I,J)に右下向き矢印が付くとき
〃 付かないとき
黒マス(I,J)に左下向き矢印が付くとき
〃 付かないとき
黒マス(I,J)に右上向き矢印が付くとき
〃 付かないとき
黒マス(I,J)に左上向き矢印が付くとき
〃 付かないとき
目的関数
minimize
x
(ダミー)
制約式
subject to
1.マスは白または黒である
B(I,J)+W(I,J) = 1
(I=1,2,....Nr)
(J=1,2,....Nc)
2.記号入りマスは白マスである
W(I,J) = 1
(I,J)は盤中の記号マス
3.部屋は白または黒である
TB(K)+TW(K) = 1
(K=1,2,....Nt)
Ntは部屋総数
4.部屋Kが黒のときの黒マスB(I,J)
(K=1,2,....Nt)
(I,J)は部屋とマス座標との対応表から
TB(K) ≦ B(I,J)
5.部屋Kが白のときの白マスW(I,J)
(K=1,2,....Nt)
(I,J)は部屋とマス座標との対応表から
TW(K) ≦ W(I,J)
6.白マスは2x2の塊にならない
W(I,J)+W(I+1,J)+W(I+1,J+1)+W(I,J+1)≦ 3
(I=1,2,....Nr-1)
(J=1,2,....Nc-1)
7.黒マスは2x2の塊にならない
B(I,J)+B(I+1,J)+B(I+1,J+1)+B(I,J+1)≦ 3
(I=1,2,....Nr-1)
(J=1,2,....Nc-1)
8.白マスには隣接白マスがある
W(I,J)≦ W(I-1,J)+W(I+1,J)+W(I,J-1)+W(I,J+1)
(I=1,2,....Nr)
(J=1,2,....Nc)
9.白マスに矢印を付ける
W(I,J)≦ U(I,J)+D(I,J)+L(I,J)+R(I,J)
(I=1,2,....Nr)
(J=1,2,....Nc)
但し、Gマスを除く
10.黒マスには矢印がない
B(I,J)+U(I,J)+D(I,J)+L(I,J)+R(I,J)≦ 1
(I=1,2,....Nr)
(J=1,2,....Nc)
11.枠から外に向く矢印はない
(J=1,2,....Nc)
U(1,J) = 0
D(Nr,J) = 0
L(I,1) = 0
R(I,Nc) = 0
(I=1,2,....Nr)
12.矢印は黒マスに向かない
B(I,J)+D(I-1,J)≦
B(I,J)+U(I+1,J)≦
B(I,J)+R(I,J-1)≦
B(I,J)+L(I,J+1)≦
1
1
1
1
13.矢印の対向禁止
R(I,J)+L(I,J+1)≦ 1
D(I,J)+U(I+1,J)≦ 1
(I=1,2,....Nr)
(J=1,2,....Nc)
(I=1,2,....Nr)
(J=1,2,....Nc-1)
(I=1,2,....Nr-1)
(J=1,2,....Nc)
14.S(スタート)マスのC(I,J)=1(最短経路に所属するマス)と置く
C(I,J)= 1
(I,J)はSマスの座標
15.○マスのC(I,J)=1とする
C(I,J)= 1
(I,J)は○マスの座標
16.△マスのC(I,J)=0とする
C(I,J)= 0
(I,J)は△マスの座標
17.Sマスに入る矢印の付いたマスはC(I,J)=0とする
C(I-1,J)+D(I-1,J)≦
C(I+1,J)+U(I+1,J)≦
C(I,J-1)+R(I,J-1)≦
C(I,J+1)+L(I,J+1)≦
(I,J)はSマスの座標
1
1
1
1
18.流入する矢印のないマスはC(I,J)=0とする
C(I,J)≦ U(I+1,J)+D(I-1,J)+L(I,J+1)+R(I,J-1)
(I=1,2,....Nr)
(J=1,2,....Nc)
19.C(I,J)=1のマスの矢印方向マスもC(II,JJ)=1とする
C(I,J)+U(I,J)-C(I-1,J)≦
C(I,J)+D(I,J)-C(I+1,J)≦
C(I,J)+L(I,J)-C(I,J-1)≦
C(I,J)+R(I,J)-C(I,J+1)≦
1
1
1
1
(I=1,2,....Nr)
(J=1,2,....Nc)
20.C(I,J)=1のマスのT字配置禁止(分岐があってはならない)
C(I,J)+C(I,J+1)+C(I,J+2)+C(I+1,J+1)≦
C(I,J)+C(I,J+1)+C(I,J+2)+C(I-1,J+1)≦
C(I,J)+C(I+1,J)+C(I+2,J)+C(I+1,J+1)≦
C(I,J)+C(I+1,J)+C(I+2,J)+C(I+1,J-1)≦
3
3
3
3
(I=1,2,....Nr)
(J=1,2,....Nc)
C(I-1,J)+C(I+1,J)+C(I,J-1)+C(I,J+1)= 1
(I,J)はGマスの座標
21.Gマスに接するC(I,J)=1のマスは1個だけ
以下は、白マスが輪っかにならない、全体がタテヨコひとつながりになるように
黒マスに矢印を付けて制御する条件である。このためには、黒マスがタテヨコ斜めに
接して外枠に繋がっていればよい。
22.黒マスに矢印を1個付ける(タテ・ヨコ・ナナメ、8本の内のどれか)
B(I,J)= bU(I,J)+bD(I,J)+bL(I,J)+bR(I,J)
bLU(I,J)+bLD(I,J)+bRU(I,J)+bRD(I,J)
(I=1,2,....Nr)
(J=1,2,....Nc)
23.白マスに黒矢印は付かない
bigM*{1-W(I,J)}≧ bU(I,J)+bD(I,J)+bL(I,J)+bR(I,J)
bLU(I,J)+bLD(I,J)+bRU(I,J)+bRD(I,J)
(I=1,2,....Nr)
(J=1,2,....Nc)
24.周辺枠付き黒マスには外向き黒矢印を付ける
B(1,J)≦ bU(1,J)
B(Nr,J)≦ bU(Nr,J)
B(I,1)≦ bL(I,1)
B(I,Nc)≦ bL(I,Nc)
(J=1,2,....Nc)
(I=2,3,....Nr-1)
盤の4隅マスが矢印2本にならないよう注意
25.黒矢印は白マスに向かない
W(I,J)+bD(I-1,J)≦ 1
W(I,J)+bLD(I-1,J+1)≦
W(I,J)+bLD(I-1,J-1)≦
W(I,J)+bU(I+1,J)≦ 1
W(I,J)+bLU(I+1,J+1)≦
W(I,J)+bRU(I+1,J-1)≦
W(I,J)+bR(I,J-1)≦ 1
W(I,J)+bL(I,J+1)≦ 1
(I=1,2,....Nr)
(J=1,2,....Nc)
1
1
1
1
26.黒矢印の隣マスとの対向禁止
bR(I,J)+bL(I,J+1)≦ 1
bRU(I,J)+bLD(I-1,J+1)≦
bRD(I,J)+bLU(I+1,J+1)≦
bD(I,J)+bU(I+1,J)≦ 1
bLD(I,J)+bRU(I+1,J-1)≦
bRD(I,J)+bLU(I+1,J+1)≦
(I=1,2,....Nr)
(J=1,2,....Nc)
1
1
1
1
27.黒矢印は辺隣接を優先し、タテヨコ矢印があればナナメ矢印は付けない
B(I,J+1)+bRU(I,J)+bRD(I,J)≦
B(I,J-1)+bLU(I,J)+bLD(I,J)≦
B(I+1,J)+bLD(I,J)+bRD(I,J)≦
B(I-1,J)+bLU(I,J)+bRU(I,J)≦
1
1
1
1
(I=1,2,....Nr)
(J=1,2,....Nc)
上下界
bounds
変数型
binary
B(I,J) W(I,J) C(I,J)
(I=1,2….…Nr)
(J=1,2….…Nc)
TB(K) TW(K)
(K=1,2….…Nt)
L(I,J) D(I,J) R(I,J) U(I,J)
bL(I,J) bD(I,J) bR(I,J) bU(I,J)
bLD(I,J) bRD(I,J) bRU(I,J) bLU(I,J)
(I=1,2….…Nr)
(J=1,2….…Nc)
general
終端
end
参考に、黒マスと白マスそれぞれに付加した矢印の出力例を示す。
http://puzzleblog542.blog.fc2.com/blog-category-69.html
トクナキラのパズル製造工場 ぬりめいず 18×10 おてごろ から
1)黒マス矢印
S
G
○
△
△
△
△
△
△
白マスは全体がタテヨコに繋がっていなければならないが、「輪っかになってはいけない」
というのは有難いルールである。黒マスを繋いだ矢印が盤の外枠から抜け出していればよい
からである。
2)白マス矢印
S
G
○
△
△
△
△
△
△
白マスに1個矢印を付ける(Gマスは例外)。矢印は黒マスには向かない。隣マスとの対向矢印は
ない。とすると、Gマスに流れ込む矢印群が描ける。矢印はマスに1個であるから、合流はあるが
分流はない。ここでSマスから出発して、矢印を辿って行けば、この壁配置のときの最短経路に
なるが、矢印を辿るという簡単なことがなかなか難しい。最短経路のマスをC(I,J)=1とするのは
やさしいが、最短経路でないマスをC(I,J)=0とするのが難しいのである。
なお、最短経路であるから、いつも遊んでいる
minimize
命令を生かして
Nr Nc
Σ
Σ C(I,J)=x
I=1 J=1
として
minimize
x
が必要かと思ったが、必要なさそうである。