2019年4月26日金曜日

数独をPython制約で解く

import sc3
for day in 全日: #列制約
 for シフト in 全シフト:
  V=[]
  for 人 in 全スタッフ:
   V.append(sc3.GetShiftVar(人,day,シフト))
  sc3.AddHard(sc3.SeqLE(1,1,V),'')
for 人 in 全スタッフ: #行制約
 for  シフト in 全シフト:
  V=[]
  for  day in 全日:
   V.append(sc3.GetShiftVar(人,day,シフト))
  sc3.AddHard(sc3.SeqLE(1,1,V),'')
for 人 in スタッフブロックトップ: #ブロック制約
 for シフト in 全シフト:
  for  day in ブロックトップ日集合:
   V=[]
   for  i  in range(3):
    for  j in range(3):
     V.append(sc3.GetShiftVar(人+i,day+j,シフト))
   sc3.AddHard(sc3.SeqLE(1,1,V),'')
  
僅か21行で数独が記述出来ています。神戸大学のCoprisには 及びませんがそれなりに簡潔に記述出来ているのではないと思います。SeqLEの書式は、(min,max,List)で、ハード制約専用です。
min==max==1なので、LeastOne&&MostOneつまり、OnlyOneということです。

0 件のコメント:

コメントを投稿