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

org.chocosolver.examples.real.SantaClaude Maven / Gradle / Ivy

/*
 * This file is part of examples, http://choco-solver.org/
 *
 * Copyright (c) 2023, 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.real;

import org.chocosolver.examples.AbstractProblem;
import org.chocosolver.solver.Model;
import org.chocosolver.solver.Solver;
import org.chocosolver.solver.search.loop.monitors.IMonitorSolution;
import org.chocosolver.solver.variables.IntVar;
import org.chocosolver.solver.variables.RealVar;

import java.util.Random;

import static java.lang.String.format;
import static java.lang.System.out;
import static org.chocosolver.solver.search.strategy.Search.domOverWDegSearch;
import static org.chocosolver.util.tools.ArrayUtils.append;

/**
 * 
* * @author Charles Prud'homme * @since 20/07/12 */ public class SantaClaude extends AbstractProblem { int n_gifts = 20; int n_kids = 10; int max_price = 25; int[] gift_price; IntVar[] kid_gift; IntVar[] kid_price; IntVar total_cost; RealVar average; @Override public void buildModel() { model = new Model(); Random rand = new Random(29091981); double precision = 1.e-6; kid_gift = model.intVarArray("g2k", n_kids, 0, n_gifts, false); kid_price = model.intVarArray("p2k", n_kids, 0, max_price, false); total_cost = model.intVar("total cost", 0, max_price * n_kids, true); average = model.realVar("average", 0, max_price * n_kids, precision); gift_price = new int[n_gifts]; for (int i = 0; i < n_gifts; i++) { gift_price[i] = rand.nextInt(max_price) + 1; } model.allDifferent(kid_gift, "BC").post(); for (int i = 0; i < n_kids; i++) { model.element(kid_price[i], gift_price, kid_gift[i], 0).post(); } model.sum(kid_price, "=", total_cost).post(); StringBuilder funBuilder = new StringBuilder("("); for (int i = 0; i < n_kids; i++) { funBuilder.append("+{").append(i).append('}'); } funBuilder.append(")/").append(n_kids).append("=").append('{').append(n_kids).append('}'); RealVar[] all_vars = append(model.realIntViewArray(kid_price, precision), new RealVar[]{average}); String function = funBuilder.toString(); model.realIbexGenericConstraint(function, all_vars).post(); } @Override public void configureSearch() { Solver r = model.getSolver(); r.setSearch(domOverWDegSearch(kid_gift)); } @Override public void solve() { model.getSolver().plugMonitor((IMonitorSolution) () -> { out.println("*******************"); for (int i = 0; i < n_kids; i++) { out.printf("Kids #%d has received the gift #%d at a cost of %d euros%n", i, kid_gift[i].getValue(), kid_price[i].getValue()); } out.printf("Total cost: %d euros%n", total_cost.getValue()); out.printf("Average: [%.3f,%.3f] euros%n", average.getLB(), average.getUB()); }); while (model.getSolver().solve()) ; } public static void main(String[] args) { new SantaClaude().execute(args); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy