1+ #include " ./solarfield_opt.h"
2+ #include " ./solarfield_avail.h"
3+ #include < iostream>
4+
5+ void solarfield_opt::initialize ()
6+ {
7+ m_sfa.initialize ();
8+ }
9+
10+ double solarfield_opt::calculate_rev_loss ()
11+ {
12+ double ann_revenue = m_sfa.m_settings .sum_performance * m_settings.price_per_kwh * m_settings.system_efficiency ;
13+ double factor = 1.0 ;
14+ double rev_loss = 0 .;
15+ for (size_t t = 0 ; t < m_sfa.m_settings .n_years ; t++)
16+ {
17+ rev_loss += ann_revenue * factor * (1 -m_sfa.m_results .yearly_avg_avail [t]);
18+ factor *= (1.0 - m_settings.revenue_discount_rate );
19+ }
20+ return rev_loss;
21+ }
22+
23+ double solarfield_opt::calculate_labor_cost ()
24+ {
25+ double ann_cost = 52 * m_sfa.m_settings .max_hours_per_week * m_settings.hourly_cost_per_staff * m_sfa.m_settings .n_om_staff ;
26+ double total_cost = 0 .;
27+ for (size_t t = 0 ; t < m_sfa.m_settings .n_years ; t++)
28+ {
29+ total_cost += ann_cost;
30+ ann_cost *= (1.0 - m_settings.labor_discount_rate );
31+ }
32+ return total_cost;
33+ }
34+
35+ double solarfield_opt::calculate_repair_cost ()
36+ {
37+ double factor = 1.0 ;
38+ double total_cost = 0 .;
39+ for (size_t t = 0 ; t < m_sfa.m_settings .n_years ; t++)
40+ {
41+ total_cost += factor * m_sfa.m_results .repair_cost_per_year [t];
42+ factor *= (1.0 - m_settings.repair_discount_rate );
43+ }
44+ return total_cost;
45+ }
46+
47+ void solarfield_opt::optimize_staff (bool (*callback)(float prg, const char *msg), std::string *results_file_name)
48+ {
49+ WELLFiveTwelve gen (0 );
50+ gen.assignStates (m_sfa.m_settings .seed % 100 );
51+ m_sfa.assign_generator (gen);
52+ double total_cost;
53+ double best_cost = INFINITY;
54+ m_sfa.m_settings .n_om_staff = 1 ;
55+ while (m_sfa.m_settings .n_om_staff <= m_settings.max_num_staff )
56+ {
57+ gen.assignStates (m_sfa.m_settings .seed % 100 );
58+ m_sfa.initialize ();
59+ m_sfa.simulate ();
60+ total_cost = calculate_rev_loss () + calculate_labor_cost () + calculate_repair_cost ();
61+ std::cerr << " num staff: " << m_sfa.m_settings .n_om_staff << " \n " ;
62+ std::cerr << " avg_avail: " << m_sfa.m_results .avg_avail << " \n " ;
63+ std::cerr << " total_cost: " << total_cost << " \n " ;
64+ if (total_cost > best_cost)
65+ break ;
66+ best_cost = total_cost;
67+ m_results = m_sfa.m_results ;
68+ m_sfa.m_settings .n_om_staff ++;
69+ }
70+ m_sfa.m_settings .n_om_staff --;
71+ std::cerr << " final cost: " << best_cost << " \n " ;
72+ std::cerr << " optimal # of ft staff: " << m_sfa.m_settings .n_om_staff << " \n " ;
73+ std::cerr << " avg_avail: " << m_results.avg_avail << " \n " ;
74+
75+ }
0 commit comments