package bots.mctsbot.ai.bots.bot.gametree.search.expander.sampling; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class RouletteWheelSampler extends StochasticSampler { public RouletteWheelSampler() { super(); } public RouletteWheelSampler(int nbBetSizeSamples) { super(nbBetSizeSamples); } class Bucket { private double start; private double end; private double prob; private double totalProb; private double averageProb; public Bucket(double start, double prob, double totalProb) { this.start = start; this.setProb(prob); this.setTotalProb(totalProb); } public double getStart() { return start; } public double getEnd() { return end; } public void setEnd(double end) { this.end = end; } public double getProb() { return prob; } private void setProb(double prob) { this.prob = prob; } public double getTotalProb() { return totalProb; } public void setTotalProb(double totalProb) { this.totalProb = totalProb; } public String toString() { return "Start: " + start + ", \t end: " + end + ",\t prob: " + prob + ", averageProb: " + averageProb + ", totalProb: " + totalProb; } public void setAverageProb(int length) { if (end == start) this.averageProb = totalProb; else this.averageProb = totalProb / ((end - start) * (length - 1)); } public double getAverageProb() { return averageProb; } } @Override protected double[] getStochasticSamples(int n) { RelativeBetDistribution distr = new RelativeBetDistribution(); double[] samples = new double[n]; for (int i = 0; i < samples.length; i++) samples[i] = distr.inverseCdf(r.nextDouble()); Arrays.sort(samples); return samples; } protected List<Bucket> getStochasticSamples(double threshold) { RelativeBetDistribution distr = new RelativeBetDistribution(); List<Bucket> buckets = new ArrayList<Bucket>(); // start of range bucket, prob of start, totalProb Bucket bucket = new Bucket(0, distr.pdf(0), 0); for (int i = 0; i < distr.length(); i++) { double relBet = (double) i / (distr.length() - 1); if (Math.abs(bucket.getProb() - distr.pdf(relBet)) > threshold) { bucket.setEnd(relBet); bucket.setAverageProb(distr.length()); buckets.add(bucket); bucket = new Bucket(relBet, distr.pdf(relBet), 0); } bucket.setTotalProb(bucket.getTotalProb() + distr.pdf(relBet)); } bucket.setEnd(1); bucket.setAverageProb(distr.length()); buckets.add(bucket); return buckets; } public static void main(String[] args) { RouletteWheelSampler s = new RouletteWheelSampler(); // double[] list = s.getStochasticSamples(8); // for (int i = 0; i < list.length; i++) { // System.out.println(" - " + list[i]); // } List<Bucket> list = s.getStochasticSamples(0.01); double totalProb = 0; for (int i = 0; i < list.size(); i++) { totalProb += list.get(i).getTotalProb(); System.out.println(" - " + list.get(i)); } System.out.println("\n => TotalProb: " + totalProb); } }