2017-10-18 5 views
7

보강 철근 및 구멍이있는 콘크리트 슬래브 요소의 추종 표현을 고려하십시오.형상 내부에 선을 분산시키기위한 최적화 알고리즘 선택

Concrete slab with rebars and holes

는 I 자동 다른 구멍 임의의 형상 위에 선을 분배하는 알고리즘이 필요하다.

주요 제약은 :

  1. 라인
  2. 개의 병렬 라인들 사이의 거리가 가변 D
  3. 라인에있는 초과 할 수있는 영역의 외부 또는 구멍 안에있을 수 없다 고정 간격 I, 즉 y mod I = 0에 배치 할 수 있습니다. 여기서 y은 라인의 Y 좌표입니다. 도형의 내부
  4. 가능한 각 포인트 I 선 N의 총 수를 최소화함으로써, 용액을 최적화 할 D/2

보다 라인에서 추가 될 수 없다. 어떤 종류의 최적화 알고리즘이이 문제에 적합합니까?

대부분의 접근 방식은 픽셀 높이가 인 I 인 래스터로 모양을 단순화하고 각 픽셀을 사용 또는 사용 중지한다고 가정합니다. 나는 이것이 명백한 LP 문제라고 생각하고 GLPK로 설정하려고 시도했지만 임의의 수의 라인에 대해이 단순화 된 래스터를 사용하여 문제를 설명하기가 매우 어려웠습니다. 나는 또한 솔루션 공간이 너무 클 것으로 의심한다.

저는 이미 C#에서 작업을 수행하지만 매우 최적화되지 않은 알고리즘을 구현했습니다.

  1. 계정에 다른 막대와 장애물 가능한 라인 길이와 거리를 취 복잡한 공식을 사용하여 각 셀에 대한 점수를 계산 형상
  2. 의 단순화 된 래스터를 만들기 : 이것은 작동하는 방법이다.
  3. 보강을 필요로하는 결정 (단, Y 방향>D 무료 세포의 수)
  4. 보강을 필요로하는 가장 높은 점수를 가진 셀을 선택하고, 가능한 멀리 -x에 보강 및 + X 방향
  5. 반복

는 복잡한 공식에 따라이 꽤 잘 작동하지만 마지막 몇 줄을 넣어 때 이미 넣어 라인을 이동하지 않을 수 있기 때문에, 원치 않는 결과를주고 시작합니다. 다른 최적화 기법이 있습니까?

+2

고정 간격 *에 행을 배치해야하는 것은 무엇입니까? 분명히, 그것들은 모두 서로 같은 거리를 가지고 있다는 것을 의미하지는 않습니다 (당신의 모범은 이것과 모순이 될 것입니다). 선의 가로 폭에 대한 요구 사항이 있습니까? 나는. 무엇이 모양의 한가운데 만 아주 짧은 줄을 만들지 못하게 막는 것입니까? (이것은 당신에게 최소한의 수를 줄 것입니까?) –

+0

@NicoSchertler 이는 각 행에 대해'y mod I == 0'을 의미합니다. 여기서 y는 행의 Y 좌표입니다. 여기서 제약 조건을 놓치고있는 것이 옳다. 그래서 네 번째를 추가했다. 도형 안의 사용 가능한 각 점은'D/2'보다 선에서 더 멀리있을 수 없다. 나는 주요 질문을 편집했다. 목표는 선이 구멍과 충돌하는 경우 구멍 옆에 놓고 가운데를 자르지 않고 전체 길이를 유지하고자하는 것입니다. 그러므로 라인들의 전체 길이를 최소화하는 대신에'N'을 최소화하는 목적입니다. – farbro

+0

일반적으로 I> D의 보장 된 솔루션이 없습니다. 평행선 사이의 간격이 D보다 클 수 있으며 각 중간에서 D/2보다 큰 중간 점이 나옵니다. – jwimberley

답변

2

나는 당신이 원하는 것이 무엇인지 확신 할 수 없다. 나는 당신이 염두에 두지 않은 것이 분명하다고 생각하지만 합리적이라고 생각하면 시도해 볼 수도있다.

거리가 단순히 d이고 그 이하 일 수 있기 때문에 욕심이 많은 알고리즘이 여기에서 작동해야하는 것처럼 처음에는 홍당무처럼 보입니다.가능한 한 적은 수의 (1) 가능한 한 기존 줄과 멀리 떨어져 있도록 (2) 항상 다음 줄을 배치하십시오.

이 문제에 대해 최적의 알고리즘이 있다고 가정하고 다음 줄을 마지막 줄의 a <= d에 놓습니다. 그것이 b 선이라고 말하십시오. 우리의 욕심 많은 알고리즘은 b 라인을 넘지 않을 것입니다. (첫 번째 기준은되도록 적게 배치하는 것이기 때문에) b 라인을 배치하면 ca <= c <= d으로 배치 할 것입니다. 가능한. 욕심이 알고리즘은 최적의 알고리즘이 한 일을하지 않은 경우

, 그것은 다음 중 한 가지 방법으로 달랐다 :
  1. 그것은 멀리 동일하거나 더 적은 라인을 배치했다. 최적의 알고리즘이 다음 단계에 a' 거리에 b' 회선을 배치했다고 가정합니다. 그런 다음이 선들은 거리가 a+a'이고 전체적으로 b+b' 선이 있습니다. 그러나 욕심 많은 알고리즘은이 경우 최적의 알고리즘을 b' 줄을 a+a'에 배치하여 c' = (a+a') - c을 선택하여 모방 할 수 있습니다. c > aa' < d이므로 c' < d이며 법적으로 허용됩니다.

  2. 더 적은 수의 선을 서로 가깝게 배치했습니다. 이 경우는 실제로 문제가됩니다. 이 위치는 최소한 k 라인을 필요로하고 가장 먼 거리가 더 많은 라인을 필요로하고, (예를 들어) 길이가 d의 배수가되도록 홀의 배열이 선택되는 경우, 불필요한 라인을 k에 배치 할 수 있습니다.

그리드 알고리즘은 경우 2에서 작동하지 않습니다. 그러나 다른 경우에는 그렇지 않습니다. 특히 첫 번째 경우에 대한 우리의 관찰은 매우 유용합니다. 두 개의 게재 위치 (distance, lines)(distance', lines')의 경우 distance >= distance'lines <= lines' 인 경우 첫 번째 게재 위치가 항상 선호됩니다. 이 (start, stop)에 의해 색인 캐시로 결과를 (seq, lines)를 넣어 메모이 제이션에 의해 개선 될 수

PlaceLines(start, stop) 

    // if we are close enough to the other edge, 
    // don't place any more lines. 
    if start + d >= stop then return ([], 0) 

    // see how many lines we can place at distance 
    // d from the last placed lines. no need to 
    // ever place more lines than this 
    nmax = min_lines_at_distance(start + d) 

    // see how that selection pans out by recursively 
    // seeing how line placement works after choosing 
    // nmax lines at distance d from the last lines. 
    optimal = PlaceLines(start + d, stop) 
    optimal[0] = [d] . optimal[0] 
    optimal[1] = nmax + optimal[1] 

    // we only need to try fewer lines, never more 
    for n = 1 to nmax do 

     // find the max displacement a from the last placed 
     // lines where we can place n lines. 
     a = max_distance_for_lines(start, stop, n) 

     if a is undefined then continue 

     // see how that choice pans out by placing 
     // the rest of the lines 
     candidate = PlaceLines(start + a, stop) 
     candidate[0] = [a] . candidate[0] 
     candidate[1] = n + candidate[1] 

     // replace the last best placement with the 
     // one we just tried, if it turned out to be 
     // better than the last 
     if candidate[1] < optimal[1] then 
      optimal = candidate 

    // return the best placement we found 
    return optimal 

: 이것은 다음과 같은 알고리즘을 제안한다. 그렇게하면 이미 평가되었을지도 모르는 과제를 계산하려고 할 때를 알 수 있습니다. 문제 인스턴스에 대해 거칠거나 미세한 이산화 여부를 불문하고이 사례를 많이 가질 것으로 기대합니다.

max_lines_at_distancemax_distance_for_lines 기능이 작동하는 방법에 대한 세부 정보는 없지만 이것에 대한 정보는 얻을 수 있습니다.

첫 번째는 지정된 간격 띄우기에서 지오메트리를 확장하는 데 필요한 줄 수를 알려줍니다. 기하학과 유색 구멍을 검은 색으로 픽셀 화 한 경우 표시된 변위에있는 셀의 행을보고 인접한 검은 선 세그먼트를 고려하여 몇 개의 선이 의미하는지 결정해야합니다.

두 번째 줄은 주어진 후보 수의 경우 해당 줄 수를 배치 할 수있는 현재 위치에서 최대 거리를 나타냅니다. 이 번호를 줄 수있는 최대 거리 인 또는을 배치하면이 기능을 향상시킬 수 있습니다.당신은 단지 그때부터, a하지 stop까지 검색 할 필요가

  1. f(start, stop, x) = ay < x 경우;이 개선를 사용하는 경우, 당신은 당신이 n하고를 반복하고 방향을 반전 할 수
  2. f(start, stop, x)이 정의되어 있지 않고 y < x 인 경우 더 이상 검색 할 필요가 없습니다. 어디 startstop 사이 n 이하의 라인을 배치하는 것은 불가능합니다 경우이 기능은 정의되지 않은 될 수

참고.

반복적 인 조회를 저장하기 위해 이러한 함수에 대해 별도로 외울 수 있습니다. 각 행에 대해 max_lines_at_distance을 사전 계산하여 나중에 사용할 수 있도록 캐시에 저장할 수 있습니다. 그런 다음 max_distance_for_lines은 두 경계 내에서 앞뒤로 캐시를 확인하는 루프가 될 수 있습니다.

+0

이제 하나의 상세한 대답입니다, 감사합니다! 욕심 많은 알고리즘을 연구하고 알고리즘을 이해할 시간이 필요 하겠지만 곧 다시 알려 드리겠습니다. – farbro