static void Main(string[] args)
        {
            Console.WriteLine("Press Enter to Start Client");
            Console.ReadLine();
            var watch = Stopwatch.StartNew();

            PigData pigData = new PigData();
            pigData.distanceToPig = 100;
            pigData.generations = 10;
            pigData.maximumforce = 1000;
            pigData.wallheight = 30;

            //DistributedProcess distributedProcess = new DistributedProcess("localhost", 56000, 55559);
            //distributedProcess.AddFunctionFile(@"..\..\..\WorkPigShot\bin\Release\WorkPigShot.dll")
            //    .addWork((object)pigData);

            DistributedProcess distributedProcess = new DistributedProcess("localhost", 56000, 55559);
            distributedProcess.AddFunctionFile(@"..\..\..\WorkPigShot\bin\Debug\WorkPigShot.dll")
                .addWork((object)new double[] { 100, 10, 1000, 30 });

            //DistributedProcess distributedProcess = new DistributedProcess("localhost", 56000, 55559);
            //distributedProcess.AddFunctionFile(@"..\..\..\WorkFile\bin\Release\WorkFile.dll")
            //    .addWork((string)@".\TestText.txt");

            long IDNumber = distributedProcess.Start();
            Console.WriteLine("Task ID number = " + IDNumber);
            var answer = distributedProcess.GetFinishedWork(IDNumber);

            List<double[]> answerValue = (List<double[]>)answer.values;
            List<Cannon> cannons = new List<Cannon>();
            foreach (var item in answerValue)
            {
                cannons.Add(new Cannon() { Angle = item[0], Force = item[1], minimumForce = item[2], maximumForce = item[3], minimumAngle = item[4], maximumAngle = item[5], legthToPig = item[6], distanceFired = item[7], fitness = item[8], wallHeight = item[9] });
            }

            Cannon bestCannon = cannons.OrderBy(x => x.fitness).FirstOrDefault();

            double angle = bestCannon.Angle;
            double force = bestCannon.Force;

            //double totalHits = double.Parse(answer.Key.ToString());
            //double totalThrows = (double)answer.values;
            //double result = (double)((totalHits / totalThrows) * 4d);

            watch.Stop();
            var elapsedMs = watch.ElapsedMilliseconds;
            Console.WriteLine("The force for the shot is " + force);
            Console.WriteLine("The angle for the shot is " + angle * 180 / Math.PI);
            Console.WriteLine("The distance travelled is " + bestCannon.distanceFired);

            //Console.WriteLine("The answer to the mapReduce is for pi is : " + result);
            //Console.WriteLine("Total time elapsed = " + elapsedMs + "ms");
            Console.ReadLine();
        }
 public ReduceResult[] Distribute(object obj)
 {
     Console.WriteLine("distributing data................");
     double[] pigDataArray = (double[])obj;
     PigData pigData = new PigData() { distanceToPig = pigDataArray[0], generations = (int)pigDataArray[1], maximumforce = pigDataArray[2], wallheight = pigDataArray[3] };
     ReduceResult[] results = new ReduceResult[pigData.generations];
     for (int i = 0; i < results.Length; i++)
     {
         results[i] = new ReduceResult("", obj);
     }
     Console.WriteLine("Broke apart the data.");
     return results;
 }
 public MappedAnswer[] Map(object data)
 {
     ReduceResult SomeData = (ReduceResult)data;
     double[] pigDataArray = (double[])SomeData.values;
     PigData pigData = new PigData() { distanceToPig = pigDataArray[0], generations = (int)pigDataArray[1], maximumforce = pigDataArray[2], wallheight = pigDataArray[2] };
     Family generation = new Family(pigData.wallheight);
     generation.AddRandomCannons(500, pigData.maximumforce);
     generation.fireAllCannons();
     Cannon[] answer = generation.getFittest(100).ToArray();
     List<double[]> cannonConversion = new List<double[]>();
     Console.WriteLine("Best is " + answer[0].distanceFired + " for " + pigData.distanceToPig);
     for (int i = 0; i < 100; i++)
     {
         cannonConversion.Add(new double[] { answer[i].Angle, answer[i].Force, answer[i].minimumForce, answer[i].maximumForce, answer[i].minimumAngle, answer[i].maximumAngle, answer[i].legthToPig, answer[i].distanceFired, answer[i].fitness, answer[i].wallHeight});
     }
     MappedAnswer[] ma = new MappedAnswer[1];
     ma[0] = new MappedAnswer("", cannonConversion);
     return ma;
 }