Function sp_npos_elections::balancing::balance
source · pub fn balance<AccountId: IdentifierT>(
voters: &mut Vec<Voter<AccountId>>,
config: &BalancingConfig
) -> usize
Expand description
Balance the weight distribution of a given voters
at most iterations
times, or up until the
point where the biggest difference created per iteration of all stakes is tolerance
. If this
is called with tolerance = 0
, then exactly iterations
rounds will be executed, except if no
change has been made (difference = 0
). tolerance
and iterations
are part of the
BalancingConfig
struct.
In almost all cases, a balanced solution will have a better score than an unbalanced solution,
yet this is not 100% guaranteed because the first element of a crate::ElectionScore
does not
directly relate to balancing.
Note that some reference implementation adopt an approach in which voters are balanced randomly per round. To advocate determinism, we don’t do this. In each round, all voters are exactly balanced once, in the same order.
Also, note that due to re-distribution of weights, the outcome of this function might contain
edges with weight zero. The call site should filter such weight if desirable. Moreover, the
outcome might need balance re-normalization, see Voter::try_normalize
.
References
- A new approach to the maximum flow problem.
- Validator election in nominated proof-of-stake (Appendix A.)
- Computing a balanced solution, which contains the details of the algorithm implementation.