public Missionary(String fN, String n, int i, String z, Leg[] l, String[][] c, MissionaryManager mm)
 {
     fullName = fN;
     name = n;
     id = i;
     legs = l; // (Leg[])l.Clone();
     comps = c;
     //legs = null;
     legIndexs = null;
     manager = mm;
     zone = z;
 }
        // Will build the MissionaryManager from the Excel File
        public void Analyze_File(String fileURI, String sheetName, String outputFileName)
        {
            DateTime selectedDate = monthCalendar1.TodayDate;
            String selectedDateString = FUNCS.twoDigitHour(selectedDate.Day) + "-" + FUNCS.twoDigitHour(selectedDate.Month) + "-" + selectedDate.Year;
            selectedDateString = "26-08-2015";

            //conductorChristensen = new TrainManager(selectedDateString);
            //missionaryManagerChristensen = new MissionaryManager(conductorChristensen);
            excelManagerChristensen = new ExcelManager(selectedDateString);

            //var fileName = string.Format("{0}\\fileNameHere", Directory.GetCurrentDirectory());
            excelManagerChristensen.Import_Travel_File(fileURI, sheetName);
            conductorChristensen = excelManagerChristensen.getConductor();
            missionaryManagerChristensen = excelManagerChristensen.getMissionaryManager();

            //int x = conductorChristensen.getTrainTimes("Milano Centrale", "Torino Porta Susa", "09-06-2015", "06");
            missionaryManagerChristensen.printAllMissionaries();
            Console.WriteLine("About to calculate!");
            missionaryManagerChristensen.calculateTrips();
            Console.WriteLine("calculating");
            missionaryManagerChristensen.printAllMissionaries();
            missionaryManagerChristensen.printAllMissionarySchedules();
            excelManagerChristensen.write_to_text_file("C:\\Users\\SEC2016583\\Desktop",outputFileName,missionaryManagerChristensen.getAllMissionarySchedules());
            Console.Beep();

            FUNCS.ShowPromptBox("Finished running", "You should look on the desktop for your file.", "I mean nothing right now.");

            //Console.WriteLine(data.Columns);
        }
 public Missionary(String fN, String n, int i, String z, Leg[] l, String[][] c, Leg[] p, int[] lI, MissionaryManager mm)
 {
     fullName = fN;
     name = n;
     id = i;
     legs = l;
     comps = c;
     legs = p;
     legIndexs = lI;
     manager = mm;
     zone = z;
 }
 public ExcelManager(String d)
 {
     date = d;
     tm = new TrainManager(date);
     mm = new MissionaryManager(tm);
 }
        public void optimize(int depth)
        {
            Analyzation before = manager.analyzeSolution();

            MissionaryManager resultMM = independentOptimizerRandomOrder(manager);

            Analyzation after = resultMM.analyzeSolution();
            Console.WriteLine(after.conflictCount);
            Console.WriteLine("---");
            Console.WriteLine(before.conflictCount.ToString() + " -> " + after.conflictCount.ToString() + " conflicts.");
            Console.WriteLine(before.cost.ToString() + " -> " + after.cost.ToString() + " cost.");
            Console.WriteLine(before.time.ToString() + " -> " + after.time.ToString() + " total time.");
            Console.WriteLine(before.null_trains.ToString() + " -> " + after.null_trains.ToString() + " null trains.");
            Console.WriteLine("---");
            while (!after.Equals(before))
            {
                manager = resultMM;
                before = manager.analyzeSolution();
                resultMM = independentOptimizerRandomOrder(manager);
                after = manager.analyzeSolution();
                Console.WriteLine("---");
                Console.WriteLine(before.conflictCount.ToString() + " -> " + after.conflictCount.ToString());
                Console.WriteLine(before.cost.ToString() + " -> " + after.cost.ToString());
                Console.WriteLine(before.time.ToString() + " -> " + after.time.ToString());
                Console.WriteLine("---");
                Console.WriteLine(after.conflictCount);
                resultMM = independentOptimizerRandomOrder(manager);
            }
            Console.WriteLine("We got done! There are "+after.conflictCount.ToString()+" conflicts.");
        }
        public MissionaryManager independentOptimizerRandomOrder(MissionaryManager inputMM)
        {
            MissionaryManager mm = inputMM.Clone();
            Random rand = new Random();
            List<Missionary> ms = mm.missionaries;
            int numberOfMissionaries = ms.Count;
            List<int> missionaryIndices = new List<int>();
            for (int i = 0; i < numberOfMissionaries; i++)
            {
                missionaryIndices.Add(i);
            }

            // until we've done every missionary...
            while (missionaryIndices.Count > 0)
            {
                int randomInd = rand.Next(0,missionaryIndices.Count);
                int missInd = missionaryIndices[randomInd];
                Missionary currentMissionary = ms[missInd];
                missionaryIndices.Remove(missInd);

                // If we're already getting up early enough, start at the end (or, if we're going to a sleepover, which means we need to always squish forward.)
                if (currentMissionary.legs[0].time_start < 9 * 60 || currentMissionary.legs[0].going_to_sleepover)
                {
                    // For each train...
                    for (int i = currentMissionary.legs.Length - 1; i >= 0; i--)
                    {
                        // As long as it conflicts with that before it, move it forward.
                        while (currentMissionary.legs[i].conflict_before == true)
                        {
                            Train replacement = manager.trainStation.getNextTrain(currentMissionary.legs[i].train);
                            /* The fillLeg should do this...
                             if (i > 0 && replacement.timeMinutes > currentMissionary.legs[i - 1].train.arrivalTimeMinutes)
                            {
                                currentMissionary.legs[i].conflict_before = false;
                                currentMissionary.legs[i - 1].conflict_after = false;
                            }
                            else
                            {
                                currentMissionary.legs[i].conflict_before = true;
                                currentMissionary.legs[i - 1].conflict_after = true;
                            }

                            if (i < currentMissionary.legs.Length - 1 && replacement.arrivalTimeMinutes > currentMissionary.legs[i + 1].train.timeMinutes)
                            {
                                currentMissionary.legs[i].conflict_after = true;
                                currentMissionary.legs[i+1].conflict_before = true;
                            }
                            else
                            {
                                currentMissionary.legs[i].conflict_after = false;
                                currentMissionary.legs[i+1].conflict_before = false;
                            } */
                            //currentMissionary.legs[i].train = replacement;
                            currentMissionary.fillLeg(replacement);
                        }
                    }
                }
                else
                {
                    // For each train...
                    for (int i = 0; i < currentMissionary.legs.Length-1; i++)
                    {
                        // As long as it conflicts with that after it, move it back.
                        while (currentMissionary.legs[i].conflict_after == true)
                        {
                            Train replacement = manager.trainStation.getPreviousTrain(currentMissionary.legs[i].train);
                            /* The fillLeg should do this
                            if (i > 0 && replacement.timeMinutes > currentMissionary.legs[i - 1].train.arrivalTimeMinutes)
                            {
                                currentMissionary.legs[i].conflict_before = false;
                                currentMissionary.legs[i - 1].conflict_after = false;
                            }
                            else
                            {
                                if (i > 0)
                                {
                                    currentMissionary.legs[i].conflict_before = true;
                                    currentMissionary.legs[i - 1].conflict_after = true;
                                }
                            }

                            if (i < currentMissionary.legs.Length - 1 && replacement.arrivalTimeMinutes > currentMissionary.legs[i + 1].train.timeMinutes)
                            {
                                currentMissionary.legs[i].conflict_after = true;
                                currentMissionary.legs[i+1].conflict_before = true;
                            }
                            else
                            {
                                if (i < currentMissionary.legs.Length)
                                {
                                    currentMissionary.legs[i].conflict_after = false;
                                    currentMissionary.legs[i + 1].conflict_before = false;
                                }
                            } */
                            //currentMissionary.legs[i].train = replacement;
                            currentMissionary.fillLeg(replacement);
                        }
                    }
                }

                // We've done the whole missionaries travel now.
                ms[missInd] = currentMissionary; // put it back.
            }
            // We've done all the missinaries.

            // Compare it to that with which we started, and if it's better, return it, otherwise the original.
            mm.missionaries = ms;
            Analyzation inputA = inputMM.analyzeSolution();
            Analyzation outputA = mm.analyzeSolution();

            if (compareAnalyzations(inputA, outputA) == 0)
            {
                return inputMM;
            }
            else
            {
                return mm;
            }

            return mm;
        }
 public SolutionOptimizer(MissionaryManager m)
 {
     manager = m;
     //currentSolution = m..;
 }
        public MissionaryManager Clone()
        {
            MissionaryManager mm = new MissionaryManager(missionaries, trainStation);
            mm.hubs = this.hubs;
            mm.minLayover = this.minLayover;
            mm.preferredFinish = this.preferredFinish;
            mm.preferredHubTime = this.preferredHubTime;
            mm.preferredStart = this.preferredStart;
            mm.timeCostRatio = this.timeCostRatio;
            mm.trainStation = this.trainStation;
            return mm;

            return null;
        }