/// <summary> /// Executes at iteration start before any cognitive process is started. /// </summary> /// <param name="iteration"></param> protected override void PreIterationCalculations(int iteration) { // Call default implementation. base.PreIterationCalculations(iteration); _algorithmModel.NewDecisionOptions = new List <NewDecisionOptionModel>(); var fmAgents = agentList.GetAgentsWithPrefix("FM"); fmAgents.ForEach(fm => { var manageAreas = _activeAreas.Where(a => a.AssignedAgents.Contains(fm.Id)).ToArray(); if (iteration == 1) { fm[AlgorithmVariables.ManageAreaHarvested] = 0.0; } else { fm[AlgorithmVariables.ManageAreaHarvested] = manageAreas.Select( area => _algorithmModel.HarvestResults .ManagementAreaHarvested[HarvestResults.GetKey(_sheMode, fm, area)]).Average(); } fm[AlgorithmVariables.ManageAreaMaturityPercent] = manageAreas.Select( area => _algorithmModel.HarvestResults .ManagementAreaMaturityPercent[HarvestResults.GetKey(_sheMode, fm, area)]).Average(); fm[AlgorithmVariables.ManageAreaBiomass] = manageAreas.Select( area => _algorithmModel.HarvestResults .ManagementAreaBiomass[HarvestResults.GetKey(_sheMode, fm, area)]).Sum(); UpdateSpeciesBiomassAgentVariables(fm, "Current", _currentSpeciesBiomass); }); }
protected override void BeforeCounterfactualThinking(IAgent agent, IDataSet dataSet) { base.BeforeCounterfactualThinking(agent, dataSet); if (agent.Archetype.NamePrefix == "FM") { agent[AlgorithmVariables.ManageAreaBiomass] = _algorithmModel.HarvestResults .ManagementAreaBiomass[HarvestResults.GetKey(_sheMode, agent, dataSet)]; } ; }
/// <summary> /// Executes after PostIterationCalculations. Collects output data. /// </summary> /// <param name="iteration"></param> protected override void PostIterationStatistic(int iteration) { base.PostIterationStatistic(iteration); try { var settings = new JsonSerializerSettings() { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }; var data = JsonConvert.SerializeObject(iterations.Last.Value, settings); File.WriteAllText($"output_SOSIEL_Harvest_DUMP_{iteration}.json", data); } catch (Exception) { } // Save statistics for each agent agentList.ActiveAgents.ForEach(agent => { var agentState = iterations.Last.Value[agent]; if (agent.Archetype.NamePrefix == "FM") { foreach (var area in agentState.DecisionOptionHistories.Keys) { // Save activation rule stat var key = HarvestResults.GetKey(_sheMode, agent, area); var activatedDOs = agentState.DecisionOptionHistories[area] .Activated.Distinct().OrderBy(r => r.Name).ToArray(); var matchedDOs = agentState.DecisionOptionHistories[area] .Matched.Distinct().OrderBy(r => r.Name).ToArray(); var activatedDOIds = activatedDOs.Select(r => r.Name).ToArray(); var matchedDOIds = matchedDOs.Select(r => r.Name).ToArray(); var usage = new FMDOUsageOutput() { Iteration = iteration, ManagementArea = area.Name, ActivatedDOValues = activatedDOs.Select( r => string.IsNullOrEmpty(r.Consequent.VariableValue) ? (string)r.Consequent.Value.ToString() : (string)agent[r.Consequent.VariableValue].ToString()).ToArray(), ActivatedDO = activatedDOIds, MatchedDO = matchedDOIds, MostImportantGoal = agentState.RankedGoals.First().Name, TotalNumberOfDO = agent.AssignedDecisionOptions.Count, BiomassHarvested = _algorithmModel.HarvestResults.ManagementAreaHarvested[key], ManageAreaMaturityPercent = _algorithmModel.HarvestResults.ManagementAreaMaturityPercent[key], Biomass = _algorithmModel.HarvestResults.ManagementAreaBiomass[key] }; CSVHelper.AppendTo(string.Format("output_SOSIEL_Harvest_{0}.csv", agent.Id), usage); } } }); }
/// <summary> /// Executes before action selection process. /// </summary> /// <param name="agent"></param> /// <param name="dataSet"></param> protected override void BeforeActionSelection(IAgent agent, IDataSet dataSet) { // Call default implementation. base.BeforeActionSelection(agent, dataSet); // If agent is FE, set to local variables current site biomass. if (agent.Archetype.NamePrefix == "FM") { // Set value of current area manage biomass to agent variable. agent[AlgorithmVariables.ManageAreaBiomass] = _algorithmModel.HarvestResults .ManagementAreaBiomass[HarvestResults.GetKey(_sheMode, agent, dataSet)]; } }
protected override void PostIterationCalculations(int iteration) { var iterationState = iterations.Last.Value; var fmAgents = agentList.GetAgentsWithPrefix("FM"); var iterationSelection = new Dictionary <string, List <string> >(); foreach (var fmAgent in fmAgents) { var decisionOptionHistories = iterationState[fmAgent].DecisionOptionHistories; foreach (var area in decisionOptionHistories.Keys) { if (!iterationSelection.TryGetValue( HarvestResults.GetKey(_sheMode, fmAgent, area), out List <string> areaList)) { areaList = new List <string>(); iterationSelection.Add(HarvestResults.GetKey(_sheMode, fmAgent, area), areaList); } // Not sure what to do with 2 or more similar DO from different agents areaList.AddRange(decisionOptionHistories[area].Activated.Select(d => d.Name)); } } _algorithmModel.SelectedDecisions = iterationSelection; base.PostIterationCalculations(iteration); // Update income and expense var hmAgents = agentList.GetAgentsWithPrefix("HM"); hmAgents.GroupBy(agent => agent[SosielVariables.Household]) .ForEach(householdAgents => { var householdIncome = householdAgents.Sum(agent => (double)agent[AlgorithmVariables.AgentIncome]); var householdExpenses = householdAgents.Sum( agent => (double)agent[AlgorithmVariables.AgentExpenses]); var iterationHouseholdSavings = householdIncome - householdExpenses; var householdSavings = householdAgents .Where(agent => agent.ContainsVariable(AlgorithmVariables.HouseholdSavings)) .Select(agent => (double)agent[AlgorithmVariables.HouseholdSavings]) .FirstOrDefault() + iterationHouseholdSavings; householdAgents.ForEach(agent => { agent[AlgorithmVariables.HouseholdIncome] = householdIncome; agent[AlgorithmVariables.HouseholdExpenses] = householdExpenses; agent[AlgorithmVariables.HouseholdSavings] = householdSavings; }); }); }