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); }
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); }
/// <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); }