2013-08-20 1 views
1

다음 해결할 문제가 있습니다.포트폴리오 최적화 효율적인 솔루션 정렬 C#

H를 포트폴리오 집합이라고합시다. 각 포트폴리오에 대해 iH(ri,vi)을이 솔루션의 (return,risk) 값으로 지정하십시오. Hi 들어

Hj에 존재하는 경우와 rj>=rivj<=vi 다음 Hi로부터 삭제되도록 (ji는 다르다). ij이 (더 적은 위험에 대해 더 나은 수익을 가져다줍니다.)

마지막으로 H은 undominated 효율적인 솔루션 세트입니다.

내가 LINQ를 사용하여 위의 문제를 해결하기 위해 노력 :

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

그러나 더 효율적인 방법이 존재하는 경우 H.Count() 10 개 수천의 순서 인 경우, 다음이 시간이 많이 걸리기 때문에 나는 궁금 지배적 인 포트폴리오를 제거합니다.

미리 도움을 청하십시오!

Christos

+0

나는 j와 vi 사이 어딘가에있다. 문제를 나타내는 약어없이 코드를 게시 할 수 있습니까? –

+0

H는 포트폴리오 클래스 목록입니다. 각 포트폴리오는 자산이 [0,1]의 숫자 인 가중치 w를 갖는 자산으로 구성됩니다. 모든 가중치는 1로 합계됩니다. 포트폴리오 클래스의 두 가지 방법을 사용하여 위험을 예상하고 수익을 산출 할 수 있습니다. 따라서 각 포트폴리오에는 한 쌍의 (수익, 위험) 쌍이 있습니다. 내가 해결하고자하는 문제는 지배력이없는 포트폴리오 목록의 모든 포트폴리오를 찾는 것입니다. 지배적 인 포트폴리오의 개념을 이해하려면 위의 약어를 소개해야합니다. – Christos

+0

위의 내용에 대한 추가 설명이 필요한 경우 알려 주시기 바랍니다. 다시 감사합니다. Milen. – Christos

답변

0

먼저 위험 관리/보상에 캐싱해야합니다. 나는 당신이 당신의 코드 샘플을 가지고 있는지 말할 수 없다. 그러나 당신이 그렇지 않다면 당신은 먼저 목록을 변형 할 필요가있다.

일단 그렇게하면 위험에 따라 목록을 정렬하는 것이 좋습니다. 위험을 증가 시키면 확인해야 할 것은 보상이 현재까지 보아온 최고의 보상보다 엄격히 큰 것입니다. 그렇지 않은 경우 제거 할 수 있습니다. 그러면 성능이 크게 향상됩니다.

불행하게도, 나는이 순간에 순수 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); 
+0

Andrew가 도와 주셔서 감사합니다! 예상대로 작동합니다. 알고리즘의 복잡도는 O (orderedH.Count())이며 목록의 크기에 선형입니다. 불행히도 linq를 사용하면 복잡성은 목록의 크기에 비해 2 차적입니다. 다시 한 번 감사드립니다! – Christos

+0

@Christos : O (H ln H)와 같을 것입니다. 먼저 정렬해야하기 때문에 ...하지만 여전히 O (H^2)보다 좋습니다! –

+0

앤드류, 너 피 묻은거야! 불행하게도, 알고리즘을 보았을 때의 나의 열정은 나를 틀리게 만들었습니다. 귀하의 통지 주셔서 감사합니다! – Christos