문제

는지 궁금하면 나는 수량 C 의 곡선형 트랙 그리고 양 S 의 트랙,나는 어떻게 생각할 수 있는 알고리즘(컴퓨터 또는지),을 디자인하는"무작위"레이아웃을 사용하여 그 모든 트랙,그 같은 다음과 같은 규칙을 만족:

1)트랙을 때,모든 연결된 형태로 폐쇄(continuous)루프에 대한 기차 주위에 이동합니다.

2)경사로,구부리는 트랙,부딪치의 트랙,횡단의 트랙들은 모두 허용되지 않습니다.

3)C,S 것입니다 모두가 될 수 있습니다.예를 들어 C=20S=10.참고 걸리는 12 곡선에서 같은 방향을 만들은 완전한 원형의 360 도 그래서 적어도 12 의 그 곡선될 필요가 지향하고 같은 방법으로 완료하는 360 도입니다.다른 사람들 수 있다"지그재그로"그 결과는 360 도에서 기차가 완전한다.

직 트랙에 대한 10 인치(25.4cm)긴 곡선형 트랙에 대한 12.4 인치(31.6cm)(중심에서 아래로,다음과 같은 곡선)곡선은 30 도입니다.는"관계에서"트랙을 최대 폭의 3 5/8inch(9.2cm)입니다.을 배치하는 직선과 곡선이 트랙이 서로의 위에와 측정하는 12.4"(31.6cm)곡선은 12"(30.5cm)선형의 길이(과 같은 방향으로 똑바른),3"(7.6cm)의 벤드(에서 수직 방향으로의 스트레이트).A12C 원는 직경의 47.5"(120.6cm)센터에서 센터 트랙의 반대 측에.

모든 측정은 표준을 나타낸 것입니다.

업데이트

다시 측정 트랙을 사용하여 많은 이들의 제거할 수 있도록 오류가 다소 놀랍게도,길이의 스트레이트는 10 인치,그들은 나타나는 것에 대해 9.78 인치입니다.이에 상당한 영향을 미치 일치하는 지그재그 곡선을 직선.원래 나는 생각을 4 지그재그 곡선=5 스트레이트 그러나지 않는 아주 정확합니다.4 곡선은 약 47"의 선형 거리 그래서 5 스트레이트에 9.78"각 것 48.9",거의 2 인치 이상합니다.그래서 속이 그것을 찾기 위해 LCM(적어도 다수의 일반)47 및 9.78.그것은 것으로 밝혀졌 235.235=47*5 235/9.78=24.028...(가까운 충분히).즉 20 지그재그 곡선은 거의 동일한으로 24 는 스트레이트에서 선형 길이 있습니다.다행히 난 26 스트레이트 그래서 나는 겨우 그것을 만들었다.2 개 남은 쉽게 배치 될 수 있습 다른 곳에서 레이아웃이 있습니다.

다른 일을 발견되는 경우 지그재그 곡선 2 동일한 방향에서 시간(OOCCCCOO),다음의 8 사람들은 직선 거리의 83 인치지 않는,94 인치 같은 경우 다른 곡선(OCCOOCCO).LCM 의 83 9.78 에 대해 166.그래서 16 의 그 곡선 같은 선형으로 길이 17straights.유용한 알고 있기 때문에 나가 44 곡선과 만 26 스트레이트 그러나 내가 이렇게 대체,제가 만들 수 있습니다.

면 지그재그 곡선에서 3 시간(OOOCCCCCCOOO)와 벤드 그것은 단지 약간,나를 얻을 수 있는 정확한 선형의 길이가 10 는 스트레이트(대 97.8 인치)입니다.

말 업데이트

그래서 컴퓨터 프로그램을 만들 수 있는 기하학적 모델과 기억의 정확한 위치는 각 트랙 또는 거기에 몇 가지 간단한 방법으로 코드를 이?나는 할 수 있어야"버튼을 누르면"및"컴퓨터 뱉어"유효""새로운 레이아웃습니다.

이 작동하는 알고리즘 아이들이 사용하는 기차,그래서 그들은 좌절하지 않을 시도하는 레이아웃 작동하지 않고 그들을 시도 구부러 트랙을 떠나야하는 몇 가지 추적하 조각이 그에 적합 하지 않다.컴퓨터를 만들 수 있습 유효한 레이아웃을 사용하여 모든 트랙의 경우 알고리즘은 좋은 아마 몇 초입니다.이 방지하려면 좌절한다.

나는 몇 가지 코딩 기술지 알아야 하는 알고리즘을 하기 전에 먼저 나는 할 수 있는 코드가 뭔가 의미 있는(다 테스트는 몇 가지 부품의 후보자 알고리즘)

내가 무슨 생각이 나는 컴퓨터 모델링 트랙을 사용하여(작은 규모를 축소)표현입니다.나는 생각할 수 있음""장소에서 트랙 레이아웃 후보와 확인에 대한 충돌 기타 트랙에 이미 있습니다.

나는 생각하고 있는 아마 더 나은 방법으로 할,하지만 그것이 왜 나는 여기에 몇 가지 도움/아이디어.내가 정말 원하는 이것이 만족하고 있는 트랙 여기 그래서 나는 그들을 사용할 수 있는 다음 사항을 확인하기 위해 경우에는 알고리즘이 작동하는 것입니다.

우리가 사용할 수 있습니다 C=20S=10 으로 매개 변수를 해결하기 위해 시도이기 때문에 그것은 합리적으로 적은 수의 트랙(총 30).나는 가정으면 알고리즘을 충분히 견고,C,S 에서 값을 변경할 수 있습는 것입니다 그리고 그것은 여전히 작동할 것입니다.예를 들어,결국 해보고 싶 C=44S=26.

마지막 낱말

감사에 대한 의견과 제안에 관한 이 질문입니다.많은 것을 배웠다 너무입니다.아 난 정말 많이 생각에 대한 기차 트랙과 함께 맞는 방법이지만 성인으로,나는 볼 수 있습니다 그것은 매혹적인 기하학적 문제와 매우 어려운 수학적 계산에 문제가 생성/알아내는 방법은 많은 서로 다른(독특한)트랙 레이아웃이 있다.를 즐길 희망으로 운동을 많이 했습니다.아이 감사합니다.

최종어

도움이 되었습니까?

해결책

나는 짐승의 솔루션을 제공 할 것이라고 생각했다.

아이디어는 모든 단일 트랙 레이아웃을 차례로 시도하는 것입니다. 레이아웃을 구축 할 때 왼손잡이 곡선, 오른손 곡선 및 똑바로 고려해야 할 3 개의 조각이 있습니다.

레이아웃의 조각 수에 해당하는 너비로 트랙 레이아웃을베이스 3 번호로 인코딩 할 수 있습니다. 모든 트랙 레이아웃을 열거하려면베이스 3에서 숫자를 계산하십시오. 인코딩이 0= 직선, 1= 왼쪽 및 2= 오른쪽으로 표시됩니다.

다음 단계는 두 끝에서 레이아웃이 조인하는지 확인하는 것입니다. 첫 번째 수표는 하나의 완전한 회로가 될 충분한 곡선이 있는지 확인하는 것입니다. 하나의 회로에 대해 시계 방향 감지를 선택하면 12 개의 왼쪽 곡선이 필요합니다. 모든 여분의 오른쪽 곡선에 대해 추가 왼쪽 곡선에 추가해야합니다. 따라서 특정 레이아웃을 확인하려면 왼쪽 곡선의 수를 추가하고 오른쪽 곡선 수를 뺍니다.

마지막으로 실제로 만나는 끝을 확인해야합니다. 우리는 단순히 데카르트 그리드에 트랙을 그릴 것입니다. [0,0]에서 원점을 시작하고 [0,0]에서 끝나면 조인합니다.

트랙을 그릴 수있는 가장 간단한 방법은 로고 스타일을 찍습니다. 즉, 마지막으로 놓인 트랙 조각의 방향을 가리키는 방향 벡터를 유지합니다. 왼쪽 곡선을 익히는 경우 방향을 30도까지 회전시키고 오른쪽 곡선을 -30도 회전시킵니다. 직선은 방향에 영향을 미치지 않습니다.

실제로 곡선과 직선을 그릴 수 있으므로 조각의 크기로 방향 벡터를 확장합니다. 즉, 곡선을위한 12.4 x 12 / 2 x PI (완전한 원형 트랙의 반경) 단위 .

caveats

부동 소수점 숫자를 가산하는 중 오류로 인해 플로팅이 정확하지 않습니다. 그리고 실제 생활에서 우리는 끝까지 흔들리는 방을 남겨 둘 수 있으므로 이렇게되어야합니다.

많은 레이아웃이 동일하지만 한 위치로 이동합니다. 이전의 것들을 보관하고 확인하는 것 이외의 중복 된 시프트 된 레이아웃을 제외하는 방법을 볼 수 없습니다.

알고리즘은 조각을 크로스하는 레이아웃을 제외하지 않습니다. 그렇게하기 위해 레이아웃의 각 조각이 레이아웃에서 다른 부분을 교차하지 않는지 확인해야합니다 (o (n ^ 2)). 그리고 곡선 곡선, 곡선 및 스트레이트 스트레이트 횡단 교차점에 대한 수표가 있어야하며 매우 복잡해지기 시작합니다.

알고리즘의 실행 시간은 지수 인 OF (3 ^ N)이며 매우 큰 레이아웃에 대해 비실용적이지 않습니다.

아래의 일부 VBA 코드는 Excel에 붙여 넣을 수 있도록 개념을 증명할 수 있습니다. 나는 당신이 좋아하는 언어로의 변환을 원조하기 위해 가능한 한 간단하게 코드를 유지하려고했습니다. 질문이 있으시면 언제든지 물어보십시오.

Option Explicit

Type Vector
    X As Double
    Y As Double
End Type

Sub GenerateTrackLayout()
    Dim lCounts(40) As Long
    Dim lColumn As Long
    Dim lTrackLength As Long
    Dim lCurveSum As Long
    Dim lIndex As Long
    Dim lIndex2 As Long
    Dim vDirection As Vector
    Dim vBase As Vector
    Dim vTrackPosition As Vector
    Dim fPI As Double
    Dim fCurveRadius As Double
    Dim fStraightLength As Double
    Dim sPath As String
    Dim lOutputRow As Long
    Const TOLERANCE = 0.5 'inch

    lOutputRow = 1

    vBase.X = Sqr(3) / 2 ' 30 degrees
    vBase.Y = 1 / 2 ' 30 degrees

    fPI = 4 * Atn(1)
    fCurveRadius = 12.4 * 12 / (2 * fPI)
    fStraightLength = 10

    lTrackLength = 12 ' initial track length

    Application.ScreenUpdating = False

    Do
        ' Check for closed track
        lCurveSum = 0

        For lIndex = 0 To lTrackLength - 1
            If lCounts(lIndex) = 1 Then
                lCurveSum = lCurveSum + 1
            ElseIf lCounts(lIndex) = 2 Then
                lCurveSum = lCurveSum - 1
            End If
        Next

        If lCurveSum = 12 Then ' one 360 degree rotation anti-clockwise
            vDirection.X = 0
            vDirection.Y = 1
            vTrackPosition.X = 0
            vTrackPosition.Y = 0

            ' Plot the track and ensure that ends meet
            For lIndex = 0 To lTrackLength - 1
                Select Case lCounts(lIndex)
                    Case 0 ' straight
                        vTrackPosition = AddVectors(vTrackPosition, ScaleVector(vDirection, fStraightLength))
                    Case 1 ' left curve
                        vDirection = MultiplyVectors(vDirection, vBase, 1)
                        vTrackPosition = AddVectors(vTrackPosition, ScaleVector(vDirection, fCurveRadius))
                    Case 2 ' right curve
                        vDirection = MultiplyVectors(vDirection, vBase, -1)
                        vTrackPosition = AddVectors(vTrackPosition, ScaleVector(vDirection, fCurveRadius))
                End Select

                ' If ends meet within tolerance then output the track
                If Abs(vTrackPosition.X) < TOLERANCE Then
                    If Abs(vTrackPosition.Y) < TOLERANCE Then
                        If lIndex = (lTrackLength - 1) Then
                            sPath = ""
                            For lIndex2 = 0 To lIndex
                                Select Case lCounts(lIndex2)
                                    Case 0 ' straight
                                        sPath = sPath & "S"
                                    Case 1 ' left
                                        sPath = sPath & "L"
                                    Case 2 ' right
                                        sPath = sPath & "R"
                                End Select
                            Next
                            Application.ScreenUpdating = True
                            Cells(lOutputRow, 1).Value = sPath
                            Application.ScreenUpdating = False
                            lOutputRow = lOutputRow + 1
                        End If
                    End If
                End If
            Next
        End If

        ' Count in base 3 where number width is Track Length
        lColumn = 0
        Do
            lCounts(lColumn) = lCounts(lColumn) + 1
            If lCounts(lColumn) = 3 Then
                lCounts(lColumn) = 0
                lColumn = lColumn + 1
            Else
                Exit Do
            End If
        Loop Until lColumn = lTrackLength

        ' We've tried all tracks of this length, next one up...
        If lColumn = lTrackLength Then
            Erase lCounts ' reset all columns to zero
            lTrackLength = lTrackLength + 1
        End If
        DoEvents
    Loop
End Sub

' Vector maths

Function MultiplyVectors(vVectorA As Vector, vVectorB As Vector, ByVal fConjugate As Double) As Vector
    MultiplyVectors.X = vVectorA.X * vVectorB.X - fConjugate * vVectorA.Y * vVectorB.Y
    MultiplyVectors.Y = vVectorA.Y * vVectorB.X + fConjugate * vVectorA.X * vVectorB.Y
End Function

Function AddVectors(vVectorA As Vector, vVectorB As Vector) As Vector
    AddVectors.X = vVectorA.X + vVectorB.X
    AddVectors.Y = vVectorA.Y + vVectorB.Y
End Function

Function ScaleVector(vVector As Vector, ByVal fScale As Double) As Vector
    ScaleVector.X = vVector.X * fScale
    ScaleVector.Y = vVector.Y * fScale
End Function
.

다른 팁

첫째, 프레임 챌린지 :

컴퓨터는 모든 트랙을 사용하여 유효한 레이아웃을 만들고 알고리즘이 양호한 경우 몇 초 안에

몇 초 만에 실행할 알고리즘이 필요하지 않습니다. 몇 초 만에 출력이 필요합니다. 모서리에있는 컴퓨터에서 실행중인 브리트 포스 레이아웃 크 래너를 설정하고 UI가 임의의 레이아웃을 선택할 수있는 데이터베이스에 솔루션을 저장하는 데있어서 멈추는 것이 있음을 알지 못합니다.


생성의 관점에서는 여러 반 표준 접근법이 있습니다. 상태 공간은 다소 크므로, 철저한 검색이 실현 가능하지 않을 수 있습니다. 그러나 다음 중 하나가 시도할만한 가치가있을 수 있습니다 :

  • 똑바로 똑바로 및 왼쪽 및 오른쪽 곡선의 목록의 순수한 무작위 셔플 링, "선량"테스트가 뒤 따른다.
  • Hill-Climbing : 임의의 순열로 시작한 다음 간단한 스왑을 테스트하여 "선량"을 향상 시킬지 확인하십시오. 그들이하는다면, 스왑을 만들고 반복하십시오.
  • 시뮬레이션 어닐링 : 비슷하지만 때로는 더 나은 언덕에가는 희망에서 "선하심"을 줄이는 변화를 허용합니다.
  • 유전자 알고리즘 : 많은 무작위 순열을 생성하고 반복적으로 혼합하여 최상의 결과를 유지하십시오. 그러나 그것들을 혼합하는 방법은 전혀 분명하지는 않습니다.
  • 후자의 3은 삽입에 의해 생성 된 "알려진"곡선으로 시작될 수 있습니다.
  • Meet-in-the-middle에 대한 옵션을 탐색합니다. 예를 들어, 끝점 사이의 2D 벡터에 의해 +90 °의 총 각도로 전체 곡선을 생성하고 곡선 사이의 2D 벡터가 많으면 닫힌 사변형을 형성하는 것들을 찾기 위해 사각형을 철저히 고려할 수 있습니다. ...에

"선량"테스트를 위해 곡선이 닫히지 않으면 분명히 큰 벌금이 필요합니다. 또한 자체 중첩에 큰 벌금이 필요합니다. 나는 쿼드 트리를 사용하여 연속적이지만 서로 가깝고 아크 아크, 아크 라인 및 라인 라인 교차점 테스트를 테스트하여 하나의 세그먼트를 경계하는지 여부를 확인하기 위해 쿼드 - 트리를 사용하는 것을 테스트하는 경향이 있습니다. 겹치는 가장자리를 겹치십시오.


다른 전략을 완전히 무력하게하는 것이 더 작은 경우를 강제적으로 수행 할 수는 있지만 더 크지는 않지만 총 벡터에 대수적 인 접근법을 취하는 것입니다. 직선 조각의 길이가 $ 2 \ ell $ 및 곡선 조각 반경 $ 2r $ . 방향이 모두 30 도의 배수이기 때문에 직선 조각의 끝 사이의 벡터는 $$ (0, \ pm 2 \ ell), (\ pm 2 \ ell, 0), (\ pm \ ell, \ pm \ pm \ sqrt3 \ eell, \ pm \ sqrt3 \ ell, \ pm \ ell) $$ 과 유사하게 곡선 부분의 끝 부분 사이의 벡터는 < SPAN 클래스="수학 용기"> $$ (\ pm r, \ pm \ sqrt3 r), (\ pm \ sqrt3 r, \ pm r), (\ pm (\ sqrt3 - 1) R, \ PM (\ SQRT3 - 1) R)) $$

$ \ frac \ ell r $ , $ \ frac {\ sqrt 3 \ eell} r $ 또는 $ \ frac \ eell {\ sqrt 3 r} $ 은 작은 분자와 작은 분모, 곡선 및 똑바로가 독립적이며, 따라서 곡선 세트를 찾을 수 있습니다 (Brute force는 16 개의 방향이고 다른 하나는 4 개의 곡선이 충분합니다. 44 개의 곡선 분할 28-16)은 더 나은 접근이 필요합니다. 나는 $ + sqrt 3 $ 을 요구하는 의미의 $-\ sqrt 3 $ S는 일부 무거운 필터링을 허용 한 다음 쌍으로 똑바로 삽입 할 수 있습니다. 작은 수의 곡선에 대한 무차별 에이 작업을 적용하면 대칭적인 접근 방식으로 잠재적으로 잃어버린 레이아웃 수를 평가할 수 있습니다.

가능한 한 가지 솔루션 이 가능한 한 간단한 신속하게 작동하는 알고리즘은 다음과 같습니다.가장 간단한 레이아웃은 물론 12C(12 곡선형 트랙과 같은 모든 방향(서로 상대적으로 다른 사람),그리고 형성하는 간단한 원형입니다.이 될 수 있는 기초를 쌓을 수 있습니다.

그래서 기본 알고리즘을 유지하는 것입니다 360 도 지속적인 루프 레이아웃의 모든 단계에서 추가하는 경우 추적합니다.우리가 할 수 있을 검사하여 이 얼마나 많은 곡선형 트랙을 우리는 나머지,그리고 그들을 추가하여 레이아웃을 그룹에서는 360 도 속성이 유지됩니다.예를 들어 시작으로 우리의 12C 레이아웃(간단한 원).우리는 우리가 알고 있 20C 총 그래서 우리는 8C 이 남아있습니다.가장 간단한 사람들의 일부는 것이 유지하는 360 도 시설을 추가하는 것이 반대 방향 곡선과 같은 방향 곡선(동일하게 주요 원리로 시작).우리는 다음에 대해 동일한 작업을 수행합 반대쪽의 레이아웃이 있습니다.이 간단한 예제에서,우리가 추가 4 개 이상의 곡 선을 원 레이아웃 12C 될 것입 16C(4C 남).우리는 것을 계속 배치까지 곡선 모두 20(이 예에서)가 적절히 배치되어 있다.이 레이아웃으로 구성된 모든 곡선이 유효한 폐쇄형 루프 레이아웃이 있습니다.기차에 사용할 수 있는 이 레이아웃,그러나,그것의 모든 곡선형 트랙을 따라서 우리는 아직 한다.

스트레이트 트랙을 다시 삽입되는 동일한 방식 이외에 추가 할 수 있습니다 쌍(2 트랙)이후 그들은 변화하지 않은 360 도 제공합니다.그들은 어디에나 삽입할 수 있습 그래서 나는 그것이 최고의 것을 첫 번째 장소는 모든 곡선형 트랙을,그 다음 다시 이동하고 2 차 전달 장소는 스트레이트 무작위로(그러나 대칭).

이것은 간단한 알고리즘의 생각할 수 있습니다.그것은 보장을 생산하는 360 도 폐쇄 루프,대칭을 추적 및 가정의 곡선은 여러 개의 4,#의 직선은 여러 개의 2,사용 각 트랙에 있습니다.

하나는 것은 고려하지만 때(이 알고리즘을 사용하여 두 컴퓨터 또는 그냥에 당신의 마음으로 당신은 건물의 레이아웃),이 있을 수 있습 공간 제한 더 그래서 한 방향으로 다른 것보다.예를 들어오는 긴지만,그렇게 넓습니다.할 때 알고리즘을 사용하여,그것은 편견으로 더 긴 치수의 레이아웃을 것입니다.

만약 누군가가 알아낼 수 있는 알고리즘을 형성하는 비대칭 레이아웃을 사용하여 트랙의 모든 것,심지어 더 인상적이다.

차이에 복잡도 간의 간단한 솔루션과 가장 복잡은 엄청난 것입니다.을 시작으로 원(12C)은 간단하다 이것에 대한 문제이고 합리적인에 대한 아이다,그러나 그것은 매우 흥미로운 분석하는 일반적인 솔루션을 생산할 수 있는 모든 유효한 레이아웃을(를 포함하여 비대칭 사람).

현실에서,비 컴퓨터 알고리즘을 것을 그냥 몇 가지를 추가""멋진 모양의 레이아웃고 그것을 가까이에 연결한 다음,다시 가서 조정 그것은 그래서 그는 참으로 연결(for closed loop).70 트랙 조각 총(44C 및 26S),거대한 레이아웃이 가능합니다.내가 계산에 대한 총 67 발의 트랙에 대한 20 미터입니다.기차를 취해야에 대해 1 분기는 루프 전체를 레이아웃을 한다.

다른 후보 솔루션 는 것이 실제 측정의 각 트랙 기억하고 오른쪽 가장자리의 레이아웃이 있습니다.건축할 때,레이아웃을 시작할 수 있습을 직선적으로 또는 왼쪽 곡선(시계 반대 방향으로)축적하고,얼마나 멀리 떨어져 마지막 트랙에서는 가장 오른쪽 가장자리,그리고 다음을 추가하는 경우 다른 트랙,지 않도록 조합의 트랙을 충돌 것이나 크로스는 가장 오른쪽 가장자리 또는 아마도 가깝습니다.그래서 예를 들어 시작을 직선적(no12C 초기에 원형 이 후보는 솔루션),무작위로 다른 트랙 조각입니다.지에서 시작하는 것을 허용하지 않을 권리(시계 방향으로)돌기 때문하는 것의 규칙"crossing"오른쪽 가장자리입니다.후 첫 번째 똑바로 추적,우리의 유일한 옵션을하는 또 다른 스트레이트 또는 왼쪽(시계 반대 방향으로)곡선입니다.다른 규칙을 적용하는 것입 후 바로,우리는이 허용되지 않습을 추가 9 이상이 동일한 방향에서 곡선 연속,그렇지 않으면 그것은 것이/크로스 일부를 다른 트랙 이미 설치되어 있다고 가정합니다.을 제한할 수 있도에 감소 8 에 대한 더 많은 정리,그리고 발생하는 경우,다음을 추적해야 하는 역방향이 지향 곡선(기 때문 바로 문제를 일으킬 수 있습니다).

이 알고리즘 것이 도움이 필요하게 그것을 얻을 돌아와 연결하는 다른 쪽의 그 첫 번째 추가적 조각입니다.우리가 할 수 있는 것으로 주장되는 시계 반대 방향으로 곡선을 카운트+1 시계 방향으로 곡선으로 계산 -1,그리고 사람들까지 추가해야합 12 에 마지막으로 추가된 곡선입니다.우리는 할 수 있는 데 도움이 바이어스 CC(시계 반대 방향으로)곡선에서 4:1 비율로 시계 방향으로 커브,그래서 그 기회는 우리가 얻 16CC4 시계 방향으로,효과적으로 순 360 도 원입니다.는 경우에는 알고리즘을 추가하려고 시도 CC 곡선이지만 혹이 기존의 트랙,우리은 2 가지 옵션이 있습니다 해당 지점에서 시도하는 반대 방향 곡선 또는 포기는 레이아웃 시작합니다.나는 생각에 빠른 컴퓨터,결국 그것을 얻을 것이 좋은 레이아웃이 있습니다.

나는 아직 확신이 없는 경우는 이 방법은 수확량 모든 같은 레이아웃으로 시작으로 12C 지만,아마도 그것은 쉽게 수 있습을 구현하는 컴퓨터에 있기 때문에 단지 몇 가지 규칙을 적용하고,우리는 레이아웃을 하나의 트랙이다.

실제로,나는 그의 생각이 3 한 후보 솔루션 을 더욱 쉽게 확인할 수 있게 되었고 너무 어렵지 않을 구현할 수 있습니다.그것은 다음과 같습니다.

기술을 사용하는 위에 설명된지만 반 레이아웃(용의 트랙의 각 유형,그래서 10 곡선과 5straights.우리는 컴퓨터를 선택 임의의 트랙만 동의 레이아웃을 끝내는 순 180 도의 좌회전(기 때문에 우리는 집행하는 권리는 없을 추적할 수 있는 터치 또는 십자가입니다.좋아요 그래서 가정 컴퓨터가 매우 신속하게 발견 유효"반 레이아웃을".그런 다음 우리가 하는 것은 단순히의 인벤토리를 얼마나 많은 시계 방향으로 곡선이며,시계 반대 방향으로 곡선이 있고,중복되는 것 기타 트랙의 절반(그러나 반드시 대칭).에 대한 스트레이트,우리가 기록하는 어떤 각도에서 그들에 삽입한 다음에서 일치하는의 나머지 절반을 추적하지만,다시 반드시 대칭.

수도 예를 들어를 사용하 S 로,O 반시계방향으로 커브,그리고 C 를 시계 방향으로 곡선입니다.에 집중하고 반 레이아웃을 처음이다.

첫번째 똑바로 추적하는 것에서 우리 정의하는 우리의 가장 오른쪽 가장자리는 우리가 허용되지 않습니다.

SOOSOCSOOSSOOOC-이것은 유효한 반 레이아웃이 있기 때문 5 스트레이트 10 곡선 순 6 시계 반대 방향으로 곡선의(2 의 8"했을 취소하여 2 시계 방향으로 곡선).

지금 우리는"계속"탭에서 어떤 각도는 직선이 삽입되고 일치 그와 같은 각도(그러나 반대 방향으로)트랙을"취소"그들니다.

1:0 도 각도 스트레이트
0:30 도 각도 스트레이트
2:60 도 각도 스트레이트
0:90 도 각도로는 스트레이트
2:120 도 각도 스트레이트
0:150 도 각도 스트레이트
0:180 도의 각도 스트레이트

그래서"경기에 이것을"기타 레이아웃의 절반 및 그렇게 그것을 연결하는 하나의 출발 똑바로 추적,우리가 일치하는 같은 수의 Os 와 Cs 이지만,또한 동의 직선에+180 도"돌아온"각.예를 들어,60 도선 해 240 도 똑바른 다른 측면에서의 레이아웃이 어딘가에,반드시 정확하게 반대입니다.기 때문에 이것은 60 도로 바로 갈 것이 대부분 왼쪽으로 약간의 업(이 방식을 사용하여)과 240 정도는 직선을 가져올 것이 다시 오른쪽으로 다시 동일한 금액을 효과적으로는"취소"그 2 트랙 기여를 벗어나에서 시작하는 추적 위치입니다.

그래서 지금 우리가 해야 할 일을 만드는"누락 반"의 레이아웃을 가지고 알려져 있는 트랙 우리가 필요로(아는 것에 어떤 각도는 직선이 될 것),그리고 그냥"크"그들에게 어떤 순서입니다.

이 있을 수 있습 방법은 없을 정확하게 일치하는 하나의 절반의 레이아웃을"보완"트랙에서 다른 쪽지만,포함하는 것은 좀 더 복잡한 수학하고 있는 시간이 충분하지 않을 해결하는 시간에 특가 활성화한다.또한 기회가있는 모든 트랙을 사용하는 방법과 약간 구부리는 트랙의 것이 필요합니다.우리는 무시할 수 있다 이런 특별한 속성이 질문입니다.

실제로 만들어 비대칭적을 보면 그것이 일하고 그것을 보았습니다.를 사용하 S 로,O 반시계방향으로 커브,그리고 C 를 시계 방향으로 커브 플러스,각도(도)에 상대적 시작을 직선적,내가 다음에 대한 상반:

S0,O30,O60,S60,O90,C60,S60,O90,O120,S120,S120,O150,O180,O210,C180

에 대한 하단의 트랙 난:

O210,O240,S240,C210,O240,S240,O270,O300,S300,S300,O330,O360,O390,C360,S360

실제로에서 찍은 사진 잘못된 측면에서 상단과 하단은 뒤집혔다.첫 번째 트랙 누워있었던 바로 근처 블루 쓰고 나오는쪽으로 뷰어의 그림과 2 트랙은 시계 반대 방향으로 곡선입니다.

enter image description here

그것처럼 보인 이 기술은 작품에 대한 많은 짝수의 곡선도의 숫자를 스트레이트를 포함하여 44C 및 26S 는 나의 궁극적인 목표입니다.이것은 정말 격려하기 때문에 전자 컴퓨터 없이 정말로 해결하기 위해 필요하이,내가 할 수 있습니다 아이들을 구축에 대한 어떤 반 그들이 원하는 모양으로 절반의 트랙(22C 및 13S),다음,"올바른"그들의 디자인 그래서 그것은 180 도 다음"경기는"다른 측면의 추적,반드시 대칭.

을 조심해야 하는 경우를 만들 180 도 반 레이아웃 시작 및 종료 트랙 함께 매우 가깝습니다.예를 들어,형태의 상단 부분의 질문에 표시"?" 고(dot)그러나 계속하는 상한 곡선을 그에게 더 많은 스트레이트에서 아래로 가는 것 아주 가까이 바로 위에 있는 곳에 점이었다.다음을 위해 아래쪽,당신은 할 수 없을 것이라고 할 더 많은 시계 반대 방향으로 커브 바로가 있기 때문에 다른 직선 거기에서"최고 반".의 이미지 내 폐쇄 루프 레이아웃했기 때문에 내가 없었다"병목 현상"에서"상단에"반지만,물론 그들은 가능한으로 나는 단지 설명한다.

는"문제"기차 레이아웃을 때 하나는 트랙의 절반은 약간의 모래 모양으로 좁은 중간에 있습니다.는 경우에,당신은 거의를"mirror"상단 부분이기 때문에 특정 곡선할 수 없기 때문 트랙 그래서 가깝습니다.여기에는 예입니다...

enter image description here

또 다른 흥미로운 관측은 4 지그재그 곡선형 트랙의 거의 정확한 보충(까지 직선거리 스팬)5straights.그러나 너무 많은 것을 만들에서 상당한 차이가 길이 있습니다.에 명시된 바와 같이 업데이트 섹션,20 지그재그 곡선은 거의와 정확히 일치(선형 거리)스트레이트,24.

enter image description here

이 기술을 이용하여,거대한 레이아웃으로 만들 수 있는 모든 70 트랙 조각합니다.그것은 것으로 시작 12C 원형에,그 한쪽에,나는 삽입 할 수 있습니다 24 는 스트레이트(240inches).반대편에서 긴쪽의 레이아웃(을 거의 일치의 길이트),사용하는 것이 20 지그재그 곡선(도에 대한 240inches).그 거의 라인과 약간의 굴곡 작동해야한다.나머지 트랙(2 선 및 12 곡선)할 수 쉽게 배치 레이아웃을 유지하"균형"(연결).

포인트 (0, 0)에서 시작하여 오른쪽으로 똑바로가는 것으로 가정합니다. 점 (0, 0)에 도달 할 때까지 트랙을 추가해야합니다. 여기에 두 가지 문제가 있습니다 : 하나는 왼쪽에서 정확히 에서 오는 점 (0, 0)에 도달하는 것입니다. 다른 하나는 겹치지 않는 것입니다.

반 시계 방향 원을 형성하려면 12 개의 곡선 조각이 좌회전해야합니다. 이들은 정확한 원을 형성합니다. 0 또는 24 또는 36 개의 곡선 조각을 사용하여 그림 8 또는 2 또는 3 개의 원을 가질 수 있습니다. 그 중 어느 것도 교차하지 않고 수행 할 수 없습니다.

및 물론 추가 트랙을 추가 할 수 있으며, 이들은 특정 규칙을 따라야합니다. x 도의 각도에서 시작하여 x + 30 도의 각도에서 쌍으로 왼쪽으로 곡선, 직선 및 오른쪽 만곡 된 조각을 추가 할 수 있으므로 다시 0,0으로 돌아갑니다. 그리고 처음 12를 초과하는 왼쪽 곡선 조각의 수는 오른쪽 곡선 조각의 수와 일치해야하므로 0,0에서 직각으로 조각이 일치해야합니다.

그래서 당신이 사용할 수있는 조각입니다. 분명히 교차점이 없는지 확인해야합니다.

길이가 정확히 꼭 맞는 경우, 예를 들어 왼쪽 / 오른쪽 / 오른쪽 / 왼쪽은 똑같은 거리를 4 또는 5 개의 직선으로 덮으므로 다른 조합이 허용 될 수 있습니다.

및 물론 트랙 bendy입니다. 이는 더 많은 가능성을 일으킬 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 cs.stackexchange
scroll top