Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/Bandit.cs
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/Bandit.cs	(revision 12893)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/Bandit.cs	(revision 12893)
@@ -0,0 +1,29 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace HeuristicLab.Algorithms.Bandits {
+  public class Bandit : IBandit {
+    public int NumArms { get { return distributions.Length; } }
+    public int OptimalExpectedRewardArm { get; private set; }
+    public int OptimalMaximalRewardArm { get; private set; }
+
+    private readonly IModel[] distributions;
+    private readonly Random random;
+    public Bandit(Random random, IEnumerable<IModel> distributions, int bestExpRewardArm, int bestMaxRewardArm) {
+      this.random = random;
+      this.distributions = distributions.ToArray();
+
+      OptimalExpectedRewardArm = bestExpRewardArm;
+      OptimalMaximalRewardArm = bestMaxRewardArm;
+    }
+
+    // pulling an arm results in a bernoulli distributed reward 
+    // with mean expReward[i]
+    public double Pull(int arm) {
+      return distributions[arm].Sample(random);
+    }
+  }
+}
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 12876)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/HeuristicLab.Problems.Bandits.csproj	(revision 12893)
@@ -29,4 +29,5 @@
     <ErrorReport>prompt</ErrorReport>
     <WarningLevel>4</WarningLevel>
+    <UseVSHostingProcess>true</UseVSHostingProcess>
   </PropertyGroup>
   <ItemGroup>
@@ -41,4 +42,6 @@
     <Compile Include="BanditHelper.cs" />
     <Compile Include="BernoulliBandit.cs" />
+    <Compile Include="Bandit.cs" />
+    <Compile Include="MixtureBandit.cs" />
     <Compile Include="ParetoBandit.cs" />
     <Compile Include="GaussianBandit.cs" />
@@ -53,4 +56,8 @@
       <Name>HeuristicLab.Common</Name>
     </ProjectReference>
+    <ProjectReference Include="..\HeuristicLab.Distributions\HeuristicLab.Distributions.csproj">
+      <Project>{31171165-e16f-4a1a-a8ab-25c6ab3a71b9}</Project>
+      <Name>HeuristicLab.Distributions</Name>
+    </ProjectReference>
   </ItemGroup>
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/IBandit.cs
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/IBandit.cs	(revision 12876)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/IBandit.cs	(revision 12893)
@@ -8,5 +8,4 @@
   public interface IBandit {
     int NumArms { get; }
-    double OptimalExpectedReward { get; } // expected reward of the best arm, for calculating regret
     int OptimalExpectedRewardArm { get; } // arm which is optimal for optimization of expected reward
     int OptimalMaximalRewardArm { get; } // arm which is optimal for optimization of maximal reward
Index: branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/MixtureBandit.cs
===================================================================
--- branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/MixtureBandit.cs	(revision 12893)
+++ branches/HeuristicLab.Problems.GrammaticalOptimization-gkr/HeuristicLab.Problems.Bandits/MixtureBandit.cs	(revision 12893)
@@ -0,0 +1,45 @@
+﻿using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using HeuristicLab.Common;
+
+namespace HeuristicLab.Algorithms.Bandits {
+  // custom testcase for extreme hunter policy
+  public class MixtureBandit : IBandit {
+    private double[] mu;
+    private double[] sigma;
+    private double[] pZero;
+    public int NumArms { get { return mu.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 MixtureBandit(Random random, IEnumerable<double> mu) : this(random, mu, mu.Select(_ => 1.0), mu.Select(_ => 0.0), double.PositiveInfinity) { }
+    public MixtureBandit(Random random, IEnumerable<double> mu, IEnumerable<double> sigma, IEnumerable<double> pZero, double maxReward) { // probability of a zero reward
+      this.mu = mu.ToArray();
+      this.sigma = sigma.ToArray();
+      this.pZero = pZero.ToArray();
+      this.MaxReward = maxReward;
+      this.random = random;
+
+      double optimalExpectedReward;
+      int bestArmForMaxReward, bestArmForExpReward;
+
+      BanditHelper.SampleArms(random, this, 100000, out optimalExpectedReward, out bestArmForExpReward, out bestArmForMaxReward);
+      OptimalExpectedReward = optimalExpectedReward;
+      OptimalExpectedRewardArm = bestArmForExpReward;
+      OptimalMaximalRewardArm = bestArmForMaxReward;
+    }
+
+    public double Pull(int arm) {
+      if (random.NextDouble() < pZero[arm]) return 0.0;
+      var z = Rand.RandNormal(random);
+      var x = z * sigma[arm] + mu[arm];
+      return Math.Max(0, Math.Min(MaxReward, x));
+    }
+  }
+}
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 12893)
@@ -12,39 +12,21 @@
     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
+
+    public ParetoBandit(Random random, IEnumerable<double> alpha) {
+      this.alpha = alpha.ToArray();
+      this.pZero = new double[this.alpha.Length];
+      this.random = random;
+      OptimalExpectedRewardArm = Array.IndexOf(this.alpha, alpha.Min());
+      OptimalMaximalRewardArm = OptimalExpectedRewardArm;
+    }
+    public ParetoBandit(Random random, IEnumerable<double> alpha, IEnumerable<double> pZero, int bestExpRewardArm, int bestMaxRewardArm) { // 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;
-        }
-      }
+      OptimalExpectedRewardArm = bestExpRewardArm;
+      OptimalMaximalRewardArm = bestMaxRewardArm;
     }
 
