直曲ループ

鉛筆パズルの整数計画法による解法定式化集 90.
直曲ループ
解答
例題 (2015.6.30毎日新聞 より)
直
曲
直
直
曲
直
曲
曲
直
直
曲
曲
曲
直
直
曲
曲
直
曲
直
曲
曲
ルール
黒い点と「直」「曲」が書かれた白い丸をタテかヨコに結び、枝別れのない大きな一つのループを作る。
①「直」の丸では線は直進し、「曲」の丸では線は90度曲がる。
②白い丸はすべて通る。黒い点は通らずに余るものがあってもよい。
③同じところを2度以上通ることはできない。
「ましゅ」を簡略化したようなパズルである。
Excel用に黒い点は廃止し、マスに矢印を付けて並べ、マスの中心を通る線を描かせることにする。
解答
S
C
C= 曲
S= 直
S
C
S
S
C
C
C
C
S
変数
曲 直
マスの行番号をI、列番号をJとして、 符号にも番号を付けておく。
U(I,J) =1
=0
D(I,J) =1
=0
L(I,J) =1
=0
R(I,J) =1
=0
N(I,J) =K
(I,J)の矢印が上に向いているとき
〃 いないとき
J →
1 2
(I,J)の矢印が下に向いているとき
〃 いないとき
(I,J)の矢印が左に向いているとき
〃 いないとき
(I,J)の矢印が右に向いているとき
〃 いないとき
(I,J)の矢印K番目とき
I 1
↓ 2
C
3
.
.
.
S
Nr
K=2
K=1
3
K=3
4
S S
. . .
Nc
目的関数
minimize
x
(ダミー)
制約式
subject to
1.マスには矢印が付く
L(I,J)+R(I,J)+U(I,J)+D(I,J) ≦ 1
記号マスのとき
L(I,J)+R(I,J)+U(I,J)+D(I,J) = 1
(I=1,2,....Nr)
(J=1,2,....Nc)
2.マスに入る矢印は1個以下である
L(I,J+1)+R(I,J-1)+U(I+1,J)+D(I-1,J) ≦ 1
(I=1,2,....Nr)
(J=1,2,....Nc)
3.矢印の先に矢印の根元が付く
L(I,J) ≦ L(I,J-1)+U(I,J-1)+D(I,J-1)
R(I,J) ≦ R(I,J+1)+U(I,J+1)+D(I,J+1)
U(I,J) ≦ U(I-1,J)+L(I-1,J)+R(I-1,J)
D(I,J) ≦ D(I+1,J)+U(I+1,J)+D(I+1,J)
(I=1,2,....Nr)
(J=1,2,....Nc)
4.外枠から外に向かう矢印はない
L(I,1) = 0
R(I,Nc) = 0
U(1,J) = 0
D(Nr,J) = 0
(I=1,2,....Nr)
(J=1,2,....Nc)
5.曲 でまがる
記号マスKの座標を(I,J)として
L(I,J+1)
R(I,J-1)
U(I+1,J)
D(I-1,J)
≦
≦
≦
≦
U(I,J)+D(I,J)
U(I,J)+D(I,J)
L(I,J)+R(I,J)
L(I,J)+R(I,J)
(K=1,2,....Nm)
Nmは記号の総数
≦
≦
≦
≦
L(I,J)
R(I,J)
U(I,J)
D(I,J)
(K=1,2,....Nm)
6.直 で直進
L(I,J+1)
R(I,J-1)
U(I+1,J)
D(I-1,J)
7.矢印に番号を振る
1番目の記号マスを集水マス(I0,J0)とし、1番を振る。
N(I0,J0) = 1
その他 R(I,J-1) = 1 のとき N(I,J)+1 ≦ N(I,J-1)
すなわち矢印は根本側に繋がる矢印が大きくなるように付番する。
ビッグMを使って
N(I,J)+1 ≦ N(I,J-1)+bigM*{1-bR(I,J-1)} (I=1,2,....Nr)
(J=1,2,....Nc)
同様に
bigM=Nr*Nc とする
N(I,J)+1 ≦ N(I,J+1)+bigM*{1-bL(I,J+1)}
N(I,J)+1 ≦ N(I-1,J)+bigM*{1-bD(I-1,J)}
N(I,J)+1 ≦ N(I+1,J)+bigM*{1-bU(I+1,J)}
上下界
bounds
N(I,J)≦ bigM
変数型
binary
L(I,J) R(I,J)
U(I,J) D(I,J)
general
N(I,J)
終端
end
(I=1,2….…Nr)
(J=1,2….…Nc)
(I=1,2….…Nr)
(J=1,2….…Nc)