All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.chocosolver.examples.integer.AllIntervalSeries Maven / Gradle / Ivy

/*
 * This file is part of examples, http://choco-solver.org/
 *
 * Copyright (c) 2022, IMT Atlantique. All rights reserved.
 *
 * Licensed under the BSD 4-clause license.
 *
 * See LICENSE file in the project root for full license information.
 */
package org.chocosolver.examples.integer;

import org.chocosolver.examples.AbstractProblem;
import org.chocosolver.solver.Model;
import org.chocosolver.solver.search.strategy.Search;
import org.chocosolver.solver.variables.IntVar;
import org.kohsuke.args4j.Option;

/**
 * CSPLib prob007:
* "Given n in N, find a vector s = (s_1, ..., s_n), such that *
    *
  • s is a permutation of Z_n = {0,1,...,n-1};
  • *
  • the interval vector v = (|s_2-s_1|, |s_3-s_2|, ... |s_n-s_{n-1}|) is a permutation of Z_n-{0} = {1,2,...,n-1}.
  • *
*
* A vector v satisfying these conditions is called an all-interval series of size n; * the problem of finding such a series is the all-interval series problem of size n." *
* * @author Charles Prud'homme * @since 02/08/11 */ public class AllIntervalSeries extends AbstractProblem { @SuppressWarnings("FieldMayBeFinal") @Option(name = "-o", usage = "All interval series size.", required = false) private int m = 1000; @SuppressWarnings("FieldMayBeFinal") @Option(name = "-v", usage = " use views instead of constraints.", required = false) private boolean use_views = false; IntVar[] vars; IntVar[] dist; @Override public void buildModel() { model = new Model("AllIntervalSeries"); vars = model.intVarArray("v", m, 0, m - 1, false); dist = new IntVar[m - 1]; if (!use_views) { dist = model.intVarArray("dist", m - 1, 1, m - 1, false); for (int i = 0; i < m - 1; i++) { model.distance(vars[i + 1], vars[i], "=", dist[i]).post(); } } else { for (int i = 0; i < m - 1; i++) { IntVar k = model.intVar(model.generateName(), -20000, 20000, true); model.sum(new IntVar[]{vars[i], k}, "=", vars[i + 1]).post(); dist[i] = model.intAbsView(k); model.member(dist[i], 1, m - 1).post(); } } model.allDifferent(vars, "BC").post(); model.allDifferent(dist, "BC").post(); // break symetries model.arithm(vars[1], ">", vars[0]).post(); model.arithm(dist[0], ">", dist[m - 2]).post(); } @Override public void configureSearch() { model.getSolver().setSearch(Search.minDomLBSearch(vars)); } @Override public void solve() { model.getSolver().solve(); System.out.println(String.format("All interval series(%s)", m)); StringBuilder st = new StringBuilder(); st.append("\t"); for (int i = 0; i < m - 1; i++) { st.append(String.format("%d <%d> ", vars[i].getValue(), dist[i].getValue())); if (i % 10 == 9) { st.append("\n\t"); } } st.append(String.format("%d", vars[m - 1].getValue())); System.out.println(st); } public static void main(String[] args) { new AllIntervalSeries().execute(args); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy