예제 #1
0
        private string GetRandomValue(RlmIO item, RlmIdea idea = null)
        {
            string value = string.Empty;

            // TODO add checking on the types and their max and min values
            switch (item.DotNetType)
            {
            case "System.Boolean":
                int boolMin      = Convert.ToInt32(item.Min);
                int boolMax      = Convert.ToInt32(item.Max + 1);
                int boolIntValue = Util.Randomizer.Next(boolMin, boolMax);
                if (boolIntValue > 1 && boolIntValue < 0)
                {
                    throw new Exception("Boolean value can only be 1 or 0");
                }
                value = Convert.ToBoolean(boolIntValue).ToString();
                break;

            case "System.Double":
            case "System.Decimal":
                double doubleMin = Convert.ToDouble(item.Min);
                double doubleMax = Convert.ToDouble(item.Max);
                value = Util.Randomizer.NextDouble(doubleMin, doubleMax).ToString();
                break;

            default:
                int min = Convert.ToInt32(item.Min);
                int max = Convert.ToInt32(item.Max + 1);
                if (idea != null && idea is RlmOutputLimiter)
                {
                    var itemIdea = idea as RlmOutputLimiter;
                    max = itemIdea.IndexMax + 1;
                    int ideaIndex = Util.Randomizer.Next(min, max);
                    if (itemIdea.GetIndexEquivalent != null)
                    {
                        value = itemIdea.GetIndexEquivalent(ideaIndex).ToString();
                    }
                    else
                    {
                        value = ideaIndex.ToString();
                    }
                }
                else
                {
                    value = Util.Randomizer.Next(min, max).ToString();
                }
                break;
            }

            return(value);
        }
예제 #2
0
        private IEnumerable <RlmIOWithValue> GetRandomOutputValues(IEnumerable <RlmIO> outputs, IEnumerable <RlmIdea> ideas = null)
        {
            var retVal = new List <RlmIOWithValue>();

            foreach (var item in outputs)
            {
                RlmIdea idea = null;
                if (ideas != null)
                {
                    idea = ideas.First(a => a.RlmIOId == item.ID);
                }

                string value = GetRandomValue(item, idea);

                var output_with_value = new RlmIOWithValue(item, value);
                retVal.Add(output_with_value);
            }

            return(retVal);
        }
예제 #3
0
        /// <summary>
        /// Gets a random solution from outputs or randomize
        /// </summary>
        /// <param name="randomnessCurrVal"></param>
        /// <param name="outputs"></param>
        /// <param name="bestSolutionId"></param>
        /// <returns></returns>
        public GetSolutionResult GetRandomSolutionFromOutput(double randomnessCurrVal, IEnumerable <RlmIO> outputs, long?bestSolutionId = null, IEnumerable <RlmIdea> ideas = null)
        {
            GetSolutionResult retVal = null;

            if (outputs.Count() == 1)
            {
                IEnumerable <RlmIOWithValue> outputWithValues = GetRandomOutputValues(outputs, ideas);
                retVal = GetSolutionFromOutputs(outputWithValues);
            }
            else
            {
                var outputsWithVal = new List <RlmIOWithValue>();

                // check if best solution was passed in as parameter or not
                if (bestSolutionId.HasValue)
                {
                    IEnumerable <Output_Values_Solution> bestOutputs = null;
                    int cntRandomValues = 0;

                    foreach (var item in outputs)
                    {
                        // use best solution value if randomness outside threshold
                        int randomnessValue = Util.Randomizer.Next(1, 101);
                        if (randomnessValue > randomnessCurrVal)
                        {
                            if (bestOutputs == null)
                            {
                                //bestOutputs = db.Output_Values_Solutions.Where(a => a.Solution_ID == bestSolutionId.Value);
                                Solution solution = Solutions[bestSolutionId.Value];
                                bestOutputs = solution.Output_Values_Solutions;
                            }

                            var bestOutput = bestOutputs.FirstOrDefault(a => a.Output_ID == item.ID);
                            outputsWithVal.Add(new RlmIOWithValue(item, bestOutput.Value));
                        }
                        else // get random value
                        {
                            RlmIdea idea = null;
                            if (ideas != null)
                            {
                                idea = ideas.FirstOrDefault(a => a.RlmIOId == item.ID);
                            }

                            string value = GetRandomValue(item, idea);
                            outputsWithVal.Add(new RlmIOWithValue(item, value));
                            cntRandomValues++;
                        }
                    }

                    // if no random values were assigned then we randomly select one to randomize
                    // this is to ensure we have at least one random output value
                    if (cntRandomValues == 0)
                    {
                        var index  = Util.Randomizer.Next(0, outputsWithVal.Count);
                        var output = outputsWithVal.ElementAt(index);

                        RlmIdea idea = null;
                        if (ideas != null)
                        {
                            idea = ideas.FirstOrDefault(a => a.RlmIOId == output.ID);
                        }

                        string value = GetRandomValue(output, idea);
                        output.Value = value;
                    }
                }
                else // no best solution, so we give out all random values
                {
                    outputsWithVal.AddRange(GetRandomOutputValues(outputs, ideas));
                }

                retVal = GetSolutionFromOutputs(outputsWithVal);
            }

            return(retVal);
        }