python
1import numpy as np 2from gurobipy import *3 4# 与えられた数字の並び5two_length_list = [[1,5],[5,1],[3,5],[5,3]]6three_length_list = [[1,5,3],[3,1,5],[5,1,3]]7four_length_list = [[1,3,5,3],[5,3,1,5]]8 9all_list = [two_length_list, three_length_list, four_length_list]10 11# スケルトンパズルの行数と列数12rows = 513cols = 514 15# 数字の配置変数160のところには数字を配置できない(周囲を0で1行,列分埋めています)17 18vars = [[0,0,0,0,0,0,0],19 [0,1,1,0,0,1,0],20 [0,0,1,1,1,1,0],21 [0,1,0,1,0,1,0],22 [0,1,1,1,1,0,0],23 [0,1,0,0,1,1,0],24 [0,0,0,0,0,0,0]]25 26# Gurobiモデルの作成27model = Model("NumberSkelton")28 29 30for i in range(1,rows+1):31 for j in range(1,cols+1):32 vars[i][j] == model.addVar(vtype="I")33 34 # vars[i][j]にkが入っているかどうかを返す35 def x(i,j,k) -> int:36 x_i_j_k = 037 x_i_j_k = 1 if vars[i][j] == k else 038 # x_i_j_k = model.addVar(vtype="I")39 return x_i_j_k 40 41 for list in all_list:42 for l in list:43 k_times = 044 for k in [1,3,5]:45 #vars[i][j]にkが入っていれば、1。それ以外は046 y_i_j_k = model.addVar(vtype="I")47 y_i_j_k = 1 if vars[i][j] == k else 048 49 model.update()50 51 if x(i,j,k) == 1:52 k_times += 153 54 # 1マスに入る数字は1つという制約55 model.addConstr(k_times < 2)56 57 # もしvar[i][j]にl[0]が配置されているなら、その下のマスにl[1]が入る。(上→下のルール)58 model.addConstr(vars[i][j+1] == l[1] if vars[i][j+1] != 0 and vars[i][j] == l[0] else vars[i][j+1])59 60 # もしvar[i][j]にl[0]が配置されているなら、その右のマスにl[1]が入る。(右→左のルール)61 model.addConstr(vars[i+1][j] == l[1] if vars[i+1][j] != 0 and vars[i][j] == l[0] else vars[i+1][j])62 63# 目的関数(パズル問題なので適当)64model.setObjective(0, GRB.MINIMIZE)65 66model.optimize()67 68print(vars)
0 コメント