/************************************************************************\ |* gtf is a framework for analyzing two-player zero-sum games *| |* Copyright (C) 2005 Troels Bjerre Sorensen *| |* *| |* This program is free software; you can redistribute it and/or modify *| |* it under the terms of the GNU General Public License as published by *| |* the Free Software Foundation; either version 2 of the License, or *| |* (at your option) any later version. *| |* *| |* This program is distributed in the hope that it will be useful, but *| |* WITHOUT ANY WARRANTY; without even the implied warranty of *| |* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *| |* General Public License for more details. *| |* *| |* You should have received a copy of the GNU General Public License *| |* along with this program; if not, write to the *| |* Free Software Foundation, Inc., 59 Temple Place - Suite 330, *| |* Boston, MA 02111-1307, USA. *| \************************************************************************/ package gtf.game; import gtf.util.*; import java.util.*; public class MixedStrategy> extends Strategy { public MixedStrategy(List> strategies, List weights) { super(new HashMap()); if (strategies.size() != weights.size()) throw new RuntimeException("MixedStrategy: Lists must be of same length."); T ZERO = weights.get(0).zero(); T sum = ZERO; for (T weight : weights) { if (weight.isNegative()) throw new RuntimeException("MixedStrategy: Weights must be positive."); sum = sum.add(weight); } ListIterator it = weights.listIterator(); while (it.hasNext()) it.set(it.next().divide(sum)); Set choices = new HashSet(); it = weights.listIterator(); for (Strategy strat : strategies) { if (!it.next().isZero()) { choices.addAll(strat.vals.keySet()); } } String[] keys = choices.toArray(new String[0]); Arrays.sort(keys, new StringLengthComparator()); for (String key : keys) { T prob = ZERO; it = weights.listIterator(); for (Strategy strat : strategies) { prob = prob.add(it.next().multiply(strat.probOf(key))); } if (!prob.isZero()) { vals.put(key, prob); } } } }