[gecode-users] Path constraint

Philippe aqwzsxaqwzsx at orange.fr
Wed Nov 25 21:53:45 CET 2015


Hi,


This mail refers to the previous post :
(http://permalink.gmane.org/gmane.comp.lib.gecode.user/4754) 
Unfortunately, I can't reply to it (when i click on "reply" 
I get a html page with the text "No such file" in it).

Here is the problem : I have a adjacency matrix in which there are cycles.
These cycles prevent the existence of a path between a start node and end
node. (This happens for instance with the code below.) Is there a way to 
solve this problem without the existence of the subpath constraint (since 
not all nodes has to be visited) ? 

I know the paper "Explaining circuit propagation" but I have neither the 
time nor (probably) the level to code the "subpath" myself. 
The problem I am facing is severe since a lot of work has already be 
done and a milestones is now rapidly coming.


Any help will be greatly appreciated,
Thanks
Philippe


class TestPath : public Gecode::Space {
 
public:

      TestPath():
        _nb_nodes(4), 
        _end(_nb_nodes),                          // end mark
      _Flow(*this, _nb_nodes * _nb_nodes, 0, 1),  // Square matrix
      _s(*this, 0, _nb_nodes),                    // Domain = [0, nb_nodes]
      _e(*this, 0, _nb_nodes)                     //
   { 
        int index_end   = (_nb_nodes - 2);
        int index_start = (_nb_nodes - 1);
        Matrix<IntVarArray> flow(_Flow, _nb_nodes, _nb_nodes);

        // Start has necessary a successor
       rel(*this, sum(flow.col(index_start)) == 1);

        // Start has no predecessor
       rel(*this, sum(flow.row(index_start)) == 0);

        // End has no successor
       rel(*this, sum(flow.col(index_end)) == 0);

        for (int i = 0 ; i < _nb_nodes ; ++i)
        {
            IntVar in = expr(*this, sum(flow.row(i)));
            IntVar out = expr(*this, sum(flow.col(i)));

            rel(*this, in <= 1);
            rel(*this, out <= 1);

              // No trivial cycle
              rel(*this, flow(i, i) == 0);

              if (i != index_end && i != index_start)
              {
                  // Flow conservation
                  IntVar in = expr(*this, sum(flow.row(i)));
                  IntVar out = expr(*this, sum(flow.col(i)));
                  rel(*this, in == out);
              }
        }
        // ------------------------------------------------------------
        // Then, some other constraints  
        // will set the flow(i,j) to 0
        // ------------------------------------------------------------

        // ------------------------------------------------------------
        // Anyway, that is not sufficent since we have cycle (or invalid 
        // path),
        // for instance
        // Start->End  Node1<->Node2
        // -------------------------------------------------------------
        // what we want is a path that goes from Start to End but not 
        // necessary passing through all nodes. Is a flow sufficent ?
        // ------------------------------------------------------------
      branch(*this, _Flow, INT_VAR_SIZE_MIN(), INT_VAL_MAX());
   }

};

 




More information about the users mailing list