그리드에서 방향성 그래프를 임의로 생성


11

포켓몬의 얼음 미끄럼 퍼즐과 비슷한 퍼즐 게임을 만들기 위해 무작위로 방향 그래프를 생성하려고합니다.
이것은 본질적으로 무작위로 생성 할 수 있기를 원하는 것입니다 : http://bulbanews.bulbagarden.net/wiki/Crunching_the_numbers:_Graph_theory .

x 및 y 차원에서 그래프의 크기를 제한 할 수 있어야합니다. 링크에 주어진 예에서는 8x4 그리드로 제한됩니다.
내가 겪고있는 문제는 무작위로 그래프를 생성하는 것이 아니라 무작위로 그래프를 생성하는 것입니다. 노드의 반대쪽에 (바위와 같은) 무언가가 필요하기 때문에 2d 공간에서 올바르게 매핑 할 수 있습니다. 슬라이딩을 멈 추면 시각적으로 의미가 있습니다. 이것의 문제점은 때때로 암석이 다른 두 노드 사이 또는 다른 노드 자체의 경로로 끝나서 전체 그래프가 깨지는 것입니다.

내가 아는 소수의 사람들과 문제를 논의한 후, 우리는 해결책으로 이어질 수있는 몇 가지 결론에 도달했습니다.

  • 그리드를 구성 할 때 그리드의 장애물을 그래프의 일부로 포함.
  • 완전히 채워진 그리드로 시작하고 임의의 경로를 그리고 해당 경로를 작동시키는 블록을 삭제하십시오.

그러면 문제는 더 짧은 경로를 추가로 피하기 위해 삭제할 항목을 파악하게됩니다. 또한 동적 프로그래밍 알고리즘을 만드는 데 능숙한 사람은 없지만 동적 프로그래밍 알고리즘이 도움이 될 것이라고 생각했습니다. 이 문제가 공식적으로 불리는 것 (공식 그래프 문제인 경우)에 대한 아이디어 나 참조가 가장 도움이 될 것입니다.

다음은 무작위로 블록을 배치하고 선택한 시작 / 종료에서 탐색 그래프를 생성하여 지금까지 달성 한 몇 가지 예입니다. (이전 링크에서 설명한) 아이디어는 녹색 S에서 시작하여 녹색 F로 가고 싶다는 것입니다. 위 / 아래 / 왼쪽 / 오른쪽으로 이동하여 원하는 방향으로 계속 움직입니다. 벽. 이 그림에서 회색은 벽, 흰색은 바닥, 자주색 선은 시작부터 끝까지의 최소 길이이며 검은 선과 회색 점은 가능한 경로를 나타냅니다.

무작위로 생성 된 그래프의 몇 가지 나쁜 예는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

다음은 무작위로 생성되거나 손으로 조정 된 그래프의 좋은 예입니다.

여기에 이미지 설명을 입력하십시오

또한 퍼즐을 최소 경로를 따라 높은 수준의 노드로 가지고있는 퍼즐로 실제로 재생할 때 더 도전적인 것을 알았습니다.


1
완전히 임의의 암석 세트를 생성 한 다음 해당 그래프에 솔루션이 있는지 확인한 다음 그렇지 않은 경우 버리고 다시 시작할 수 있습니다. 8x4 그리드를 사용하면 시간이 오래 걸리지 않습니다. 더 깨끗한 솔루션이 있다고 확신합니다.
Job

이것은 나의 첫 번째 접근 방법이지만 약간 더 큰 규모로 수행해야하며 무차별 적으로 강제하는 것이 보였고 더 나은 접근 방법을 찾으려고했습니다.
Talon876

답변:


2
  • 얼음입니다. 바위를 치지 않으면 움직입니다.
  • 방향을 바꾸는 유일한 방법은 바위를 때리는 것입니다.
  • 바위에 부딪히면 방향을 바꿔야합니다.
  • 분명한 이유로주기가 좋습니다.
  • 여러 개의 시작과 여러 개의 끝이있을 수 있습니다.

고급 속성 :

  • 인접한 암석이없는 세포는 도달 할 수 없습니다 (일부는 통과 할 수 있음)
  • 벽도 바위입니다. 벽을 제거하면 감싸기로 결정할 수 있습니다.
  • 서브 그리드를 패턴으로 사용할 수 있습니다 ( "바둑판 식"3x3, 3x4, 5x5 등 ...)
  • 통과 할 수없는 MxN 영역 위에 퍼즐 MxN 타일을 오버레이하고 암석을 추가하여 해당 영역을 리디렉션 할 수 있습니다.
  • 타일의 회전 또는 대칭은 흥미로울 수 있습니다
  • 얼음 행 / 열을 삽입하여 타일을 확장 할 수 있습니다

예:

S=start, E=end, o=rock, .=ice

3 . 2 o        3 . . 2 o         . . . . . o o
4 . . E   ~=   4 . . . E   ~=    . . . . . 2 E
o . . .        o . . . .         . . . . . . .
S . 1 o        S . . 1 o         S . . . . 1 o

타일 ​​결합의 예 :

3 . . 2 o       o 2 . . 3      3 . . 2 o 7 . . 6
4 . . . E   +   E . . . 4  =   4 . . . . . . . 5
o . . . .       . . . . o      o . . . . . . . o
S . . 1 o       o 1 . . S      S . . 1 o 8 . . E

Tsuro 게임을 좋아할 수도 있습니다. 타일을 사용하여 임의의 보드를 생성합니다.


0

아마도 리버스 엔지니어링이 도움이 될 수 있습니다.

각 문제에 대해 하나의 솔루션 만있는 경우 고유 한 답변을 기반으로 그래프를 생성 할 수 있습니다. 따라서 동적 프로그래밍을 수행하거나 무차별 대입을 건너 뛰고 체계적인 생성을 선택하지 않아도됩니다.

당신은 그것에 의해 갈 수 있습니다 :

  1. MxN 그래프 준비
  2. 하나 / 다중 솔루션 만들기
  3. 단일 솔루션 문제인 경우 주변에 질문하기
  4. 문제에 대한 여러 솔루션이있는 경우 현재 반복이 다른 솔루션을 방해하지 않도록 위의 절차를 반복 할 수 있습니다.

문제의 복잡성과 문제 크기에 따라이 질문을 생성하는 방법을 장치해야합니다. 무차별 대입 만하지 마십시오. 대신 무작위 알고리즘을 사용해보십시오. 이것은 당신을 도울 수 있습니다.


작년에 그 책을 팔아서 후회할 줄 알았는데 친구 중 한 명이 어딘가에 있다고 생각합니다. 내가 찾아야 할 특정 알고리즘이 있습니까? 또는 그래프로 모든 것을 살펴보고 유용한 것으로 보이는 것을 찾을 수 있습니까? 오 그리고 두 개의 노드 사이를 몇 번이고 앞뒤로 이동하여 해결할 수 있기 때문에 하나의 최적의 솔루션 (그와의 관계가있을 수 있다고 생각합니다)과 무한한 다른 솔루션이 있습니다.
Talon876

0

다른 접근법은 어떻습니까? 빈 미로로 시작하고 다음과 같은 블록을 추가하십시오.

  1. 무작위로 시작 블록과 끝 블록.
  2. 임의의 (반환되지는 않음) 방향과 임의의 길이 (*)로 1-3 "슬라이딩"단계를 수행하십시오. 각 단계 후에 블록을 배치하십시오 (슬라이드 중지).
  3. 출구로가는 최단 경로를 찾으십시오. 세그먼트가 너무 적 으면 (낮은 레벨 난이도), 경로의 임의 세그먼트를 가져와 블록으로 분할하십시오. 그렇지 않으면 1 단계와 같이 블록을 배치하고 종료하십시오.
  4. 슬라이딩 단계의 길이를 선택할 때 입력 한 블록이 이전 경로를 닫지 않도록주의하여 (*) 1을 반복하십시오.

마무리 : 제공 한 알고리즘으로 가장 짧은 경로를 찾으십시오. 가장 짧은 경로가 짧아지지 않도록 매번 사용되는 모든 셀을 기록하고 나머지 셀을 무작위로 채 웁니다.

마지막 블록을 넣을 수 없어서 마지막 경로를 사용할 수없는 2 단계에는주의 사항이 있지만 두 가지 해결책이 있습니다. 엔딩 블록을 빨리 움직이거나 몇 단계를 취소하고 다시 시도하십시오.

슬라이딩 단계의 임의 길이에 대한 또 다른 생각-경로가 겹치지 않는 한 이전에 배치 된 블록을 재사용하도록 선택하는 것이 좋습니다.


@ Talon876 이것은 내가 이야기 한 무작위 알고리즘의 한 유형입니다.
c0da
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.