승자는 실수했을 때 '내가 잘못했다'고 말합니다 패자는 실수했을 때 '너 때문에...'라고 말합니다 승자의 입에는 정직이 가득하고, 패자의 입에는 핑계가 가득합니다 승자는 '예'와 '아니오'를 분명히 말하고, 패자는 '예'와 '아니오'를 대충 말합니다 승자는 어린아이에게도 사과할 줄 알고, 패자는 노인에게도 고개를 못 숙입니다 승자는 넘어지면 일어나 앞을 보고, 패자는 넘어지면 뒤를 봅니다
승자는 패자보다 더 열심히 일하지만 여유가 있고, 패자는 승자보다 게으르지만 늘 바쁘다고 말합니다 승자의 하루는 25시간이고, 패자의 하루는 23시간 밖에 안됩니다 승자는 열심히 일하고, 열심히 놀고, 열심히 쉽니다 패자는 허겁지겁 일하고, 빈둥빈둥 놀고, 흐지부지 쉽니다 승자는 시간을 관리하며 살고, 패자는 사간에 끌려 삽니다 승자는 시간을 붙잡고 달리며, 패자는 시간에 쫓겨서 달립니다
승자는 지는 것도 두려워하지 않습니다 패자는 이기는 것도 은근히 염려합니다 승자는 과정을 소중히 생각하지만, 패자는 결과에만 매달려 삽니다 승자는 순간마다 성취의 만족을 경험하고, 패자는 영원히 성취감을 맛보지 못합니다 승자는 구름 위에 뜬 태양을 보고, 패자는 구름 속의 비를 봅니다
승자는 넘어지면 일어서는 기쁨을 알고, 패자는 넘어지면 재수를 탓합니다 승자는 문제 속에 뛰어듭니다 패자는 문제의 주위에서만 맴돕니다 승자는 눈을 밟아 길을 만듭니다 패자는 눈이 녹기를 기다립니다 승자는 무대 위로 올라가지만, 패자는 관객석으로 내려갑니다 승자는 실패를 거울 삼지만, 패자는 성공을 휴지로 삼습니다 승자는 바람을 돛을 위한 에너지로 삼고, 패자는 바람을 만나면 돛을 거둡니다 승자는 파도를 타고 나갑니다 패자는 파도에 삼켜집니다 승자는 돈을 다스립니다 패자는 돈에 끌려 다닙니다 승자의 주머니 속엔 꿈이 있고, 패자의 주머니 속엔 욕심이 있습니다 승자가 즐겨 쓰는 말은 '다시 한 번 해 보자'이고, 패자가 자주 쓰는 말은 '해 봐야 별 볼 일 없다'입니다
승자는 차라리 용감한 죄인이 되고, 패자는 차라리 비겁한 요행을 믿습니다 승자는 새벽을 깨우며 달리고, 패자는 새벽을 기다리며 앉아 있습니다 승자는 일곱 번 쓰러져도 여덟 번 일어서지만, 패자는 쓰러진 일곱 번을 낱낱이 후회합니다 승자는 달려가면서 계산합니다 패자는 출발도 하기 전에 계산부터 합니다 승자는 다른 길도 있으리라 생각합니다 패자는 길이 오직 하나뿐이라고 고집합니다 승자는 더 좋은 길이 있을 것이라 생각하지만 패자는 갈수록 태산일 것이라 생각합니다 승자의 방에는 여유가 있어 자신의 모습을 여러 가지로 변화시켜 보지만, 패자는 자기 하나가 꼭 들어갈 만한 상자 속에 스스로 가두고 삽니다 승자는 순위나 포상과 관계 없이 열심히 달릴 수 있습니다 패자는 처음부터 끝까지 포상만을 생각합니다 승자는 모든 코스, 즉 순탄한 길이나 험준한 고갯길이나 전체에 의미를 둡니다 패자는 오직 결승점에만 의미를 둡니다 따라서, 승자는 꼴찌를 해도 거기서 의미를 찾지만 패자는 오직 일등을 차지했을 때만 의미를 갖습니다 승자는 달리는 중에도 이미 행복을 느낍니다 그러나 패자는 행복은 경주가 끝나 봐야 결정됩니다 승자는 자기보다 우월한 자를 보면 존경심을 갖고 그로부터 배울 점을 찾습니다 패자는 자기보다 우월한 자를 만나면 질투심을 갖고 그의 갑옷에 구멍 난 곳이 없는지 찾으려 합니다
승자는 자기보다 못한 자를 만나도 친구가 될 수 있습니다 패자는 자기보다 못한 자를 만나면 즉시 지배자가 되려고 합니다 승자는 강한 자에게는 강하고, 약한 자에게는 약합니다 패자는 강한 자에게는 약하고, 약한 자에게는 강합니다 승자는 몸을 바치고, 패자는 혀를 바칩니다 승자는 행동으로 말을 증명합니다 패자는 말로 행위를 변명합니다 승자는 책임지는 태도로 삶을 삽니다 패자는 약속을 남발하며 삶을 허비합니다 승자는 벌 받을 각오로 결단하며 살다가 영광을 받습니다 패자는 영광을 위하여 꾀를 부리다가 벌을 받습니다 승자는 인간을 섬기다가 감투를 쓰며 패자는 감투를 섬기다가 허물을 씁니다
첫 번째는 일을 하건 공부나 독서 아니면 취미 활동을 하든 뚜렷한 목표와 기본규칙을 갖고 있는 경우다. 체스를 예로 들면 체스에는 명확한 룰이 있다.
두 번째는 목표를 성취하는 과정에 즉각적인 피드백을 받을 수 있어야 한다. 예를 들어 체스를 두는 사람은 형세의 판단을 그때그때 피부로 느낄 수 있다는 것이다.
셋째는 지금 하고 있는 일이 자신의 현재 능력에 적합한 난이도의 일이라는 것이다. 이 점이 중요하다. 자신의 능력보다 너무 어려운 과제가 주어졌을 때 사람들은 불안감을 느끼며 반대로 도전을 주지 않는 너무 쉬운 일을 반복할 때에는 따분함을 느낀다고 한다. 몰입은 쉽지도 않지만 그렇다고 너무 어렵지도 않은 과제를 극복하면서 사람들이 자신의 능력을 온전히 쏟아 부을 때 나타나는 현상이다.
몰입할 때 사람들은 하는 일에 푹 빠져 웬만한 고통이나 배고픔, 시간감각조차 느끼지 못하며 잡념이나 불필요한 감정이 끼어들 여지가 없다고 한다. 대부분의 사람들은 자기가 가장 좋아하는 일을 할 때 몰입을 경험하며 시간은 금방 지나가고, 몸과 마음을 여한 없이 쓴다고 한다. 하는 일이 화초 가꾸기이든, 고난도의 외과수술이든, 뜨개질이든, 악기 연주나 스키 타기, 흥미로운 연구, 봉사활동이든 자신이 진정 좋아하는 일을 할 때 사람들은 삶이 가치가 있다고 느끼게 된다. 또한 체력과 정신력이 조화롭게 집중되고 삶의 질을 높게 체험한다는 것이다. 그리고 몰입이 일어날 때마다 한 단계씩 체험의 레벨은 증가한다.
연구실에서 하는 프로젝트를 정리할 필요가 있다는 생각이 들어 이렇게 포스팅을 해본다.(순전히 나를위해^^;)
혹시나 이 분야를 공부하는 분이 계시다면 도움이 될 수도 있다는 생각이 든다.
정리하는 부분은, 컴퓨터 과학의 모델체킹 분야에서 만족성 검사를 위해 쓰이는 도구인
Sat Solver를 효율적으로 구현한 'zchaff' 라는 도구에 대한 논문중 일부인 'The Branching Heuristics' 을
번역 정리한 것이다.
Branching 과정중에 더 이상의 deduction이 불가능한 경우 decide_next_branch()에서 하나의 변수를 선택하여 값을 할당하게 된다. 변수의 선택의 중요성에 대한 것들은 잘 알려져 있다.(이때 사용되는 알고리즘의 선택에 따라 sat solver의 성능에 미치는 영향이 크다)
여러해 동안 많은 branching heuristics 들이 다른 연구자들에 의해 제안되어 왔다
일찍이 나온 branching heuristics 인 Bohm's Heuristic, Maximum Occurrences on Minimum sized clauses(MOM), Jeroslow-Wang 알고리즘들은 욕심 많은 알고리즘으로, 가장 많은 clause에 포함되어 있거나 또는, 가장많은 수의 implication을 가지고 있는 변수를 선택하였다. 이러한 heuristic 들은 각각의 free 변수들의 branching 효과를 평가하기 위한 function으로 사용 되며, 가장 높은 값을 갖는 변수를 선택하게 된다. 대부분의 function들이 clause의 길이 정보 같은 clause database 의 통계에 기반으로 하고 있으므로 '신뢰적이다' 라고 할 수 있지만, 이러한 통계를 기초로한 방법들은 random 한 SAT instance(풀기 어려운 수학적 난제) 에는 유용할지라도 대개는 구조적문제(실세계의 문제)에 대한 관련된 정보들을 얻어내지 못한다.
“The Impact of Branching Heuristics in Propositional Satisfiability Algorithms” 논문의 저자인 Marques-Silva는 literal count heuristic 의 사용을 제안했다. literal count heuristic은 각 단계에서의 나타나는 주어진 변수들중에 풀리지 않은(Unresolved) 변수의 수를 count 한다. 특히, Marques-Silva는 양의 리터럴과 음의 리터럴의 값의 합이 가장 큰 변수를 선택하는 heuristic이 보다 좋은 결과를 나타낸다는것을 실험을 통해 발견했다. 인지할 점은 어떤 면에 있어, 다른 변수는 다른 count 값을 할당할 것이라는 점에서 count들은 상황 종속적이라는 것이다.(매 단계 즉, 그 상황마다 count 값이 달라지기 때문에) 이유는 하나의 clause는 풀리지 않았거나(unresolved) 현재 변수할당에 의존하기 때문이다. 상황 종속적인 이유로 인해 count는 매 순간 decide_next_branch()가 호출될 때 마다, 모든 free variable들이 매번 다시 계산되어야 할 필요가 있다.
solver들이 보다 효율적으로 구현되는 만큼 branching을 위한 count의 계산은 실행시간을 지배한다(점유한다). 그러므로, 보다 효율적이고 효과적인 branching heuristic들이 필요하다.
VSIDS(또 다른 branching heuristic, 이 논문에서 사용하는 알고리즘) - 각각의 literal이 score를 갖는다 - 최초, score는 처음 문제(initial problem)에서 발견된 literal의 수이다. - conflict 발생으로 인해 새로이 생성되는 clause가 clause DB에 들어오면 clause에 포함된 variable들의 값을 증가시켜준다. - 주기적으로, 모든 variable들의 score를 constant 값으로 나눈다. - 가장 높은 scroe를 유지하고 있는 unresolved variable을 선택한다.(우선순위 Queue 와 같은 자료구조를 사용..) 이 알고리즘은 low overhead 이다. 왜냐하면 conflict이 발생했을 때 variable의 score를 update 해주기 때문이다. VSIDS는 다른 Branching Heuristic 알고리즘들과 비교하여 매우 경쟁력 있는 알고리즘이라는 것을 실험을통해 보여준다. 왜냐하면 VSIDS 상태 독립적이기 때문이다. 이 알고리즘은 유지비용이 저렴하다. VSIDS 수백만개의 variable이 있는 문제에 대한 decision 연산에서 매우적은 비율의 실행시간을 점유한다는 것을 실험을 통해 보여 주었다.
보다 최근에, VSIDS에 아이디어를 더 추가한 형태인 "BerkMin: a Fast and Robust SAT-Solver," 알고리즘이 Goldberg and Y. Novikov 에 의해 제안되었다 이 알고리즘은 VSIDS처럼 “active recently" 한 variable 들 중에서 결정하기 위한 decision strategy 이다. VSIDS에서 variable의 활동성은 literal들의 발생(occurrence)과 관련한 score에 의해 평가된다. BerkMin 의 제안자인 Goldberg and Y. Novikov는 conflict가 발생하였을 경우, conflict에 책임이 있는 모든 clause의 모든 literal에 대해서 score를 증가시킨다 정리하자면, zchaff 는 confilct 시점에서 conflict의 장본인 격인 literal이 포함된 clause에 대해서 score를 증가시키지만, BerkMin은 conflict으로 인해 생성된 모든 clause에 대해 scroe를 증가시킨다(차이점) zchaff와 BerkMin 은 둘다 “recent"에 중점을 두고 있다는 것을, 주기적으로 score를 감쇠시킴(상수 값으로 나눔 zchaff -> 2, BerkMin -> 4)으로써 획득(?)하고 있다.
C. M. Li and Anbulagan은 "Heuristics based on unit propagation for satisfiability problems," 논문에서 branching을 위해 look-ahead(예언능력) heuristic의 사용을 제안하였다. 그리고 O. Dubois and G. Dequen는 "A backbone-search heuristic for efficient solving of hard 3-SAT formulae,"라는 논문에서 branching을 위한 backbone-directed heuristic을 제안하였다. 두 개의 알고리즘 모두 어려운 random problem에 대해서 매우 효율적인 것처럼 보인다는 점에서 특징을 공유한다. 하지만, 그들은 또한 VSIDS에 비해 매우 비싼 연산을 한다. random sat problem(수학적으로 풀기 어려운 난제)들은 보통 같은 사이즈의 구조화된 문제(structured problem)에 비해 훨씬 어렵다. 현재의 solver들은 오로지 어려운 random 3-sat 문제(수백개의 variable을 갖는)에 대한 공략에 치우쳐 있다.
정리하자면, 현재의 solver들은 작은 규모의 풀기 어려운 random sat에 치우쳐져 있어서, 실제 문제에 대해 적용할 때 너무 비싼 알고리즘이 되버린다. 왜냐하면 실제의 문제들은 보다 큰 규모의 잘 구조화된 문제들이기 때문이다. 그러므로 그러한 알고리즘은 실제 문제를 풀기위해 받아들여질 수 없는 overhead 이다.
번역한 것을 많이 다듬지 못해서 매끄럽게 읽히지 않는다.(저는 만족..ㅎㅎ)
프로젝트 진행하면서 좀더 다듬어진 글과, 무엇에 관한 얘기를 하는지 좀더 구체화 될 것이라 생각한다.