Index: kernel/include/IMP/optimizers/MonteCarlo.h
===================================================================
--- kernel/include/IMP/optimizers/MonteCarlo.h	(revision 533)
+++ kernel/include/IMP/optimizers/MonteCarlo.h	(working copy)
@@ -66,6 +66,18 @@
   int get_local_steps() const {
     return num_local_steps_;
   }
+  //! Set the probability of each move being made
+  /** Make this low if the space is rough and there are many particles.
+      The movers should make each individual move with this probability.
+      That is, a NormalMover with 100 particles will move each particle
+      with probability p.
+   */
+  void set_move_probability(Float p) {
+    IMP_check(p>0 && p <=1, "Not a valid probability",
+              ValueException("Not a probability"));
+    probability_=p;
+  }
+
   //! Take this many steps of the local optimizer for each MC step
   void set_local_steps(unsigned int n) {
     num_local_steps_=n;
@@ -74,15 +86,21 @@
   unsigned int get_number_of_forward_steps() const {
     return stat_forward_steps_taken_;
   }
+  //! Return how many times the optimizer has stepped to higher energy
+  unsigned int get_number_of_upward_steps() const {
+    return stat_upward_steps_taken_;
+  }
 
   void show(std::ostream &out= std::cout) const;
 private:
   Float temp_;
   Float prior_energy_;
   Float stop_energy_;
+  Float probability_;
   internal::ObjectPointer<Optimizer, true> cg_;
   unsigned int num_local_steps_;
   unsigned int stat_forward_steps_taken_;
+  unsigned int stat_upward_steps_taken_;
   unsigned int stat_num_failures_;
 };
 
Index: kernel/src/optimizers/MonteCarlo.cpp
===================================================================
--- kernel/src/optimizers/MonteCarlo.cpp	(revision 533)
+++ kernel/src/optimizers/MonteCarlo.cpp	(working copy)
@@ -26,8 +26,10 @@
 MonteCarlo::MonteCarlo(): temp_(1), 
                           prior_energy_(std::numeric_limits<Float>::max()),
                           stop_energy_(-std::numeric_limits<Float>::max()),
+                          probability_(1),
                           num_local_steps_(50),
                           stat_forward_steps_taken_(0),
+                          stat_upward_steps_taken_(0),
                           stat_num_failures_(0){}
 
 MonteCarlo::~MonteCarlo()
@@ -53,7 +55,7 @@
     for (MoverIterator it = movers_begin(); it != movers_end(); ++it) {
       IMP_LOG(VERBOSE, "MC Trying move " << **it << std::endl);
       IMP_CHECK_OBJECT(*it);
-      (*it)->propose_move(.5);
+      (*it)->propose_move(probability_);
     }
     Float next_energy;
     if (cg_.get() != NULL && num_local_steps_!= 0) {
@@ -75,6 +77,7 @@
               << std::endl);
       if (e > r) {
         accept=true;
+        ++stat_upward_steps_taken_;
       }
     }
     IMP_LOG(VERBOSE,  "MC Prior energy is " << prior_energy_
Index: kernel/src/optimizers/movers/NormalMover.cpp
===================================================================
--- kernel/src/optimizers/movers/NormalMover.cpp	(revision 533)
+++ kernel/src/optimizers/movers/NormalMover.cpp	(working copy)
@@ -24,14 +24,16 @@
   set_sigma(max);
 }
 
-void NormalMover::generate_move(float scale)
+void NormalMover::generate_move(float probability)
 {
+  boost::uniform_real<> rand(0,1);
   boost::normal_distribution<double> mrng(0, stddev_);
   boost::variate_generator<RandomNumberGenerator&,
                            boost::normal_distribution<double> >
                           sampler(random_number_generator, mrng);
 
   for (unsigned int i = 0; i < number_of_particles(); ++i) {
+    if (rand(random_number_generator) > probability) continue; 
     for (unsigned int j = 0; j < number_of_float_keys(); ++j) {
       float c = get_float(i, j);
       float r = sampler();