2011-07-31 7 views
3

의 배수 N 가중치의 모든 순열을 생성한다 :
- 웨이트에 기여한 N 가능한 변수를 소정;
- 모든 가능한 가중치 순열을 만듭니다 (100 % 합계).
- N과 P는 반비례대로 무게,
R : I는 (R)에 함수를 생성 할 필요가 P

분명히 P (보통 1 %)의 배수에서 발생해야하는 제약 조건에 따라 - 즉, 나는 N = 7 지정하고 수 없습니다 P = 0.4. 그러나 정수 솔루션 만 지정할 수 있습니다 (예 : P = 0.01).

죄송합니다. 잘 알려진 문제인 경우 - 저는 수학자가 아니며 제가 아는 용어로 검색했지만 충분히 근접한 것을 찾지 못했습니다.

필자가 작성한 코드를 게시 하겠지만 인상적이거나 통찰력있는 것은 아닙니다.

도움 주셔서 감사합니다.

+0

작은 N 및 P? 나는 당신이 무게의 순열에 의해 의미하는 것을 이해하지 못한다. 가중치에 제약이 없으면 [0,1] 사이의 실수 일 수 있습니다. 그러한 값들의 집합은 무한하다. 또는 "P의 배수"는 정수 배수 여야 함을 의미합니까? – Iterator

+1

응용 프로그램을 설명하는 것도 도움이 될 수 있습니다. 이것은 어떤 제약 조건에 따라 정수 격자에서 모든 점을 찾는 것처럼 들립니다. 표준 배낭 문제로 축소 될 경우 행운을 빈다. – Iterator

+1

어쨌든 코드를 게시하는 것이 좋습니다. –

답변

5

가중치의 순서가 중요하다고 가정하면, 이들은 구성입니다.; 그들이 그렇지 않다면 이들은 파티션입니다. 두 경우 모두, 부품 번호에 따라 제한되며, N은 다음과 같은 코드로 numparts을 사용합니다. 또한 0의 가중치가 허용되는지 여부에 대한 질문이 있습니다.

가중치를 최대 1 개까지 추가하려면 1/p가 정수 여야합니다. 다음 코드에서이 값은 sumparts입니다. 그것은 가중치의 수에 의존하지 않는다. 작곡을 마친 후에는 p로 곱합니다. 즉, 가중치를 얻으려면 n으로 나눕니다.

R은 이러한 구성 또는 제한된 파티션을 생성하기 위해 partitions 패키지를 갖는다. 다음 코드는 자체적으로 설명해야합니다. 행렬의 각 열은 일련의 가중치입니다. 나는 7 개의 가중치를 취하고 p = 0.1 또는 10 %를 허용하고 0의 가중치를 금지합니다. 이것은 84 개의 가능성을 제공합니다. 0의 가중치는 8008 개의 가능성을 의미합니다. p = 0.01 또는 1 %로 0과 1,705,904,746의 가중치없이 1,120,529,256 개의 가능성이 있습니다. 주문이 중요하지 않은 경우 compositions 대신 restrictedparts을 사용하십시오.

> library(partitions) 
> numparts <- 7 # number of weights 
> sumparts <- 10 # reciprocal of p 
> weights <- compositions(n=sumparts, m=numparts, include.zero=FALSE)/sumparts 
> weights 

[1,] 0.4 0.3 0.2 0.1 0.3 0.2 0.1 0.2 0.1 0.1 0.3 0.2 0.1 0.2 0.1 0.1 0.2 0.1 0.1 
[2,] 0.1 0.2 0.3 0.4 0.1 0.2 0.3 0.1 0.2 0.1 0.1 0.2 0.3 0.1 0.2 0.1 0.1 0.2 0.1 
[3,] 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.1 0.1 0.1 0.2 0.2 0.3 0.1 0.1 0.2 
[4,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 
[5,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 
[6,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 
[7,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 

[1,] 0.1 0.3 0.2 0.1 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.3 0.2 0.1 
[2,] 0.1 0.1 0.2 0.3 0.1 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.3 
[3,] 0.1 0.1 0.1 0.1 0.2 0.2 0.3 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.1 
[4,] 0.4 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.3 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 
[5,] 0.1 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.4 0.1 0.1 0.1 
[6,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 
[7,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 

[1,] 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.1 0.3 
[2,] 0.1 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.1 
[3,] 0.2 0.2 0.3 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 
[4,] 0.1 0.1 0.1 0.2 0.2 0.2 0.3 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 
[5,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.3 0.1 0.1 0.1 0.1 0.2 0.1 0.1 
[6,] 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.3 0.3 0.3 0.3 0.3 0.4 0.1 
[7,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 

[1,] 0.2 0.1 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 
[2,] 0.2 0.3 0.1 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 
[3,] 0.1 0.1 0.2 0.2 0.3 0.1 0.1 0.2 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 0.1 
[4,] 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.3 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.2 0.1 
[5,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.3 0.1 0.1 0.1 0.1 0.2 
[6,] 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.2 0.2 
[7,] 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 0.2 

[1,] 0.1 0.2 0.1 0.1 0.1 0.1 0.1 0.1 
[2,] 0.1 0.1 0.2 0.1 0.1 0.1 0.1 0.1 
[3,] 0.1 0.1 0.1 0.2 0.1 0.1 0.1 0.1 
[4,] 0.1 0.1 0.1 0.1 0.2 0.1 0.1 0.1 
[5,] 0.1 0.1 0.1 0.1 0.1 0.2 0.1 0.1 
[6,] 0.3 0.1 0.1 0.1 0.1 0.1 0.2 0.1 
[7,] 0.2 0.3 0.3 0.3 0.3 0.3 0.3 0.4 
+0

안녕하세요 @ 헨리, 완벽하게 작동합니다. 그리고 빨리! 도와 줘서 고마워. –

1

EDIT : 일부 결과가 두 번 나타남에 따라 기능이 업데이트되었습니다.

재귀 계산을 기반으로이 기능을 시험해 볼 수 있습니다. 주문과 상관없이 가능한 모든 조합을 제공합니다. 당신이 그렇지 않으면 가능한 모든 순열을 가진 행의 배수를 얻으므로 나는 이렇게했습니다.

계산은 정수를 기반으로합니다. 최소 가중치 P는 1로 설정되고, Pint는 나눌 수있는 가중 단위 수입니다. max.W는 하나의 변수에 주어질 수있는 최대 단위입니다. 다음

알고리즘 간다 :

  • N = 2 인 경우, 소정의 최소 및 최대의 중량에 대한 모든 가능한 조합을 만든다.

  • N> 2 인 경우 N = 1에서 최대 한도 (최대 중량/N)에 대해이 알고리즘을 적용합니다. 최대 가중치는 현재 최대 가중치 +1에서 N, 최소 가중치 N은 N으로 지정됩니다.

이렇게하면 가능한 모든 정수 조합이 제공됩니다. P를 곱하면 원래의 가중치를 얻을 수 있습니다.

또는 기능에

는 :

myfunc <- function(N,P){ 
    if(100%%(P*100) !=0){ 
    stop("100% cannot be divided in portions of P") 
    } 
    Pint <- 100/(P*100) 
    max.W <- Pint- N + 1 

    combs <- function(n,max.w,min){ 
    mw <- max.w + 1 

    if(n==2){ 

     w <- seq.int(min,floor((mw)/2)) 
     out <- cbind(w,mw-w) 

    } else if (n > 2){ 

     x <- lapply(1:ceiling(max.w/n),function(i){ 

     newcombs <- combs(n-1,mw-i,i) 
     cbind(newcombs,rep(i,nrow(newcombs))) 

     }) 

     out <- do.call("rbind",x) 
    } 
    colnames(out) <-rownames(out) <- NULL 
    out 
    } 
    res <- combs(N,max.W) 
    apply(res,1,sort)*P 
} 

이 행렬의 열의 조합을 제공합니다

> Y <- myfunc(3,0.1) 
> Y 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
[1,] 0.1 0.1 0.1 0.1 0.2 0.2 0.2 0.3 
[2,] 0.1 0.2 0.3 0.4 0.2 0.3 0.4 0.3 
[3,] 0.8 0.7 0.6 0.5 0.6 0.5 0.4 0.4 

가주의 할! (7 변수, 0.01 점프) 테스트 케이스를 사용하면 방대한 양의 가능성을 계산하는 데 오랜 시간이 걸릴 것입니다. N = 7이고 P = 0.04 인 경우 이미 3555 가지 조합을 사용할 수 있습니다. N = 0.2이면 336,443 개의 가능성이 있습니다. 그리고이 조합이 당신이 무엇인지 알고 있다면, 가능한 모든 조합의 조합을 고려해야합니다.

+0

몇 개의 중복 된 항목이 있습니다 : 열 2, 5, 3 & 9, 4 & 12, 7 & 10, 8 & 13 및 11 & 14 – Henry

+0

@Henry : 지금 잡힌 문제를 잡았습니다. 두 번째 통보에서, 당신은 명백하게 이미 아주 쉬운 접근 방식을 사용하여 문제를 해결했습니다. 글쎄, 나는 이것으로 놀고 재미있게 지냈다. 재귀를 가지고 노는 것은 항상 재미 있습니다 :-) –