public CLSCOBO_ConsolidationEngine(CLSCOBO_ConsolidationProblem po_ConsolidationProblem)
        {
            ao_ConsolidationSolutions = new List<CLSCOBO_ConsolidationSolution>();
            as_PointsDistanceMatrix = FillInDistancesMatrix(po_ConsolidationProblem);

            for(int vi_IterationTotal=1;vi_IterationTotal<=1;vi_IterationTotal++) {
                vo_ConsolidationSolutions=new List<CLSCOBO_ConsolidationSolution>();
                for(int vi_Iteration=0;vi_Iteration<2;vi_Iteration++) {
                    vo_ConsolidationSolution=null;
                    CLSCOBO_ConsolidationSolution vo_PreviousConsolidationSolution=null;
                    if(vi_Iteration==0) {
                        vo_ConsolidationSolution=new CLSCOBO_ConsolidationSolution(po_ConsolidationProblem);
                        vo_ConsolidationSolutions.Add(vo_ConsolidationSolution);
                    } else {
                        vo_PreviousConsolidationSolution=vo_ConsolidationSolutions[0];
                        while(vo_PreviousConsolidationSolution.TruckItineraries.Count>4) {
                            vo_ConsolidationSolution=new CLSCOBO_ConsolidationSolution(vo_PreviousConsolidationSolution.TruckItineraries, vi_Iteration);
                            if(vo_ConsolidationSolution.TruckItineraries.Count!=0) {
                                vo_ConsolidationSolutions.Add(vo_ConsolidationSolution);
                            }
                            vo_PreviousConsolidationSolution=vo_ConsolidationSolutions[vo_ConsolidationSolutions.Count-1];
                        }
                    }
                }
                ao_ConsolidationSolutions.AddRange(vo_ConsolidationSolutions);
                vo_ConsolidationSolutions=null;
            }
        }
        public CLSCOBO_ConsolidationSolution(CLSCOBO_ConsolidationProblem po_ConsolidationProblem)
        {
            List<CLSCOBO_DeliveryPoint> vl_DeliveryPoints;
            al_TruckItineraries = new List<CLSCOBO_TruckItinerary>();

            foreach (CLSCOBO_DeliveryPoint vo_DeliveryPoint in po_ConsolidationProblem.Deliveries){
                vl_DeliveryPoints = new List<CLSCOBO_DeliveryPoint>();
                vl_DeliveryPoints.Add(vo_DeliveryPoint);
                CLSCOBO_TruckItinerary vo_TruckItinerary = new CLSCOBO_TruckItinerary(po_ConsolidationProblem.OriginPoint, vl_DeliveryPoints);
                al_TruckItineraries.Add(vo_TruckItinerary);
            }
        }
        public static CLSCOBO_ConsolidationProblem ReadFile(ref String ps_FileName)
        {
            string vs_Line;
            string vi_OriginDestinationIndicator="";
            TextReader vs_TextReader;
            CLSCOBO_DeliveryPoint vo_DeliveryPoint;
            CLSCOBO_OriginPoint vo_OriginPoint;
            CLSCOBO_ConsolidationProblem vo_ConsolidationProblem;

            try {
                if(string.IsNullOrEmpty(ps_FileName)) {
                    vo_ConsolidationProblem=ReadDemoData(ref ps_FileName);
                } else {
                    vo_ConsolidationProblem=new CLSCOBO_ConsolidationProblem();
                    ps_FileName=System.AppDomain.CurrentDomain.BaseDirectory+(string.IsNullOrEmpty(ps_FileName)?cs_DEMO_DEFAULT_FILE:ps_FileName);
                    vs_TextReader=new StreamReader(ps_FileName);

                    while((vs_Line=vs_TextReader.ReadLine())!=null) {
                        vi_OriginDestinationIndicator=vs_Line.Substring(0, vs_Line.IndexOf(","));
                        vs_Line=vs_Line.Remove(0, vs_Line.IndexOf(",")+1);
                        if(vi_OriginDestinationIndicator.ToUpper()=="O") {
                            vo_OriginPoint=new CLSCOBO_OriginPoint(vs_Line.Substring(0, vs_Line.IndexOf(",")));
                            vo_ConsolidationProblem.OriginPoint=vo_OriginPoint;
                        } else {
                            vo_DeliveryPoint=new CLSCOBO_DeliveryPoint(vs_Line.Substring(0, vs_Line.IndexOf(",")));
                            vo_DeliveryPoint.Weight=double.Parse(vs_Line.Remove(0, vs_Line.IndexOf(",")+1));
                            vo_ConsolidationProblem.Deliveries.Add(vo_DeliveryPoint);
                        }
                    }
                    vs_TextReader.Close();
                }
            } catch {
                vo_ConsolidationProblem=null;
            }
            return vo_ConsolidationProblem;
        }
        public static CLSCOBO_ConsolidationProblem ReadDemoData(ref string ps_FileName)
        {
            string vs_Line;
            string vs_FileName;
            string vs_State="";
            string vs_FirstZip="";
            string vs_SecondZip="";
            string vs_SelectedZip="";
            double vd_Weight=0;
            int vi_RandomPoint=-1;
            int vi_ChoosenAsOriginPoint=-1;
            int vi_RandomChoosenPoint=-1;
            int vi_RandomZipSelected=-1;

            TextReader vs_TextReader;
            List<CLSCOBO_DeliveryPoint> vl_DeliveryPoints=null;
            CLSCOBO_DeliveryPoint vo_TemporaryPoint;

            CLSCOBO_DeliveryPoint vo_DeliveryPoint;
            CLSCOBO_OriginPoint vo_OriginPoint;
            CLSCOBO_ConsolidationProblem vo_ConsolidationProblem;

            try {
                vs_FileName=System.AppDomain.CurrentDomain.BaseDirectory+cs_DEMO_DEFAULT_FILE;
                ps_FileName=cs_DEMO_DEFAULT_FILE;
                vs_TextReader=new StreamReader(vs_FileName);
                vl_DeliveryPoints=new List<CLSCOBO_DeliveryPoint>();
                while((vs_Line=vs_TextReader.ReadLine())!=null) {
                    vs_SelectedZip="";
                    vs_State=vs_Line.Substring(0, vs_Line.IndexOf(","));
                    vs_Line=vs_Line.Remove(0, vs_Line.IndexOf(",")+1);
                    vs_FirstZip=vs_Line.Substring(0, vs_Line.IndexOf(","));
                    vs_Line=vs_Line.Remove(0, vs_Line.IndexOf(",")+1);
                    vs_SecondZip=vs_Line.Substring(0, vs_Line.IndexOf(","));
                    vs_Line=vs_Line.Remove(0, vs_Line.IndexOf(",")+1);
                    vd_Weight=double.Parse(vs_Line.Remove(0, vs_Line.IndexOf(",")+1));
                    vi_RandomZipSelected=GenerateRandomNumber(1, 2);
                    vs_SelectedZip=(vi_RandomZipSelected==1)?(string.IsNullOrEmpty(vs_FirstZip)?vs_SecondZip:vs_FirstZip):(string.IsNullOrEmpty(vs_SecondZip)?vs_FirstZip:vs_SecondZip);
                    vs_SelectedZip=vs_State+" "+vs_SelectedZip;
                    vo_TemporaryPoint=new CLSCOBO_DeliveryPoint(vs_SelectedZip);
                    vo_TemporaryPoint.Weight=vd_Weight;
                    vl_DeliveryPoints.Add(vo_TemporaryPoint);
                }
                vs_TextReader.Close();
                vi_RandomPoint=GenerateRandomNumber(2, vl_DeliveryPoints.Count-1);
                vi_ChoosenAsOriginPoint=GenerateRandomNumber(0, vi_RandomPoint);
                vo_ConsolidationProblem=new CLSCOBO_ConsolidationProblem();
                vo_OriginPoint=new CLSCOBO_OriginPoint(vl_DeliveryPoints[vi_ChoosenAsOriginPoint].ZipCode);
                vo_ConsolidationProblem.OriginPoint=vo_OriginPoint;
                vl_DeliveryPoints.RemoveAt(vi_ChoosenAsOriginPoint);
                vi_RandomPoint--;
                for(int x=1;x<=vi_RandomPoint;x++) {
                    vi_RandomChoosenPoint=GenerateRandomNumber(0, vl_DeliveryPoints.Count-1);
                    vo_DeliveryPoint=vl_DeliveryPoints[vi_RandomChoosenPoint];
                    vo_ConsolidationProblem.AddDeliveryPoint(vo_DeliveryPoint);
                    vl_DeliveryPoints.RemoveAt(vi_RandomChoosenPoint);
                }
            } catch {
                vo_ConsolidationProblem=null;
            }
            return vo_ConsolidationProblem;
        }
        private string[,] FillInDistancesMatrix(CLSCOBO_ConsolidationProblem po_ConsolidationProblem)
        {
            string z="";
            string[,] vs_PointsDistanceMatrix=new string[po_ConsolidationProblem.Deliveries.Count+2, po_ConsolidationProblem.Deliveries.Count+2];
            vs_PointsDistanceMatrix[0, 0]="*";
            CLSCOBO_BasePoint vo_BasePoint1=null, vo_BasePoint2=null;

            for(int x=-1;x<po_ConsolidationProblem.Deliveries.Count;x++) {
                if(x==-1) {
                    z=po_ConsolidationProblem.OriginPoint.ZipCode;
                    vo_BasePoint1=po_ConsolidationProblem.OriginPoint;
                } else {
                    z=po_ConsolidationProblem.Deliveries[x].ZipCode;
                    vo_BasePoint1=po_ConsolidationProblem.Deliveries[x];
                }
                vs_PointsDistanceMatrix[x+2, 0]=z;
                for(int y=-1;y<po_ConsolidationProblem.Deliveries.Count;y++) {
                    if(y==-1) {
                        z=po_ConsolidationProblem.OriginPoint.ZipCode;
                        vo_BasePoint2=po_ConsolidationProblem.OriginPoint;
                    } else {
                        z=po_ConsolidationProblem.Deliveries[y].ZipCode;
                        vo_BasePoint2=po_ConsolidationProblem.Deliveries[y];
                    }
                    vs_PointsDistanceMatrix[0, y+2]=z;
                    vs_PointsDistanceMatrix[x+2, y+2]=(x==y)?"*":CLSCOBO_ConsolidatorUtils.getDistance(vo_BasePoint1, vo_BasePoint2).ToString();
                }
            }
            return vs_PointsDistanceMatrix;
        }
 private void LoadFileZips(string ps_FileName)
 {
     TextBox vo_TextBox=(TextBox)CLSCOBO_FunctionsRepository.getElement("TxtFileName", ao_WebPage);
     if(ao_GoogleMap==null)
         ao_GoogleMap=(GoogleMap)CLSCOBO_FunctionsRepository.getElement("GoogleMap1", ao_WebPage);
     ao_GoogleMap.Markers.Clear();
     ao_GoogleMap.Polylines.Clear();
     ao_ConsolidationProblem=null;
     ao_ConsolidationProblem=CLSCOBO_FunctionsRepository.ReadFile(ref ps_FileName);
     vo_TextBox.Text=ps_FileName;
     FillInGraphicData();
 }