スラローム

スラローム
http://www.nikoli.co.jp/ja/puzzles/suraromu.htmlより
解答
例題(パズル紹介)
2
2
4
2
2
4
4
4
⑤
⑤
ルール
下記条件で、○のマスからスタートして白マスを通過して、このマスに戻るループを描く。
①線は交差したり、枝分かれしてはいけない。
②破線を「旗門」と呼び、線は全ての旗門と1回ずつ垂直に交差する。
③両端が同じ数字で挟まれている旗門と、数字のマスから1つだけ出ている旗門で、端の数字は
○のマスから出た線がその旗門と何番目に交差するかを表わす。上記以外の旗門では、
順番は問わない。
④ルールと関係ないが、○の中の数字は旗門の総数を表わす。タテまたはヨコに連続して並んだ
破線は全体で1旗門である。
この説明分かり難い。旗門通過順序の数字はこの例題のように
単純ではないので要注意。
J →
1 2
I 1
↓ 2
変数
マスの行番号をI、列番号をJとして
B(I,J) = 1
= 0
W(I,J) = 1
= 0
L(I,J) =1
=0
D(I,J) =1
=0
R(I,J) =1
=0
U(I,J) =1
=0
2
3
4
. . .
①
黒マスでいとき
旗門には番号を
振っておく
Nr
マス(I,J)が白マスのとき
〃 白マスでないとき
白マス(I,J)が左向き矢印を持つ(次に左マスに進む)とき
〃 持たないとき
白マス(I,J)が下向き矢印を持つとき
〃 持たないとき
白マス(I,J)が右向き矢印を持つとき
〃 持たないとき
白マス(I,J)が上向き矢印を持つとき
〃 持たないとき
②
3
.
.
.
マス(I,J)が黒マスのとき
〃 2
Nc
C(I,J,K) = 1
白マス(I,J)が旗門をK個通過後のとき
= 0
N(I,J)
〃 でないとき
マス通過進行方向矢印に通過順に付けた番号
目的関数
minimize
x
(ダミー)
制約式
subject to
1.マスは白または黒に塗られるから、
B(I,J)+W(I,J)
=
1
(I=1,2….…Nr)
(J= 1,2.…… Nc )
2.与えられた黒マス
B(I,J)
=
1
3.マスに付く矢印はどれかの方向1種だから
L(I,J)+D(I,J)+R(I,J)+U(I,J)
(I=1,2….…Nr)
(J= 1,2.…… Nc )
≦
1
≦
1-B(I,J)
4.黒マスには矢印が付かない
L(I,J)+D(I,J)+R(I,J)+U(I,J)
(I,Jは盤面の黒マス)
5.矢印は黒マス方向へは向かない、盤面から外へは向かない
L(I,J)+B(I,J-1) ≦ 1
D(I,J)+B(I+1,J) ≦ 1
R(I,J)+B(I,J+1) ≦ 1
U(I,J)+B(I-1,J) ≦ 1
L(I,1) = 0
D(Nr,J) = 0
R(I,Nc) = 0
U(1,J) = 0
(I=1,2….…Nr)
(J= 1,2.…… Nc )
6.スタートマスの旗門通過番号=0、矢印番号=0とする
C(Is,Js,0) = 1
N(Is,Js) = 0
(Is,Jsは盤面○のある座標)
7.矢印は旗門を通過する
縦旗門
Σ{D(Ik,Jk)+U(Ik,Jk)} ≧ 1
横旗門
Σ{L(Ik,Jk)+R(Ik,Jk)} ≧ 1
(Ik,Jkは旗門マスの座標)
Σは旗門マスが連続するときの和
8.旗門と平行な矢印はない
縦旗門
U(Ik,Jk)+D(Ik,Jk) = 0
横旗門
L(Ik,Jk)+R(Ik,Jk) = 0
(Ik,Jkは旗門マス座標)
9.矢印の先には矢印の根元が繋がる
(I=1,2….…Nr)
(J= 1,2.…… Nc )
R(1,J)+U(1,J)+D(1,J) ≧ R(I,J-1)
L(1,J)+U(1,J)+D(1,J) ≧ L(I,J+1)
U(1,J)+L(1,J)+R(1,J) ≧ U(I+1,J)
D(1,J)+L(1,J)+R(1,J) ≧ D(I-1,J)
10.隣マスとの矢印往復禁止
U(1,J)+D(1-1,J)
≦
1
D(1,J)+U(1+1,J)
≦
1
(I=1,2….…Nr)
(J= 1,2.…… Nc )
L(1,J)+R(1,J-1) ≦ 1
R(1,J)+L(1,J+1) ≦ 1
11.マスに流入する矢印は1本
U(1+1,J)+D(1-1,J)+R(1,J+1)+L(1,J-1)
≦
(I=1,2….…Nr)
(J= 1,2.…… Nc )
1
12.マスには旗門通過順番号が付く
旗門通過順番号
Nk
C (I,J,K)≧
Σ
K=0
2
2 2
U(1,J)+L(1,J)+R(1,J)+D(I,J)
Nk
C (I,J,K)≦
Σ
K=0
U(1,J)+L(1,J)+R(1,J)+D(I,J)
(I=1,2….…Nr)
(J= 1,2.…… Nc )
Nkは総旗門数
2
(I=1,2….…Nr)
(J= 1,2.…… Nc )
(K= 0,1.…… N k )
14.旗門マスでは旗門通過順番号は1増える
C(I-1,J,K)-C(I,J,K+1) ≦ 1-D(I-1,J)
C(I+1,J,K)-C(I,J,K+1) ≦ 1-U(I+1,J)
C(I,J+1,K)-C(I,J,K+1) ≦ 1-L(I,J+1)
C(I,J-1,K)-C(I,J,K+1) ≦ 1-R(I,J-1)
2
2
3
1 1 3 3 3 3
1 4 4 4
4 4 4 4
1 1
1
4
⑤
0 5
0 0 0 0 5 5 4
13.旗門マス以外では旗門通過順番号は不変
C(I,J,K)-C(I-1,J,K) ≦ 1-D(I-1,J)
C(I,J,K)-C(I+1,J,K) ≦ 1-U(I+1,J)
C(I,J,K)-C(I,J+1,K) ≦ 1-L(I,J+1)
C(I,J,K)-C(I,J-1,K) ≦ 1-R(I,J-1)
2 2
(I,Jは旗門マス座標)
(K= 0,1.…… N k )
15.通過順番号指定旗門
Σ C(Ik,Jk,K) = 1
16.矢印番号
(Ik,Jkは旗門マスの座標)
Σは連続する旗門マスについての和
Kは盤面指定値
N(I,J)をセット。隣から矢印が入ればマス矢印番号は1増える
N(I,J) ≧ N(I,J-1)+1
N(I,J) ≦ N(I,J-1)+1
}が
R(I,J-1)=1 のときに限り成り立つから
Mをbig_M(=Nr*Nc=マスの総数)として
N(I,J)+M*{1-R(I,J-1)}≧ N(I,J-1)+1
N(I,J) ≦ M*{1-R(I,J-1)}+N(I,J-1)+1
(I=1,2….…Nr)
(J= 1,2.…… Nc )
N(I,J)+M*{1-L(I,J+1)}≧ N(I,J+1)+1
N(I,J) ≦ M*{1-L(I,J+1)}+N(I,J+1)+1
N(I,J)+M*{1-U(I+1,J)}≧ N(I+1,J)+1
N(I,J) ≦ M*{1-U(I+1,J)}+N(I+1,J)+1
N(I,J)+M*{1-D(I-1,J)}≧ N(I-1,J)+1
N(I,J) ≦ M*{1-D(I-1,J)}+N(I-1,J)+1
17.矢印番号はM−1以下(矢印なしのマスの番号が不定で出力が汚くなるのを防ぐ)
N(I,J)
≦
M-1
(I=1,2….…Nr)
(J= 1,2.…… Nc )
上下界
bounds
変数型
binary
B(I,J)
L(I,J)
W(I,J)
D(I,J)
C(I,J,K)
R(I,J)
U(I,J)
(I=1,2….…Nr)
(J=1,2….…Nc)
(I=1,2….…Nr)
(J=1,2….…Nc)
(K=0,1….…Nk)
general
N(I,J)
(I=1,2….…Nr)
(J=1,2….…Nc)
終端
end
巡回セールスマン式の順番付けをしているため大きなサイズの問題では、整数計画法が動かなくなる。
ただ、パイプリンクに比べると、順番付けするマスの数が半分くらいなので、10x10マス程度まで
解くことができる。