Beispiel #1
0
        /// <summary>
        /// Generates a complete configuration for the simple item generator.
        /// </summary>
        /// <param name="preConfig">The pre-configuration defining characteristics of the actual configuration.</param>
        /// <returns>The complete configuration.</returns>
        public static SimpleItemGeneratorConfiguration GenerateSimpleItemConfiguration(SimpleItemGeneratorPreConfiguration preConfig)
        {
            // Init
            SimpleItemGeneratorConfiguration config = new SimpleItemGeneratorConfiguration()
            {
                DefaultWeight     = preConfig.DefaultWeight,
                DefaultCoWeight   = preConfig.DefaultCoWeight,
                ProbToUseCoWeight = preConfig.ProbToUseCoWeight
            };
            RandomizerSimple             randomizer       = new RandomizerSimple(0);
            List <SimpleItemDescription> itemDescriptions = new List <SimpleItemDescription>();
            List <Tuple <SimpleItemDescription, double> > itemDescriptionWeights = new List <Tuple <SimpleItemDescription, double> >();
            List <Tuple <SimpleItemDescription, SimpleItemDescription, double> > itemDescriptionCoWeights = new List <Tuple <SimpleItemDescription, SimpleItemDescription, double> >();

            // Add comment
            config.Description = string.Join(",", typeof(SimpleItemGeneratorPreConfiguration).GetFields().Select(f =>
            {
                string fieldValue;
                if (f.GetValue(preConfig) is double)
                {
                    fieldValue = ((double)f.GetValue(preConfig)).ToString(IOConstants.FORMATTER);
                }
                else
                {
                    fieldValue = f.GetValue(preConfig).ToString();
                }
                return(f.Name + "=" + fieldValue);
            }));

            // Generate a set of item-descriptions
            for (int i = 0; i < preConfig.ItemDescriptionCount; i++)
            {
                // Generate next item
                SimpleItemDescription description = new SimpleItemDescription(null)
                {
                    ID = i
                };
                // Randomly weight the item
                double itemDescriptionWeight = 0;
                switch (preConfig.WeightDistributionType)
                {
                case ItemDescriptionWeightDistributionType.Normal:
                    itemDescriptionWeight = randomizer.NextNormalDouble(preConfig.ItemWeightMu, preConfig.ItemWeightSigma, preConfig.ItemWeightLB, preConfig.ItemWeightUB);
                    break;

                case ItemDescriptionWeightDistributionType.Uniform:
                    itemDescriptionWeight = randomizer.NextDouble(preConfig.ItemWeightLB, preConfig.ItemWeightUB);
                    break;

                default: throw new ArgumentException("Unknown distribution: " + preConfig.WeightDistributionType);
                }
                description.Weight = itemDescriptionWeight;
                // Randomly determine bundle size of the item
                if (preConfig.SupplyBundleSize)
                {
                    int itemDescriptionBundleSize = 0;
                    switch (preConfig.BundleSizeDistributionType)
                    {
                    case ItemDescriptionBundleSizeDistributionType.Normal:
                        itemDescriptionBundleSize = randomizer.NextNormalInt(preConfig.BundleSizeMu, preConfig.BundleSizeSigma, preConfig.BundleSizeLB, preConfig.BundleSizeUB);
                        break;

                    case ItemDescriptionBundleSizeDistributionType.Uniform:
                        itemDescriptionBundleSize = randomizer.NextInt(preConfig.BundleSizeLB, preConfig.BundleSizeUB + 1);
                        break;

                    default: throw new ArgumentException("Unknown distribution: " + preConfig.BundleSizeDistributionType);
                    }
                    description.BundleSize = itemDescriptionBundleSize;
                }
                // Add a random hue value to distinguish the item from others
                description.Hue = randomizer.NextDouble(360);
                // Add it
                itemDescriptions.Add(description);
                // Set a weight for the probability of the item
                double weight = 0;
                switch (preConfig.ProbWeightDistributionType)
                {
                case ItemDescriptionProbabilityWeightDistributionType.Constant:
                    weight = preConfig.ProbabilityWeightConstant;
                    break;

                case ItemDescriptionProbabilityWeightDistributionType.Uniform:
                    weight = randomizer.NextDouble(preConfig.ProbabilityWeightUniformMin, preConfig.ProbabilityWeightUniformMax);
                    break;

                case ItemDescriptionProbabilityWeightDistributionType.Normal:
                    weight = randomizer.NextNormalDouble(preConfig.ProbabilityWeightNormalMu, preConfig.ProbabilityWeightNormalSigma, preConfig.ProbabilityWeightLB, preConfig.ProbabilityWeightUB);
                    break;

                case ItemDescriptionProbabilityWeightDistributionType.Exponential:
                    weight = randomizer.NextExponentialDouble(preConfig.ProbabilityWeightExpLambda, preConfig.ProbabilityWeightLB, preConfig.ProbabilityWeightUB);
                    break;

                case ItemDescriptionProbabilityWeightDistributionType.Gamma:
                    weight = randomizer.NextGammaDouble(preConfig.ProbabilityWeightGammaK, preConfig.ProbabilityWeightGammaTheta, preConfig.ProbabilityWeightLB, preConfig.ProbabilityWeightUB);
                    break;

                default: throw new ArgumentException("Unknown distribution: " + preConfig.ProbWeightDistributionType);
                }
                itemDescriptionWeights.Add(new Tuple <SimpleItemDescription, double>(description, weight));
            }

            // Equally distribute items over two-dimensional space
            Dictionary <SimpleItemDescription, Tuple <double, double> > itemDescriptionPosition = new Dictionary <SimpleItemDescription, Tuple <double, double> >();

            foreach (var description in itemDescriptions)
            {
                itemDescriptionPosition[description] = new Tuple <double, double>(randomizer.NextDouble(), randomizer.NextDouble());
            }

            // Plot the distribution for reference
            GnuPlotter.Plot2DPoints(
                "itemdistribution",
                new List <Tuple <string, IEnumerable <Tuple <double, double> > > >()
            {
                new Tuple <string, IEnumerable <Tuple <double, double> > >("Item locations in 2D", itemDescriptionPosition.Values)
            },
                "item distribution for co-probability emulation");

            // Set conditional weights
            double maxDistance = Distances.CalculateEuclid(0, 0, 1, 1);

            foreach (var description in itemDescriptions.OrderBy(d => randomizer.NextDouble()).Take((int)(itemDescriptions.Count * preConfig.GivenCoWeights)))
            {
                foreach (var otherDescription in itemDescriptions.OrderBy(d => randomizer.NextDouble()).Take((int)(itemDescriptions.Count * preConfig.GivenCoWeights)))
                {
                    itemDescriptionCoWeights.Add(new Tuple <SimpleItemDescription, SimpleItemDescription, double>(
                                                     description,
                                                     otherDescription,
                                                     maxDistance - Distances.CalculateEuclid(
                                                         itemDescriptionPosition[description].Item1, itemDescriptionPosition[description].Item2,
                                                         itemDescriptionPosition[otherDescription].Item1, itemDescriptionPosition[otherDescription].Item2)));
                }
            }

            // Submit all
            config.ItemDescriptions = itemDescriptions.Select(d => new Skvp <int, double>()
            {
                Key = d.ID, Value = d.Hue
            }).ToList();
            config.ItemDescriptionWeights = itemDescriptions.Select(d => new Skvp <int, double>()
            {
                Key = d.ID, Value = d.Weight
            }).ToList();
            if (preConfig.SupplyBundleSize)
            {
                config.ItemDescriptionBundleSizes = itemDescriptions.Select(d => new Skvp <int, int>()
                {
                    Key = d.ID, Value = d.BundleSize
                }).ToList();
            }
            config.ItemWeights = itemDescriptionWeights.Select(d => new Skvp <int, double>()
            {
                Key = d.Item1.ID, Value = d.Item2
            }).ToList();
            config.ItemCoWeights = itemDescriptionCoWeights.Select(d => new Skkvt <int, int, double>()
            {
                Key1 = d.Item1.ID, Key2 = d.Item2.ID, Value = d.Item3
            }).ToList();

            // Name it
            config.Name = config.GetMetaInfoBasedName();

            // Return it
            return(config);
        }
Beispiel #2
0
 /// <summary>
 /// Writes a simple item generator configuration to a file.
 /// </summary>
 /// <param name="path">The file.</param>
 /// <param name="config">The configuration.</param>
 public static void WriteSimpleItemGeneratorConfigFile(string path, SimpleItemGeneratorConfiguration config)
 {
     // Serialize the object to xml and write it to the given path
     using (StreamWriter sw = new StreamWriter(path))
         _simpleItemGeneratorConfigSerializer.Serialize(sw, config);
 }