//! calculate the fitness value of ALL defined objetive values /*! * \param ContactWindowsVector contact windows to check * \param int max number of Contacts of the Scheduling problem * \param int[] population representation of the Genetic scheduler default NULL */ private void calculate(ContactWindowsVector contactWindows, int priorityValue, int nrOfAllContacts = 0, int[] population = null, ContactWindowsVector allcontactWindows = null) { //list of stations and Satellites List <string> stationList = contactWindows.getStationNames(); List <string> satelliteList = contactWindows.getSatelliteNames(); //number of times sation and satellite is scheduled int nrOfStation = contactWindows.getNumberOfStation(); int nrOfSatellites = contactWindows.getNumberOfSatellites(); // int[] nrOfContactsPerSatellite = new int[nrOfSatellites]; int[] nrOfContactsPerStation = new int[nrOfStation]; //number of Contacts Scheduled int nrOfScheduledContacts = 0; //Overall Scheduled Time double scheduledDuration = 0.0; //Complete Time of ALL contacts double allDuaration = 0.0; //Priority counts int priorityMax = priorityValue; int prio = calcualteMaxPrioValue(contactWindows); for (int i = 0; i < contactWindows.Count(); i++) { int stapo = -1; int satpo = -1; if (population != null) { if (population[i] == 1) { stapo = stationList.IndexOf(contactWindows.getAt(i).getStationName()); satpo = satelliteList.IndexOf(contactWindows.getAt(i).getSatName()); nrOfScheduledContacts++; scheduledDuration += contactWindows.getAt(i).getDuration(); } } else { if (nrOfAllContacts == 0) { if (contactWindows.getAt(i).getSheduledInfo()) { stapo = stationList.IndexOf(contactWindows.getAt(i).getStationName()); satpo = satelliteList.IndexOf(contactWindows.getAt(i).getSatName()); scheduledDuration += contactWindows.getAt(i).getDuration(); nrOfScheduledContacts++; } } else { stapo = stationList.IndexOf(contactWindows.getAt(i).getStationName()); satpo = satelliteList.IndexOf(contactWindows.getAt(i).getSatName()); scheduledDuration += contactWindows.getAt(i).getDuration(); nrOfScheduledContacts++; } } if (allcontactWindows == null) { allDuaration += contactWindows.getAt(i).getDuration(); } if (stapo > -1) { nrOfContactsPerStation[stapo]++; } if (satpo > -1) { nrOfContactsPerSatellite[satpo]++; } } //calculate Fairness for Stations double a_station = 0.0; double b_station = 0.0; for (int i = 0; i < nrOfStation; i++) { a_station = a_station + nrOfContactsPerStation[i]; b_station = b_station + Math.Pow(nrOfContactsPerStation[i], 2); } val_FairStations = Math.Pow(a_station, 2) / (nrOfStation * b_station); //calculate Fairnes for Satellites double a_satellites = 0.0; double b_satellites = 0.0; for (int i = 0; i < nrOfSatellites; i++) { a_satellites = a_satellites + nrOfContactsPerSatellite[i]; b_satellites = b_satellites + Math.Pow(nrOfContactsPerSatellite[i], 2); } val_FairSatellites = Math.Pow(a_satellites, 2) / (nrOfSatellites * b_satellites); if (nrOfAllContacts == 0) { nrOfAllContacts = contactWindows.Count(); } val_Scheduled = nrOfScheduledContacts / (double)nrOfAllContacts; val_Duration = scheduledDuration / allDuaration; val_Priority = (double)prio / (double)priorityMax; }
//! Starts the process of finding the best solution through genetor /*! * \param ScheduleProblemInterface definition of the problem to solve */ public void CalculateSchedule(ScheduleProblemInterface problem) { objective = problem.getObjectiveFunction(); set = problem.getContactWindows(); //Sort by time set.sort(Structs.sortByField.TIME); nrOfContacts = set.Count(); nrOfStation = set.getNumberOfStation(); nrOfSatellites = set.getNumberOfSatellites(); satelliteList = new List <string>(set.getSatelliteNames()); stationList = new List <string>(set.getStationNames()); fitness = new double[popSize]; bestSolution = new int[nrOfContacts]; if (runUnitlTime) { startrunTime = DateTime.Now; double h = hours; startrunTime = startrunTime.AddHours(h); } generation = 0; //create 5-10 random schedules from the Data population = new List <int[]>(); for (int i = 0; i < popSize; i++) { population.Add(new int[nrOfContacts]); fitness[i] = Constants.maxInt; } //Randomize the starting Population Random rnd = new Random(); for (int k = 0; k < popSize; k++) { for (int i = 0; i < nrOfContacts; i++) { int randStart = rnd.Next(0, 100); if (randStart <= genCrea) { population[k][i] = 1; } } } //-- bool foundSolution = false; while (!foundSolution) { generation++; //Console.WriteLine("Generation: " + generation.ToString() ); //elliminate all collsions either by using random chance or //by priority. //check fitness of each one (survival rate) for (int i = 0; i < popSize; i++) { surviveConflicts(population[i], rnd, conflictValue); fitness[i] = checkFitness(population[i]); } if (Properties.Settings.Default.global_MaxPerf == false) { System.Windows.Forms.Application.DoEvents(); } //take only the fittest survivalOfFittest(fitness, population); //Combine randomly and generate children createChildren(population, fitness, rnd); //Mutate (remove or add requests by slight change) for (int i = 0; i < popSize; i++) { mutate(population[i], rnd); } //check if Solution has been found foundSolution = isComplete(); if (generatePlotData > 0) { WriteLog(); } if (Properties.Settings.Default.global_MaxPerf == false) { System.Windows.Forms.Application.DoEvents(); } if (f != null) { f.incrementProgressBar(); } } if (solveConflict) { surviveConflicts(bestSolution, rnd, conflictValue); } // //surviveConflicts(bestSolution, rnd); setSchedule(bestSolution, set); Console.WriteLine("Found Solution after " + generation.ToString() + " Generations"); result = set; result.randomize(); fillGaps(); if (generatePlotData > 0) { plotWr.Close(); } if (f != null) { f.resetProgressBar(); } }
//! Draw Conatact Windows. /*! * \param ContactWindowsVector Contacts * \param bool Draw All if false only scheduled contacts will be drawn * \return Image bmp-Image * Creates a bmp Image and returns it */ public static Image drawContacts(ContactWindowsVector contacts, bool drawAll) { if (contacts != null) { //sort by Groundstations contacts.sort(Structs.sortByField.GROUNDSTATION); List <string> satNameList = contacts.getSatelliteNames(); List <string> staNameList = contacts.getStationNames(); int x_offset = 100; int y_offset = 20; int satBoxheight = 20; //calculate Size of Image double timeLength = contacts.getStopTime().getEpoch() - contacts.getStartTime().getEpoch(); int imWidth = Convert.ToInt32(timeLength = 8640 * timeLength); int imHeight = satNameList.Count() * staNameList.Count() * 20; Image dest = new Bitmap(imWidth + x_offset, imHeight + y_offset); //Generate Front and Brusch for drawing System.Drawing.Graphics g; System.Drawing.Pen pen = new System.Drawing.Pen(Color.Black, 1F); Font drawFont = new Font("Arial", 10); SolidBrush brush = new SolidBrush(Color.Black); g = Graphics.FromImage(dest); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit; //Start Drawing Contact Windows for (int i = 0; i < contacts.Count(); i++) { //Draw only if scheduled unless drawAll = true if (contacts.getAt(i).getSheduledInfo() || drawAll) { int satPosY = satNameList.IndexOf(contacts.getAt(i).getSatName()); int staPosY = staNameList.IndexOf(contacts.getAt(i).getStationName()); int y = 0; int x = 0; int satBoxhWidth = 0; y = satPosY * 20 + staPosY * satNameList.Count() * 20 + y_offset; double satx = 8640 * (contacts.getAt(i).getStartTime().getEpoch() - contacts.getStartTime().getEpoch()); x = Convert.ToInt32(satx) + x_offset; satBoxhWidth = Convert.ToInt32(contacts.getAt(i).getDuration() / 10.0); //brush = new SolidBrush(Color.FromArgb(contacts.getAt(i).getHash())); if (drawAll && !contacts.getAt(i).getSheduledInfo()) { brush = new SolidBrush(Color.FromArgb(215, 215, 215)); g.FillRectangle(brush, new Rectangle(x, y, satBoxhWidth, satBoxheight)); g.DrawString(contacts.getAt(i).getSatName(), drawFont, new SolidBrush(Color.DarkGray), x, y); } else { brush = new SolidBrush(Color.FromArgb(contacts.getAt(i).getHash())); g.FillRectangle(brush, new Rectangle(x, y, satBoxhWidth, satBoxheight)); g.DrawString(contacts.getAt(i).getSatName(), drawFont, new SolidBrush(Color.Black), x, y); } } } System.Drawing.Pen stationPen; stationPen = new System.Drawing.Pen(Color.DarkGray, 1); g.DrawLine(stationPen, x_offset, 0, x_offset, imHeight); //Start Drawing Stations Names for (int i = 0; i < staNameList.Count(); i++) { int x1 = 0; int y1 = (i + 1) * satNameList.Count() * 20; int x2 = imWidth; int y2 = (i + 1) * satNameList.Count() * 20; g.DrawString(staNameList[i], drawFont, new SolidBrush(Color.Black), 5, y1 - ((satNameList.Count() / 2) * 20)); g.DrawLine(stationPen, x1, y1 + y_offset, x2, y2 + y_offset); } One_Sgp4.EpochTime time = new One_Sgp4.EpochTime(contacts.getStartTime()); g.DrawString(contacts.getStartTime().ToString(), drawFont, new SolidBrush(Color.Black), x_offset, 5); for (int i = x_offset; i < imWidth; i += 180) { g.DrawString(time.ToString(), drawFont, new SolidBrush(Color.Black), i, 5); g.DrawLine(stationPen, i, 0, i, imHeight); time.addTick(10 * 180); } //g.Dispose(); drawFont.Dispose(); brush.Dispose(); pen.Dispose(); dest.Save("Contacts.bmp"); return(dest); } else { int imWidth = 8640; int imHeight = 20; Image dest = new Bitmap(imWidth, imHeight); return(dest); } }
//! Calculates a schedule from the defined problem /*! * \pram ScheduleProblemInterface defined problem with contactwindows * Greedy approach earliest job first. */ public void CalculateSchedule(ScheduleProblemInterface problem) { set = problem.getContactWindows(); ContactWindowsVector set1 = new ContactWindowsVector(); ContactWindowsVector set2 = new ContactWindowsVector(); List <string> staName = set.getStationNames(); //while set is not empty do while (!isComplete()) { //loop through all Stations for (int i = 0; i < staName.Count(); i++) { int pos = -1; double earliest = 9999.99; int priority = 4; //loop through all Contacts and find the item that finisches //first and has the highest priority. for (int k = 0; k < set.Count(); k++) { if (set.getAt(k).getStationName() == staName[i]) { if (set.getAt(k).getStopTime().getEpoch() < earliest && (int)set.getAt(k).getPriority() <= priority) { pos = k; earliest = set.getAt(k).getStopTime().getEpoch(); priority = (int)set.getAt(k).getPriority(); } } } //update Progress Bar on Main Form if (Properties.Settings.Default.global_MaxPerf == false) { System.Windows.Forms.Application.DoEvents(); } if (f != null) { f.incrementProgressBar(); } //the found earliest job is added to set1 if its empty //or no other contact in set1 is conflicting with it //if there is a conflict add this element to set2 //Then the element is deleted from set1 if (pos > -1) { if (set1.isEmpty()) { set1.add(set.getAt(pos)); set.deleteAt(pos); } else { bool found = false; for (int k = 0; k < set1.Count(); k++) { if (set.getAt(pos).checkConflikt(set1.getAt(k))) { if (set.getAt(pos).getSatName() == set1.getAt(k).getSatName()) { set2.add(set.getAt(pos)); set.deleteAt(pos); found = true; break; } } } if (!found) { set1.add(set.getAt(pos)); set.deleteAt(pos); } } } } } for (int i = 0; i < set1.Count(); i++) { set1.getAt(i).setSheduled(); } for (int i = 0; i < set2.Count(); i++) { set2.getAt(i).unShedule(); } set.add(set1); set.add(set2); schedule = set; solveConflictsByPriority(); if (f != null) { f.resetProgressBar(); } }