22 package org.matsim.core.scoring;
25 import org.apache.logging.log4j.LogManager;
26 import org.apache.logging.log4j.Logger;
33 import jakarta.inject.Inject;
34 import java.util.HashMap;
37 class NewScoreAssignerImpl
implements NewScoreAssigner {
39 static private final Logger log = LogManager.getLogger(NewScoreAssignerImpl.class);
41 private Map<Plan,Integer> msaContributions =
new HashMap<>() ;
42 private Integer scoreMSAstartsAtIteration;
43 private final double learningRate;
44 private final boolean explainScores;
45 private double scoreSum = 0.0;
46 private long scoreCount = 0;
49 NewScoreAssignerImpl(ScoringConfigGroup scoringConfigGroup, ControllerConfigGroup controllerConfigGroup) {
50 if (scoringConfigGroup.getFractionOfIterationsToStartScoreMSA()!=null ) {
51 final int diff = controllerConfigGroup.getLastIteration() - controllerConfigGroup.getFirstIteration();
52 this.scoreMSAstartsAtIteration = (int) (diff
53 * scoringConfigGroup.getFractionOfIterationsToStartScoreMSA() + controllerConfigGroup.getFirstIteration());
56 explainScores = scoringConfigGroup.isWriteScoreExplanations();
59 public void assignNewScores(
int iteration, ScoringFunctionsForPopulation scoringFunctionsForPopulation, Population population) {
60 log.info(
"it: " + iteration +
" msaStart: " + this.scoreMSAstartsAtIteration );
62 StringBuilder explanation =
new StringBuilder();
64 for (Person person : population.getPersons().values()) {
65 ScoringFunction sf = scoringFunctionsForPopulation.getScoringFunctionForAgent(person.getId());
66 double score = sf.getScore();
67 Plan plan = person.getSelectedPlan();
68 Double oldScore = plan.getScore();
71 explanation.setLength(0);
72 sf.explainScore(explanation);
73 plan.getAttributes().putAttribute(ScoringFunction.SCORE_EXPLANATION_ATTR, explanation.toString());
76 if (oldScore == null) {
78 if ( plan.getScore().isNaN() ) {
79 log.warn(
"score is NaN; plan:" + plan.toString() );
82 if ( this.scoreMSAstartsAtIteration == null || iteration < this.scoreMSAstartsAtIteration ) {
83 final double newScore = this.learningRate * score + (1 - this.learningRate) * oldScore;
84 if ( log.isTraceEnabled() ) {
85 log.trace(
" lrn: " + this.learningRate +
" oldScore: " + oldScore +
" simScore: " + score +
" newScore: " + newScore );
87 plan.setScore(newScore);
88 if ( plan.getScore().isNaN() ) {
89 log.warn(
"score is NaN; plan:" + plan.toString()+
" with lrn: " + this.learningRate +
" oldScore: " + oldScore +
" simScore: " + score +
" newScore: " + newScore );
98 Integer msaContribs = this.msaContributions.get(plan) ;
99 if ( msaContribs==null ) {
102 this.msaContributions.put(plan,msaContribs+1) ;
103 double alpha = 1./(msaContribs+1) ;
105 final double newScore = alpha * score + (1.-alpha) * oldScore;
106 if ( log.isTraceEnabled() ) {
107 log.trace(
" alpha: " + alpha +
" oldScore: " + oldScore +
" simScore: " + score +
" newScore: " + newScore );
109 plan.setScore( newScore ) ;
110 if ( plan.getScore().isNaN() ) {
111 log.warn(
"score is NaN; plan:" + plan.toString() );
131 this.scoreSum += score;