1

我有以下问题要解决:

设 H 是一组投资组合。对于其中的每个投资组合iH让作为此解决方案(ri,vi)(return,risk)值。

对于每个iinH如果存在jin H( jis different from i) 这样rj>=ri然后从中vj<=vi删除。因为被支配(它有更好的回报,风险更小)。iHij

最后H将是一套不受约束的有效解决方案。

我尝试使用 linq 解决上述问题:

 H.RemoveAll(x => H.Any(y => x.CalculateReturn() <= y.CalculateReturn() && x.CalculateRisk() >= y.CalculateRisk() && x != y));

但是我想知道是否存在更有效的方法,因为如果H.Count()是一万量级,那么需要花费大量时间来移除占主导地位的投资组合。

提前感谢您的帮助!

克里斯托斯

4

1 回答 1

1

首先,您应该缓存风险/回报。我无法判断您是否通过您的代码示例,但如果不是,您需要先转换列表。

完成此操作后,根据风险对列表进行排序是有意义的。那么,当你增加风险时,你所要做的就是检查你的回报是否严格高于你迄今为止看到的最佳回报。如果不是,您可以将其删除。这应该会显着提高性能。

不幸的是,我目前还没有足够聪明地想出一种使用纯 LINQ 来做到这一点的方法,但是这个代码段应该可以工作:

(免责声明:我尚未编译/测试)

var orderedH = (
  from h in H
  let reward = h.CalculatedReward()
  let risk = h.CalculatedRisk()
  orderby risk ascending
  select new {
    Original = h,
    Risk = risk,
    Reward = reward
}).ToList();

var maxReward = Double.NegativeInfinity;
for (int i = 0; i < orderedH.Count; i++)
{
  if (orderedH[i].Reward <= maxReward) {
    orderedH.RemoveAt(i--);
  }
  else {
    maxReward = orderedH[i].Reward;
  }
}

var filteredPortfolio = orderedH.Select(h => h.Original);
于 2013-08-20T18:18:27.293 回答