Ejemplo n.º 1
0
        /// <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);
            });
        }
Ejemplo n.º 2
0
 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)];
     }
     ;
 }
Ejemplo n.º 3
0
        /// <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);
                    }
                }
            });
        }
Ejemplo n.º 4
0
        /// <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)];
            }
        }
Ejemplo n.º 5
0
        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;
                });
            });
        }