2016-09-02 2 views
-2

"순열 (permutation)"이 정확히 맞는 단어인지는 모르겠지만 시나리오는 제가 List ~ 40 Objects입니다. 각각 다른 Objectvaluecost이 다릅니다.개체의 순열에 대한 최저 비용 찾기; 메모리 문제를 극복하는 방법?

내 개체에 1과 5 사이의 value이 포함되어 있다고 가정 해보십시오. 일부 targetValue을 초과하는 개체 목록을 결합하려고 시도하고 가장 낮은 합계 인 cost의 조합을 찾아 반환합니다. 이 조합에는 잠재적으로 List에있는 개체 중 하나의 복제본이 많이 포함될 수 있습니다.

예를 들어, 내 개체 목록이 {a, b, c, d} 인 경우; 이 {a, a, a, a, a, a, a, a}가 될 수 있습니다. 그러나 주문도과 관련이 있습니다. {a, a, b}는 (a, b, a)와 다른 합계를 가질 수 있습니다.

현재 솔루션을 무력화하려고했습니다. 그러나, 40! 조합, 나는 모든 다른 "순열"을 추적하면서 기억이 부족합니다.

정확도를 위해 모든 조합을 실행하는 것이 더 좋지만 계산을 수행하는 데 시간이 많이 걸리지는 않지만 이전에 말씀 드린 것처럼 가장 큰 문제는 메모리입니다.

현재 코드 : (incompleteList가 처음으로 시작 개체)

while (incompleteList.size() > 0) 
{ 
    Container container = incompleteList.get(0); 
    for (myObject o : objectList) 
    { 
     Container newAdditionContainer = new Container(container);//copies the list of objects into a new container 
     newAdditionContainer.addMyObject(o); 
     if (newAdditionContainer.getTotalValue()) < targetValue) 
     { 
      incompleteList.add(newAdditionContainer); 
     } else { 
      completeList.add(newAdditionContainer); 
     } 
    } 
    incompleteList.remove(container); 
} //code then loops through completeList and grabs the container with the cheapest cost, 
//but in actuality that code hasn't been able to run yet. 

나는 확신 위 일할 수있는, 그것은 완료 할 수 있다면 (하지만 캔트 때문에 메모리); 알고리즘을 변경하여 최저 비용을 얻고 메모리 한도를 유지하려면 어떻게해야합니까?

+0

성숙 제출에 대한 사과; 나는 downvote가 무엇을 위해 thats라고 생각한다? – DoubleDouble

+0

나는 그 일이 아주 분명하지 않다고 생각한다.주문이 중요 할 때 총 '비용'과 '가치'는 어떻게 계산됩니까? 각각의 객체가 'cost'와 'value'를 갖도록 지정하면'List'는'List '입니다. 이'Objects'를 표현하기 위해'인터페이스 '를 발명 할 수있는 것처럼 보입니다. (btw, 나는 downvote하지 않았습니다.) – garnulf

+0

사과를합니다. 계산에 포함되는 방정식이 문제의 범위를 벗어나서 문제를 복잡하게 만든다고 생각합니다. 'Container' 클래스는 포함 된 Object의 값을 계산할 수 있으며'cost'는 모든 객체간에 간단히 추가되지만 런타임까지 알 수 없습니다. – DoubleDouble

답변

2

ListObject s 및 원하는 permutation length으로 초기화되는 PermIterator을 빌드하십시오. IterateIteratorlength으로 시작하여 완료 될 때까지 iteration이 같은 length 모두 permutations이 원하는 value을 초과 할 때까지 1입니다. 실제 값인 permutation과 현재 값인 permutation 만 항상 저장하고 permutation length에 관계없이 원하는 값을 초과하고 최저 비용을 유지합니다. 이 방법을 사용하면 permutations을 모두 List에 저장하는 것을 피할 수 있습니다. 분명히 40 Object과 함께 이것은 꽤 오래 걸릴 수 있습니다.

1

가능한 모든 데이터를로드하기 전에 메모리가 부족한 경우가 많습니다. 큰 파일을 읽을 때도 마찬가지입니다.

간단한 해결책은 모든 값이 저장되어있는 경우 모든 값을 저장하는 것이 아니라 저장 한 값을 처리하는 것입니다.

새로운 순열을 만들 때마다 전화하는 콜백 또는 람다를 사용하는 것이 좋습니다. 이렇게하면 저장하지 않아도됩니다.

40 노트! 순열 시간이 다 떨어지기 쉽습니다. 초당 1 초에 2.5e34 년이 걸릴 것입니다. 행성이 떠난 지 오래입니다.

관련 문제