public EvoStrat( OptimizationRun run, ICollection <long> driverIds, ICollection <long> taskIds, ICollection <Entity> entities, ICollection <Driver> drivers, ICollection <Task> tasks, ICollection <RouteLeg> routeLegs, ICollection <DriverTaskMultiplier> routeMutipliers, bool costOptimization, double distanceCostRatio, double avgLegLength, double maxLegLength, double avgLegPenalty, double maxLegPenalty, double demand) { _run = run; _driverIds = driverIds.ToList(); _stopIds = taskIds.ToList(); _routeEntities = entities.ToList(); _drivers = drivers.ToList(); _tasks = tasks.ToList(); _routeLegs = routeLegs.ToList(); _mutipliers = routeMutipliers.ToList(); _costOptimization = costOptimization; _distanceCostRatio = distanceCostRatio; _avgLegLength = avgLegLength; _avgLegPenalty = avgLegPenalty; _maxLegLength = maxLegLength; _maxLegPenalty = maxLegPenalty; _demand = demand; }
public EvoStrat(OptimizationRun run, ICollection <RouteDriver> drivers, ICollection <RouteOrder> orders, ICollection <RouteLeg> routeLegs, ICollection <RouteOrderMultiplier> routeMutipliers, bool costOptimization, double distanceCostRatio, double avgLegLength, double maxLegLength, double avgLegPenalty, double maxLegPenalty, double demand, double capacity) { _run = run; _drivers = drivers.ToList(); _orders = orders.ToList(); _routeLegs = routeLegs.ToList(); _mutipliers = routeMutipliers.ToList(); _costOptimization = costOptimization; _distanceCostRatio = distanceCostRatio; _avgLegLength = avgLegLength; _avgLegPenalty = avgLegPenalty; _maxLegLength = maxLegLength; _maxLegPenalty = maxLegPenalty; _demand = demand; _capacity = capacity; }
public void StartOptimization() { _running = true; _ready = true; while (_running && _ready) { OptimizationRun run = new OptimizationRun(); RouteResponse response = null; List <Entity> routeEntities = new List <Entity> (); List <RouteLeg> routeLegs = new List <RouteLeg>(); try{ // First, let's check to see if there's any jobs to process response = GetNextJobToProcess(); if (response != null) { // we've got a job! run.ID = response.routeId; _runID = response.routeId; _ready = false; Console.WriteLine("Set RunID = " + run.ID); List <Int64> driverList = new List <Int64>(); List <Int64> stopList = new List <Int64>(); Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": Optimization job " + run.ID + " started."); NpgsqlConnection conn = new NpgsqlConnection("Server=hci.cvwcpfnur8ep.us-east-1.rds.amazonaws.com;Port=5432;User Id=hci_user;Password=Nov299pe;Database=route;"); conn.Open(); try { // Update the driver entities foreach (Driver d in response.drivers) { NpgsqlCommand command = new NpgsqlCommand( "SELECT * FROM update_entity(" + response.customerId.ToString() + "::bigint, " + d.name + "::varchar, " + d.location.latitude.ToString() + "::float8, " + d.location.longitude.ToString() + "::float8, " + "2::int2)", conn); command.CommandType = CommandType.Text; Object result = command.ExecuteScalar(); // set the driver system id d.id = Convert.ToInt64(result); driverList.Add(Convert.ToInt64(result)); // now add the driver to the entity list routeEntities.Add(new Entity { id = Convert.ToInt64(result), geoLat = d.location.latitude, geoLon = d.location.longitude }); } Console.WriteLine("Drivers: " + string.Join <Int64>(",", driverList)); // update the stop entities foreach (Task t in response.tasks) { NpgsqlCommand command = new NpgsqlCommand( "SELECT * FROM update_entity(" + response.customerId.ToString() + "::bigint, " + t.stop.name + "::varchar, " + t.stop.location.latitude.ToString() + "::float8, " + t.stop.location.longitude.ToString() + "::float8, " + "1::int2)", conn); command.CommandType = CommandType.Text; Object result = command.ExecuteScalar(); // set's the id to the stop ID, to lookup during the routeleg calculation t.id = Convert.ToInt64(result); stopList.Add(Convert.ToInt64(result)); // now add the stop to the entity list routeEntities.Add(new Entity { id = Convert.ToInt64(result), geoLat = t.stop.location.latitude, geoLon = t.stop.location.longitude }); } Console.WriteLine("Stops: " + string.Join <Int64>(",", stopList)); // now get a list of route legs string drivers = string.Join <Int64>(",", driverList); string stops = string.Join <Int64>(",", stopList); NpgsqlCommand legCommand = new NpgsqlCommand("SELECT * FROM calc_entity_matrix('" + drivers + "','" + stops + "')", conn); NpgsqlDataReader dr = legCommand.ExecuteReader(); while (dr.Read()) { routeLegs.Add(new RouteLeg { FromID = Convert.ToInt32(dr.GetValue(0)), ToID = Convert.ToInt32(dr.GetValue(1)), DrivingDistance = Convert.ToDecimal(dr.GetValue(2)), DrivingTime = Convert.ToDecimal(dr.GetValue(3)) }); } } finally { conn.Close(); } // Now calculate the route leg stuff Routing routing = new Routing(); ICollection <RouteLeg> legs = routing.GetRouteLegs(routeEntities, routeLegs, 1, Routing.CostType.Distance); ICollection <DriverTaskMultiplier> legMultipliers = routing.GetRoutePenalties(response.drivers, response.tasks); int demand = 1; // set the alogorithm manually for demo run.GenerationsToRun = response.generations; run.Algorithm = "ES_MDVRPTW_v3.hl"; run.CostOptimization = false; run.DistanceCostRatio = 1.0m; run.AvgLegLength = 20; run.AvgLegPenalty = 0; run.MaxLegLength = 30; run.MaxLegPenalty = 0; _evoStrat = new EvoStrat( run, driverList, stopList, routeEntities, response.drivers, response.tasks, legs, legMultipliers, run.CostOptimization, Convert.ToDouble(run.DistanceCostRatio), Convert.ToDouble(run.AvgLegLength), Convert.ToDouble(run.MaxLegLength), Convert.ToDouble(run.AvgLegPenalty), Convert.ToDouble(run.MaxLegPenalty), demand); _evoStrat.StatusUpdate += new EventHandler(Routing_StatusUpdate); _evoStrat.StartOptimization(); } else { //Stop (); // No jobs, so terminate instance! Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": No job to process..."); //Process shutdown = new Process(); //shutdown.StartInfo.FileName = "shutdown.sh"; //shutdown.Start(); Thread.Sleep(_sleepDuration); } } catch (Exception exc) { // ignore error Thread.Sleep(_sleepDuration); var error = exc; } } // loop until it gets a job }
public void StartOptimization() { _running = true; _ready = true; while (_running && _ready) { // first get the next Optimization Run to solve //OptimizationRun run = GetNextOptimizationJob(); OptimizationRun run = null; using (JsonServiceClient client = new JsonServiceClient()) { RouteJobsResponse response = client.Get <RouteJobsResponse>("http://api.datalyticsllc.com/routing/routejobs/-1"); if (response.RouteJobs.Count > 0) { run = response.RouteJobs [0]; } }; if (run != null) { //Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": Optimization job " + run.ID + " started."); /* * // get the connection string for the customer who posted the optimization job * ScheduleCustomer customer = centralUnitOfWork.ScheduleCustomerRepository.GetByID(run.CustomerID); * * RoutingUnitOfWork unitOfWork = new RoutingUnitOfWork(customer.ConnectionString); */ // we've got a job! don't get the next job off this thread...we're done. _ready = false; Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": Optimization job " + run.ID + " started."); /* * // need to dynamically switch to the customer database to get the list of drivers and orders * ICollection<RouteDriver> drivers = unitOfWork.GetRouteDriversWithAvailability(run.Drivers, run.ServiceDate).ToList(); * ICollection<RouteOrder> orders = unitOfWork.GetRouteOrders(run.Orders).ToList(); * * // get a list of stops from the orders (ie. patients from the visits). Used for RouteLeg lookup * ICollection<RouteStop> stops = orders.Select(x => new RouteStop() * { * ID = x.StopID, GeoLat = x.GeoLat, GeoLon = x.GeoLon, * Address = x.Address, City = x.City, State = x.State, Zip = x.Zip * }).Distinct().ToList(); * * * // So we pass the route legs when we call the optimizer, or calculate here? * Routing.Routing routing = new Routing.Routing(); * * ICollection<RouteLeg> routeLegs = routing.GetRouteLegs(stops, drivers, run.CustomerID, Routing.Routing.CostType.Distance); * * Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": Parsing optimization tags - '" + run.OptimizationTags + "'."); * IEnumerable<OptimizationTag> optimizationTags = OptimizationTagParser.Parse(run.OptimizationTags); * * ICollection<RouteOrderMultiplier> legMultipliers = routing.GetRouteMultipliers(orders, drivers, optimizationTags); * * int demand = run.MaxCapacity > 0 ? 1 : 0; * * _evoStrat = new EvoStrat( * run, * drivers, * orders, * routeLegs, * legMultipliers, * run.CostOptimization, * Convert.ToDouble(run.DistanceCostRatio), * Convert.ToDouble(run.AvgLegLength), * Convert.ToDouble(run.MaxLegLength), * Convert.ToDouble(run.AvgLegPenalty), * Convert.ToDouble(run.MaxLegPenalty), * demand, * run.MaxCapacity); * * _evoStrat.StatusUpdate += new EventHandler(Routing_StatusUpdate); * _evoStrat.StartOptimization(); */ } else { Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": No job to process."); Thread.Sleep(_sleepDuration); } } // loop until it gets a job }
// Thread-safe method to get the next optimization job to run private OptimizationRun GetNextOptimizationJob() { OptimizationRun run = null; SqlConnection conn = new SqlConnection("Data Source=CoordCare.com;Initial Catalog=Optimization;Integrated Security=False;User ID=sa;Password=Nov299pe"); SqlCommand cmd; SqlDataAdapter sda; DataSet tables = new DataSet(); conn.Open(); // get the next cmd = new SqlCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.StoredProcedure; cmd.CommandText = "GetNextOptimizationRun"; tables = new DataSet(); sda = new SqlDataAdapter(cmd); sda.Fill(tables); if (tables.Tables[0].Rows.Count == 0) { conn.Close(); return(null); } else { foreach (DataRow r in tables.Tables[0].Rows) { try { run = new OptimizationRun(); run.ID = Convert.ToInt32(r["ID"].ToString()); run.CustomerID = Convert.ToInt32(r["CustomerID"].ToString()); run.GenerationsToRun = Convert.ToInt32(r["GenerationsToRun"].ToString()); run.ServiceDate = Convert.ToDateTime(r["ServiceDate"].ToString()); run.Drivers = r["Drivers"].ToString(); run.Orders = r["Orders"].ToString(); run.Algorithm = r["Algorithm"].ToString(); run.Demo = r["Demo"] == null ? false : Convert.ToInt32(r["Demo"]) == 1; run.OptimizationTags = r["Tags"].ToString(); run.CostOptimization = Convert.ToBoolean(r["CostOptimization"].ToString()); run.DistanceCostRatio = Convert.ToDecimal(r["DistanceCostRatio"].ToString()); run.AvgLegLength = Convert.ToInt32(r["AvgLegLength"].ToString()); run.MaxLegLength = Convert.ToInt32(r["MaxLegLength"].ToString()); run.AvgLegPenalty = Convert.ToDecimal(r["AvgLegPenalty"].ToString()); run.MaxLegPenalty = Convert.ToDecimal(r["MaxLegPenalty"].ToString()); run.MaxCapacity = Convert.ToInt32(r["MaxCapacity"].ToString()); } catch (Exception exc) { Console.WriteLine("[" + string.Format("{0:d/M/yyyy HH:mm:ss}", DateTime.Now) + "] Thread " + _threadID + ": Error -- " + exc.ToString()); } } conn.Close(); } return(run); }