Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/GaussianBandit.cs
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/GaussianBandit.cs	(revision 12290)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/GaussianBandit.cs	(revision 12876)
@@ -12,9 +12,12 @@
     public int OptimalExpectedRewardArm { get; private set; }
     public int OptimalMaximalRewardArm { get; private set; }
-
+    public double MaxReward { get; private set; }
+    public double MinReward { get; private set; }
     private readonly Random random;
     private readonly double[] exp;
     private readonly double[] stdDev;
-    public GaussianBandit(Random random, int nArms) {
+    public GaussianBandit(Random random, int nArms, double minReward = double.NegativeInfinity, double maxReward = double.PositiveInfinity) {
+      this.MaxReward = maxReward;
+      this.MinReward = minReward;
       this.random = random;
       this.NumArms = nArms;
@@ -31,5 +34,5 @@
           OptimalExpectedRewardArm = i;
         }
-        var q = alglib.invnormaldistribution(0.99) * stdDev[i] + exp[i];
+        var q = alglib.invnormaldistribution(0.999) * stdDev[i] + exp[i];
         if (q > bestQ) {
           bestQ = q;
@@ -39,9 +42,12 @@
     }
 
-    // pulling an arm results in a truncated normally distributed reward 
-    // with mean expReward[i] and std.dev 0.1
+    // pulling an arm results in a normally distributed reward 
+    // with mean expReward[i] and std.dev 
     public double Pull(int arm) {
-      var z = Rand.RandNormal(random);
-      var x = z * stdDev[arm] + exp[arm];
+      double x;
+      do {
+        var z = Rand.RandNormal(random);
+        x = z * stdDev[arm] + exp[arm];
+      } while (x <= MinReward || x > MaxReward);
       return x;
     }
Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/HeuristicLab.Problems.Bandits.csproj
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/HeuristicLab.Problems.Bandits.csproj	(revision 12290)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/HeuristicLab.Problems.Bandits.csproj	(revision 12876)
@@ -41,4 +41,5 @@
     <Compile Include="BanditHelper.cs" />
     <Compile Include="BernoulliBandit.cs" />
+    <Compile Include="ParetoBandit.cs" />
     <Compile Include="GaussianBandit.cs" />
     <Compile Include="GaussianMixtureBandit.cs" />
Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/IBandit.cs
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/IBandit.cs	(revision 12290)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/IBandit.cs	(revision 12876)
@@ -12,5 +12,5 @@
     int OptimalMaximalRewardArm { get; } // arm which is optimal for optimization of maximal reward
 
-    double Pull(int arm); // pulling an arm returns a regret
+    double Pull(int arm); // pulling an arm returns a reward
   }
 }
Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/ParetoBandit.cs
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/ParetoBandit.cs	(revision 12876)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/ParetoBandit.cs	(revision 12876)
@@ -0,0 +1,57 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Algorithms.Bandits {
+  // for test case 1 in Extreme Bandits paper (Carpentier, NIPS 2014)
+  public class ParetoBandit : IBandit {
+    private double[] alpha;
+    private double[] pZero;
+    public int NumArms { get { return alpha.Length; } }
+    public double OptimalExpectedReward { get; private set; } // reward of the best arm, for calculating regret
+    public int OptimalExpectedRewardArm { get; private set; }
+    public int OptimalMaximalRewardArm { get; private set; }
+    public double MaxReward { get; private set; }
+    public double MinReward { get; private set; }
+    private readonly Random random;
+    public ParetoBandit(Random random, IEnumerable<double> alpha) : this(random, alpha, alpha.Select(_ => 0.0)) { }
+    public ParetoBandit(Random random, IEnumerable<double> alpha, IEnumerable<double> pZero) { // probability of a zero reward
+      this.alpha = alpha.ToArray();
+      this.pZero = pZero.ToArray();
+      this.random = random;
+
+      // find optimal arms using empirical estimates
+      var bestExpReward = double.NegativeInfinity;
+      var bestMaxReward = double.NegativeInfinity;
+      for (int k = 0; k < NumArms; k++) {
+        double expReward = 0.0;
+        double maxReward = double.NegativeInfinity;
+        for (int i = 0; i < 100000; i++) {
+          var r = Pull(k);
+          expReward += r;
+          maxReward = Math.Max(maxReward, r);
+        }
+        expReward /= 100000;
+
+        if (expReward > bestExpReward) {
+          bestExpReward = expReward;
+          OptimalExpectedRewardArm = k;
+          OptimalExpectedReward = expReward;
+        }
+        if (maxReward > bestMaxReward) {
+          bestMaxReward = maxReward;
+          OptimalMaximalRewardArm = k;
+        }
+      }
+    }
+
+    public double Pull(int arm) {
+      if (random.NextDouble() < pZero[arm]) return 0.0;
+      var u = random.NextDouble();
+      return Math.Pow(1.0 - u, (-1 / alpha[arm]));
+    }
+  }
+}
