(对音乐爱好者的警告:这个问题涉及欧洲歌唱大赛)
欧洲歌唱大赛是欧洲的热门赛事。对于那些不熟悉这个概念的人来说,这基本上是一场比赛,每个参赛国表演一首歌,然后为其他国家投票。每个国家可以给其他 10 名参赛者积分,他们最喜欢的歌曲给 12 分,第二喜欢的歌曲给 10 分,然后 8 降到 1。换句话说,一个国家给其他 10 个国家打分。
我正在尝试编写一个算法来分析多年来的选票,并检测“投票集团”,即倾向于相互投票的国家。
我使用这两种类型来存储积分:
TPoints = record
FromCountry : string; //ID of the country
ToCountry : string;
Year : integer;
Semifinale : boolean;
Amount : integer; //1-8,10,12 for years 1975-present, other values for year 1957-1974
end;
TAllPoints = class(TList<TPoints>)
//Methods i _think_ I need:
function Sum(aFrom,aTo : string; aFromYear : integer = 0; aToYear : integer = 0) : integer;
function BlocScore(aCountries: array of string; aFromYear : integer = 0; aToYear : integer = 0) : double;
end;
有两个问题我需要回答。
我应该如何计算 BlocScore?我需要一种衡量一组国家“友好”程度的好方法。对于我的初步测试,我使用了 (组内国家之间授予的积分总和)/(我希望测量的期间的年数 * 国家数)。这听起来合理吗?当我测试在 ESC 环境中传统上被视为“友好”的国家时,它似乎给了他们很高的 BlocScore,但我不相信它是完美的。
考虑到一个集团可以是任意数量的国家,我如何遍历潜在的集团。例如,我可以将自己限制在 2 到 10 个国家/地区的集团,但我想要一个通用算法来检测任何规模的集团。据我统计,这些年来有 57 个国家参加了 ESC,即使我将自己限制为每个集团最多 10 个国家,也就是超过 430 亿个集团。
是否有针对此特定目的的算法?还是有一些通用的算法可以适应?我试过用谷歌搜索它,但我只找到投票集团的定义,而不是如何检测它们。