2009-10-11 4 views
2

나는 기사단 문제를보고 신경망을 사용하여 해결책을 찾기 위해 Python으로 구현하기로 결정했습니다. 나는 (내가 잘못 아무것도 볼 수 없습니다), 그것은 몇 가지를 업데이트 작동하지 않습니다 올바르게 구현 한 생각하지만신경망을 사용하여 기사단 둘러보기

방법의 일반적인 설명은 Wikipedia

에서 찾을 수 있습니다 링크를 사용하여 연결 꼭지점의 차수가 2보다 큰 에지를 제거하지만 솔루션에 수렴하지 않습니다.

내가 잘못 구현 한 것에 대한 아이디어가 있다면 궁금합니다 (끔찍한 코드에 대해 미안).

편집
작동 코드가 Yacoby.net

+0

최종 솔루션을 게시 할 수 있습니까? 일부 다른 사람에게 도움이 될 수 – daddz

+0

내 현재 솔루션을 잘 작동하는 동안 게시하기 전에 패턴 검색을 추가하고 싶습니다. – Yacoby

+0

실용적인 솔루션을 추가했습니다. – Yacoby

답변

3

뉴런을 제자리에서 업데이트 할 수 없습니다. U [t + 1]은 U [t]와 V [t]에 의존하기 때문에 이미 V를 업데이트했다면 U의 계산은 잘못 될 것입니다

업데이트를 두 단계로 나눠야한다고 생각합니다. update_state 및 update_output 그래서 모든 U이 코드를 찾고 후 모든 V

for n in neurons: 
     n.update_state() 
    for n in neurons: 
     n.update_output() 
+0

내가 어떻게 그렇게 분명한 것을 놓칠 수 있었는지 나는 믿을 수 없습니다. 약간 더 나은 설명에 대한 대답이 받아 들여졌습니다. – Yacoby

2

첫 인상에서 찾을 수 있습니다 당신은 보드에 대한 하나의 버퍼를 가지고있다. 저는 반복 사이에 버퍼 스왑이 보이지 않는다는 사실을 근거로하고 있습니다. 나는 그것을 자세히 보지 않았고 쉽게 잘못되었을 수도 있습니다.

단일 버퍼를 수정하면 이웃 카운트를 수행 할 때 부분적으로 수정 된 보드를 기반으로합니다. 시작시 사용한 보드가 아닙니다.

0

을 갱신하고있다, 나는 당신이 올바르지 않을 수 있습니다 사용되는 공식에 대한 설명을 생각합니다. 상태를 업데이트 할 때 두 개가 아닌 네 개를 더하고 뉴런 자체의 출력을 뺍니다. 뉴런 자체의 출력을 두 번 빼는 것 같아요. 이웃을 찾는 코드는 뉴런의 이웃과 뉴런 자체를 구별하지 못하고,이 코드를 두 번 실행합니다. 각 정점마다 한 번씩 실행합니다.

내 자신의 코드에 대한 테스트에서이를 확인하는 것 같습니다. 컨버전스 속도는 뉴런의 출력을 한 번이 아닌 두 번 빼면 크게 향상됩니다.

관련 문제