public void SaveInputs(RandomPositionGenerator randomPositions) { int simNumber = File.ReadAllLines(_filePath).Count(); var allVariables = randomPositions.AllVariables; var csv = new StringBuilder(); csv.Append(simNumber + Delimeter); foreach (DictionaryEntry kvp in allVariables) { if (Math.Abs(Convert.ToDouble(kvp.Key) - (-1)) < 0.1) //Wind value or Radius { csv.Append(kvp.Value); csv.Append(Delimeter); } else { csv.Append(kvp.Key); csv.Append(Delimeter); csv.Append(kvp.Value); csv.Append(Delimeter); } } File.AppendAllText(_filePath, csv.ToString()); }
static void Main(string[] args) { //Initialise everything World newWorld = new World(); Portal newPortal = new Portal(10, 35, 5, 100, 30); Bumper newBumper = new Bumper(); SuvatSolver newSuvatSolver = new SuvatSolver(newWorld.g, newWorld.WindConstant); ODESolution newOde = new ODESolution(newWorld.g, newWorld.WindConstant); NeuralNetworkParameters networkParameters = new NeuralNetworkParameters(); BruteForceMethods newBruteForceMethods = new BruteForceMethods(newOde, newBumper, networkParameters); for (int i = 1; i < 1000; i++) { Console.WriteLine("Starting simulation " + i + " of this batch"); // Generate the random values and save to sheet RandomPositionGenerator newGenerator = new RandomPositionGenerator(); SaveMethods saveMethods = new SaveMethods(_filePath); newGenerator.GenerateRandomValues(); saveMethods.SaveInputs(newGenerator); // Save to file //Create a 'fake' ShellshockWindow app or something var keyCollection = newGenerator.AllVariables.Keys; var valueCollection = newGenerator.AllVariables.Values; double[] xVals = new double[keyCollection.Count]; double[] yVals = new double[valueCollection.Count]; keyCollection.CopyTo(xVals, 0); valueCollection.CopyTo(yVals, 0); //Wind newWorld.Wind = (int)yVals[9]; // Tanks var myNewXPosition = xVals[0]; var myNewYPosition = yVals[0]; var enemyNewXPosition = xVals[1]; var enemyNewYPosition = yVals[1]; // Portals newPortal.BlueLeft = xVals[7]; newPortal.BlueTop = yVals[7]; newPortal.OrangeLeft = xVals[8]; newPortal.OrangeTop = yVals[8]; // Linear bumpers newBumper.LinearBumper1LeftPosition = xVals[2]; newBumper.LinearBumper1TopPosition = yVals[2]; newBumper.LinearBumper2LeftPosition = xVals[3]; newBumper.LinearBumper2TopPosition = yVals[3]; // Circular bumpers newBumper.CircularBumper1Left = xVals[4]; newBumper.CircularBumper1Top = yVals[4]; newBumper.CircularBumper2Left = xVals[5]; newBumper.CircularBumper2Top = yVals[5]; newBumper.CircularBumper3Left = xVals[6]; newBumper.CircularBumper3Top = yVals[6]; //Run methods to generate wind and power newBumper.isRebound = true; var isMirrored = myNewXPosition > enemyNewXPosition ? -1 : 1; double horizontalPixelDistance = Math.Abs(enemyNewXPosition - myNewXPosition); double horizontalMmDistance = horizontalPixelDistance * newWorld.ScreenWidthRatio * World.PixelToMm; newWorld.X = horizontalMmDistance; double verticalPixelDistance = myNewYPosition - enemyNewYPosition; double verticalMmDistance = verticalPixelDistance * newWorld.ScreenWidthRatio * World.PixelToMm; newWorld.Y = verticalMmDistance; // Now update portal positions newOde.BluePosition = newPortal.BluePosition(myNewXPosition, myNewYPosition, newWorld.ScreenWidthRatio, isMirrored); newOde.OrangePosition = newPortal.OrangePosition(myNewXPosition, myNewYPosition, newWorld.ScreenWidthRatio, isMirrored); newBumper.FindAllRelativePositions(myNewXPosition, myNewYPosition, newWorld.ScreenWidthRatio, isMirrored); newOde.NewBumper = newBumper; newOde.IsMirrored = isMirrored; Console.WriteLine("Finding power and angle ..."); double[] powerAngleGuess = BruteForceAsync(newBruteForceMethods, newWorld).Result; string powerGuess = powerAngleGuess[0].ToString("0"); string angleGuess = powerAngleGuess[1].ToString("0"); saveMethods.SaveOutputs(powerGuess, angleGuess); Console.WriteLine("Completed simulation " + i + " of this batch"); } }