this repo has no description
at develop 3.7 kB view raw
1/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 2/* 3 * Main authors: 4 * Vincent Barichard <Vincent.Barichard@univ-angers.fr> 5 * 6 * Copyright: 7 * Vincent Barichard, 2012 8 * 9 * This file is part of Gecode, the generic constraint 10 * development environment: 11 * http://www.gecode.org 12 * 13 * Permission is hereby granted, free of charge, to any person obtaining 14 * a copy of this software and associated documentation files (the 15 * "Software"), to deal in the Software without restriction, including 16 * without limitation the rights to use, copy, modify, merge, publish, 17 * distribute, sublicense, and/or sell copies of the Software, and to 18 * permit persons to whom the Software is furnished to do so, subject to 19 * the following conditions: 20 * 21 * The above copyright notice and this permission notice shall be 22 * included in all copies or substantial portions of the Software. 23 * 24 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 25 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 26 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 27 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 28 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 29 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 30 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 31 * 32 */ 33 34#include <gecode/driver.hh> 35 36#include <gecode/minimodel.hh> 37#include <gecode/float.hh> 38 39using namespace Gecode; 40 41/** 42 * \brief %Example: Folium of Descartes 43 * 44 * The folium of Descartes is a curve defined by the equation: 45 * \f[ 46 * x^3 + y^3 - 3axy = 0 47 * \f] 48 * 49 * A technique to solve it, is to write \f$y=px\f$ and solve for 50 * \f$x\f$ and \f$y\f$ in terms of \f$p\f$. By setting 51 * \f$a=1\f$, it yields to the paramatric equation: 52 * 53 * \f[ 54 * x^3 + y^3 - 3xy = 0 55 * \f] 56 * \f[ 57 * x=\frac{3p}{1+p^3},\quad y=\frac{3p^2}{1+p^3} 58 * \f] 59 * 60 * The parameter \f$p\f$ is related to the position on the curve 61 * and is constrained to get different solutions for \f$x\f$ and 62 * \f$y\f$. To get reasonable interval starting sizes, \f$p\f$ 63 * and \f$y\f$ are restricted to \f$[-20;20]\f$ and \f$x\f$ is 64 * restricted to \f$[-1;2]\f$. 65 * 66 * \ingroup Example 67 */ 68class DescartesFolium : public FloatMaximizeScript { 69protected: 70 /// The numbers 71 FloatVarArray f; 72 /// Minimum distance between two solutions 73 double step; 74public: 75 /// Actual model 76 DescartesFolium(const Options& opt) 77 : FloatMaximizeScript(opt), f(*this,3,-20,20) { 78 79 if (opt.trace() != 0) 80 trace(*this, f, opt.trace()); 81 82 // Post equation 83 FloatVar p = f[0]; 84 FloatVar x = f[1]; 85 FloatVar y = f[2]; 86 rel(*this, 3*p/(1+pow(p,3)) == x); 87 rel(*this, 3*sqr(p)/(1+pow(p,3)) == y); 88 rel(*this, pow(x,3) + pow(y,3) == 3 * x * y); 89 rel(*this, x == FloatVal(-1,2)); 90 91 branch(*this,p,FLOAT_VAL_SPLIT_MIN()); 92 } 93 /// Constructor for cloning \a p 94 DescartesFolium(DescartesFolium& p) 95 : FloatMaximizeScript(p) { 96 f.update(*this, p.f); 97 } 98 /// Copy during cloning 99 virtual Space* copy(void) { 100 return new DescartesFolium(*this); 101 } 102 /// Cost function 103 virtual FloatVar cost(void) const { 104 return f[0]; 105 } 106 /// Print solution coordinates 107 virtual void print(std::ostream& os) const { 108 os << "XY " << f[1].med() << " " << f[2].med() 109 << std::endl; 110 } 111 112}; 113 114/** \brief Main-function 115 * \relates DescartesFolium 116 */ 117int main(int argc, char* argv[]) { 118 Options opt("DescartesFolium"); 119 opt.solutions(0); 120 opt.step(0.1); 121 opt.parse(argc,argv); 122 FloatMaximizeScript::run<DescartesFolium,BAB,Options>(opt); 123 return 0; 124} 125 126// STATISTICS: example-any