//--------------------------------------------------------------------- /// <summary> /// Compares two stand rankings such that the higher ranking comes /// before the lower ranking. /// </summary> public static int CompareRankings(StandRanking x, StandRanking y) { if (x.Rank > y.Rank) { return(-1); } else if (x.Rank < y.Rank) { return(1); } else { return(0); } }
//--------------------------------------------------------------------- /// <summary> /// Adds a stand's unharvested neighbors and their rankings to a /// sorted list of stand rankings. /// </summary> /// <remarks> /// The stand rankings are in highest to lowest order. A neighbor is /// only added to the list if its rank is > 0 and it isn't already in /// the list. /// </remarks> public void AddUnharvestedNeighbors(Stand stand, List <StandRanking> neighborRankings) { foreach (Stand neighbor in stand.Neighbors) { if (!neighbor.Harvested) { bool inList = false; foreach (StandRanking ranking in neighborRankings) { if (ranking.Stand == neighbor) { inList = true; break; } } if (inList) { continue; } StandRanking neighborRanking = GetRanking(neighbor); if (neighborRanking.Rank <= 0) { continue; } int i; for (i = 0; i < neighborRankings.Count; i++) { if (neighborRankings[i].Rank < neighborRanking.Rank) { break; } } //Model.Core.UI.WriteLine(" place={0}, rank={1}.", i, neighborRanking.Rank); neighborRankings.Insert(i, neighborRanking); } } }
//--------------------------------------------------------------------- void IStandRankingMethod.RankStands(List<Stand> stands, StandRanking[] rankings) { InitializeForRanking(stands, stands.Count); for (int i = 0; i < stands.Count; i++) { Stand stand = stands[i]; double rank = 0; if (! stand.IsSetAside) { //check if stand meets all the ranking requirements bool meetsAllRequirements = true; foreach (IRequirement requirement in requirements) { if (! requirement.MetBy(stand)) { meetsAllRequirements = false; //set stand rank to 0 rankings[i].Rank = 0; break; } } //if the stand meets all the requirements and is not set-aside,, get its rank if (meetsAllRequirements) { rank = ComputeRank(stand, i); } //otherwise, rank it 0 (so it will not be harvested.) else { rank = 0; //Model.Core.UI.WriteLine(" Stand {0} did not meet its requirements.", stand.MapCode); } } else { rankings[i].Rank = 0; } rankings[i].Stand = stand; rankings[i].Rank = rank; //assign rank to stand //Model.Core.UI.WriteLine(" Stand {0} rank = {1}.", rankings[i].Stand.MapCode, rankings[i].Rank); } }
//--------------------------------------------------------------------- /// <summary> /// Compares two stand rankings such that the higher ranking comes /// before the lower ranking. /// </summary> public static int CompareRankings(StandRanking x, StandRanking y) { if (x.Rank > y.Rank) return -1; else if (x.Rank < y.Rank) return 1; else return 0; }
//-------------------------------------------------------------- // For the starting stand do partial stand spreading until either // we run out of stands or we have our target area private bool SpreadFromStand(Stand startingStand) { List <Stand> standsConsidered = new List <Stand>(); // a list of every stand we have thought about considering // used to prevent considering a stand more than once List <Stand> standsToConsiderAll = new List <Stand>(); List <StandRanking> standsToConsiderRankings = new List <StandRanking>(); bool rtrnVal = false; Stand crntStand; double crntRank; ActiveSite startingSite;// = null; // If we have a valid starting stand, put it on the list to // consider if (startingStand != null && !startingStand.IsSetAside) { standsToConsiderRankings.Insert(0, GetRanking(startingStand)); standsToConsiderAll.Add(startingStand); } while (standsToConsiderRankings.Count > 0 && standsToConsiderRankings[0].Rank > 0 && areaSelected < maxTargetSize) { // Get the stand to work with for this loop iteration crntStand = standsToConsiderRankings[0].Stand; crntRank = standsToConsiderRankings[0].Rank; standsToConsiderRankings.RemoveAt(0); // If the stand is not set aside, Get the starting site if (!crntStand.IsSetAside) { // first stand starts at a random site, subsequent // stands start at an adjoining site if (standsConsidered.Count == 0) { startingSite = crntStand.GetRandomActiveSite; } else { startingSite = GetNeighboringSite(standsConsidered, crntStand); if (startingSite == false) { standsToReject.Add(crntStand); continue; } } } else { // if the stand is set aside, it doesn't get processed // and its neighbors don't go on the stand list standsToReject.Add(crntStand); continue; } // Enqueue the eligible sites and put the stand // on the appropriate queue(s) if (EnqueueEligibleSites(startingSite, crntStand)) { standsToHarvest.Enqueue(crntStand); standsToHarvestRankings.Enqueue(crntRank); } else { standsToReject.Add(crntStand); } standsConsidered.Add(crntStand); if (areaSelected < maxTargetSize) { // Get the neighbors and put them on the // standsToConsider queue foreach (Stand neighbor in crntStand.Neighbors) { if (!standsConsidered.Contains(neighbor) && !standsToConsiderAll.Contains(neighbor) && !neighbor.Harvested) { StandRanking neighborRanking = GetRanking(neighbor); standsToConsiderAll.Add(neighbor); if (neighborRanking.Rank <= 0) { continue; } int i; for (i = 0; i < standsToConsiderRankings.Count; i++) { if (standsToConsiderRankings[i].Rank < neighborRanking.Rank) { break; } } standsToConsiderRankings.Insert(i, neighborRanking); } } } } // If we found enough to meet our goal, return true, // otherwise return the default of false. if (areaSelected >= minTargetSize) { rtrnVal = true; } return(rtrnVal); }
} // IEnumerator<ActiveSite> IEnumerable<ActiveSite>.GetEnumerator() //--------------------------------------------------------------------- // For the starting stand do partial stand spreading until either // we run out of stands or we have our target area private bool SpreadFromStand(Stand startingStand) { List <Stand> standsConsidered = new List <Stand>(); // a list of every stand we have thought about considering // used to prevent considering a stand more than once List <Stand> standsToConsiderAll = new List <Stand>(); List <StandRanking> standsToConsiderRankings = new List <StandRanking>(); bool rtrnVal = false; Stand crntStand; double crntRank; // If we have a valid starting stand, put it on the list to // consider if (startingStand != null && !startingStand.IsSetAside) { standsToConsiderRankings.Insert(0, GetRanking(startingStand)); standsToConsiderAll.Add(startingStand); } // Miranda and Scheller testing methods to make repeat harvest work with stand spreading. //if (startingStand != null && startingStand.IsSetAside) // if( startingStand.LastPrescription. // //if (startingStand.LastPrescription.SiteSelectionMethod.ToString() == "Landis.Harvest.CompleteStandSpreading") // { // standsToConsiderRankings.Insert(0, GetRanking(startingStand)); // standsToConsiderAll.Add(startingStand); // return true; // } while (standsToConsiderRankings.Count > 0 && standsToConsiderRankings[0].Rank > 0 && areaSelected < maxTargetSize) { // Get the stand to work with for this loop iteration crntStand = standsToConsiderRankings[0].Stand; crntRank = standsToConsiderRankings[0].Rank; standsToConsiderRankings.RemoveAt(0); // If the stand is set aside, it doesn't get processed if (crntStand.IsSetAside) { continue; } // Enqueue the eligible sites and put the stand // on the appropriate queue(s) if (EnqueueEligibleSites(crntStand)) { standsToHarvest.Enqueue(crntStand); standsToHarvestRankings.Enqueue(crntRank); } else { standsToReject.Add(crntStand); } standsConsidered.Add(crntStand); if (areaSelected < maxTargetSize) { // Get the neighbors and put them on the // standsToConsider queue foreach (Stand neighbor in crntStand.Neighbors) { if (!standsConsidered.Contains(neighbor) && !standsToConsiderAll.Contains(neighbor) && !neighbor.Harvested) { StandRanking neighborRanking = GetRanking(neighbor); standsToConsiderAll.Add(neighbor); if (neighborRanking.Rank <= 0) { continue; } int i; for (i = 0; i < standsToConsiderRankings.Count; i++) { if (standsToConsiderRankings[i].Rank < neighborRanking.Rank) { break; } } standsToConsiderRankings.Insert(i, neighborRanking); } // if(!standsConsidered.Contains(neighbor) } // foreach (Stand neighbor in crntStand.Neighbors) } // if(areaSelected >= maxTargetSize) } // while (standsToConsider.Count > 0 && .. // If we found enough to meet our goal, return true, // otherwise return the default of false. if (areaSelected >= minTargetSize) { rtrnVal = true; } return(rtrnVal); } // private bool spreadFromStand() {