2013-02-08 5 views
0

현재 시험에 대한 2SAT 문제를 연구하고 있으며, 무차별 대입을 사용하여 솔루션이 있는지 확인하는 방법을 실제로 이해하지 못합니다. 이게 이상하게 보일지 모르지만 암시 그래프를 조금 더 구현하는 방법을 이해하지만 무차별 전략을 구현하는 방법을 너무 확신하지 못합니다.무차별 대입을 사용하여 2Sat CNF 형태를 푸십시오.

누군가 통찰력을 공유 할 수 있습니까? 어쩌면 의사 코드 또는 java에있을 수 있습니다.

감사

+1

어쩌면 2-SAT의 기초가 누락 되었습니까? brute force 메서드는 모든 변수에 대해 true와 false 사이의 모든 순열을 생성 한 다음 현재 순열이 주어진 절 집합을 만족하는지 여부를 확인합니다. – mmgp

+0

죄송합니다. 질문에 문제가있을 수 있습니다. brute force 메서드가 모든 순열을 생성한다는 것을 알지만, 무차별 대입 구현의 경우에도 무언가를하는 것처럼 느껴진다. 입력이 주어지면 가능한 모든 조합을 포함하는 2D 배열을 만들었다. 솔루션을 행별로. 소수의 분리를 위해 작동하는 것처럼 보였지만 배열의 크기가 빨리 벗어 났고 힙 공간 예외가 발생했습니다. –

+0

강력하게 연결된 구성 요소는 구현하기에 충분히 간단하고 훨씬 더 효율적이며 해결 방법이 있는지 여부를 알려줍니다. 그게 무슨 문제입니까? – mmgp

답변

2

수식의 변수는 정수 값의 비트로 인코딩 할 수 있습니다. 그런 다음 무차별 대입 방법은 통합 "컨테이너"가 취할 수있는 모든 가능한 값에 대한 범위로 내려갑니다.

즉, 모든 수식의 변수를 나타내는 정수 배열이 있고 정수로 증가하고 각 단계에서 수식에 대해 나타내는 솔루션을 확인합니다. 솔루션이 일치하면 멈 춥니 다.

는 다음과 같은 변수 컨테이너 죽은 간단한 구현의 :

class OverflowException extends RuntimeException {} 

public class Variables { 
    int[] data; 
    int size; 

    public Variables(int size_){ 
     size = size_; 
     data = new int[1 + size/32]; 
    } 
    public boolean get(int i){ 
     return (data[i/32] & (1 << i%32)) != 0; 
    } 
    public void set(int i, boolean v){ 
     if (v) 
      data[i/32] |= (1 << i%32); 
     else 
      data[i/32] &= ~(1 << i%32); 
    } 
    public void increment(){ 
     int i; 
     for (i=0; i < size/32; i++){ 
      data[i]++; 
      if (data[i] != 0) return; 
     } 
     if (size%32 != 0){ 
      data[i]++; 
      if ((data[i] & ~((1 << (size%32)) - 1)) != 0) 
       throw new OverflowException(); 
     } 
    } 
} 

(매주의 위험의 위험 부담 : 코드 검증되지 않은).

변수 배열은 더 간단 boolean 컨테이너로 표현 될 수 있지만,이 아마도 대신에 일반 이진 인코딩의 gray code을 사용하여 완화 할 수 있지만 당신은 (때문에 증분 단계의 성능에 약간의 손실 될 수 있습니다 증분 작업이지만이 implementation의 복잡성은 그 반대를 나타내는 것으로 보이며 복잡한 솔루션을 찾으면 좋은 sat2 솔버가 될 수 있습니다.

+0

나는 자바에 능숙하지 않아서, 나의 코드가 표준 관행을 따르지 않을 수도 있으므로 조언이나 편집을 부탁한다. – didierc

0

이것은 우리가 무력 솔루션 : 사용하지 않는 이유는, 그들은 많은 자원을 소모합니다. 내 알고리즘은 모든 가능성을 가진 매트릭스를 생성하지 않을 것입니다. 하지만 하나의 과제를 만든 다음 즉시 과제를 테스트하십시오. 그런 다음 다음 것을 만드십시오. 첫 번째 해결책을 찾았 으면 중단 할 수 있습니다.

+0

현재로서는 2SAT에 해결책이 있는지 없는지보고 싶습니다. 모든 가능성을 찾는 데는 너무 많은 시간이 필요합니다. D –

+0

앞서 언급했듯이 첫 번째 양수 할당에서 실행을 중지 할 수 있습니다. 그렇게하면 모든 과제에 대해 공간을 할당 할 필요가 없으며이를 확인하고 중단 할 수 있습니다. – dolbi

+0

@dolbi 나는 농담을 하던지하지 않겠는가 확신 할 수는 없지만,이 솔루션은 모든 순열을 한 번에 저장하려고하든 그렇지 않든간에 모든 무차별 적 힘만큼 나쁘다. 다음에 하나의 순열을 생성해도 계산 시간이 절약되지는 않지만 최악의 경우에는 여전히 'O (n!)'입니다. 모든 순열을 즉시 생성하는 것은 무의미하며, 고려하지 않아야합니다. – mmgp

관련 문제