Download
# All-Interval Series
#
# Arrange the numbers 1 to n in a vector s, such that the
# interval vector v=(|s2-s1|,|s3-s2|,...,|sn-sn-1|) is a
# permutation of {1,2,...,n-1}.
#
# CSPLib Problem 007 - http://www.csplib.org/Problems/prob007/
from Numberjack import *
def get_model(N):
series = VarArray(N, 0, N - 1)
model = Model(
AllDiff(series),
AllDiff([Abs(series[i] - series[i - 1]) for i in range(1, N)]))
return series, model
def solve(param):
N = param['N']
series, model = get_model(N)
solver = model.load(param['solver'])
solver.setVerbosity(param['verbose'])
solver.solve()
if solver.is_sat():
print "Solution:", str(series)
print "Absolute differences:",
print [abs(series[i].get_value() - series[i - 1].get_value())
for i in range(1, N)]
elif solver.is_unsat():
print "Unsatisfiable"
else:
print "Timed out"
if __name__ == '__main__':
default = {'N': 12, 'solver': 'MiniSat', 'verbose': 1}
param = input(default)
solve(param)