W2 · ATTACK.md
3D 폴딩 / 공간 · 2503 단백질폴딩
W2 — 2503 단백질폴딩 — 공략 우선순위 (ATTACK)
최대화 문제 + verify 실패 즉사(0점). 겹침 0건 + 범위 내 보장이 절대 1차.
1. 합법성 0건 달성 (1차 목표 — 0점 회피)
verify() 실패 → gTotalScore=0 (PENALTY가 아닌 0) + 이후 TC 스킵. - 합법 조건: (a) 모든 원소 [0,100)³, (b) 겹침 0건. - 초기 상태(일자 배치)는 합법 → 아무 fold 안 하면 최소 점수 보장(낮지만 0은 아님). - fold 후 반드시 protein()으로 읽어 점검 → 위반 시 해당 fold 역방향 복구 또는 마지막 합법 상태로 복원. - 안전한 폴딩: 중앙(50) 부근에서 회전, 범위 여유(±50) 내에서만. 큰 회전은 범위 위반 위험.
2. SCORE 기여도 분해 — "가장 점수 많이 좌우하는 항"
SCORE = Σ weight(a)×weight(b) for 6-방향 인접. - 가중치: H=1, C=2, O=5, N=10, S=30. - S×S=900, S×N=300, N×N=100 vs H×H=1. - 무거운 원소(S/N/O)의 인접 밀집이 압도적 고득점. - 아미노산별 원소 분포: 대부분 H(1) 다수 + 소수 C/O/N/S. S는 특정 아미노산만(type 4,12 = S 포함). - 전략: S/N 원소를 중심으로 클러스터링, 나머지를 외곽 배치.
3. 시간 버짓 배분
- 채점기 clock() 없음. MAX_TC=10, 각 TC 원소 ~150개.
process()진입 시 clock() 측정, TC당 0.2~0.3초.- fold + protein() 읽기 + 점수 계산이 한 사이클. 수천~수만 회 가능.
4. 그리디 초기해 + 국선 최적화 베이스라인
초기해 전략
- 초기 일자 상태에서 시작.
- fold_amino로 아미노산들을 중앙으로 접어 구형/직육면체 클러스터 형성 시도.
- 무거운 원소가 인접하도록 아미노산 방향 조정.
- 각 fold 후 protein() 읽기 → 범위/겹침 점검 → 점수 측정.
SA / Local Search
- 이웃: 무작위 fold_amino/fold_element (axis, front, anticlockwise 조합).
- 수용: 점수 증가 또는 SA 확률 exp(Δ/temp).
- 복구: 위반 시 역방향 fold로 되돌림.
- 주의: fold는 누적 → 되돌리려면 정확한 역연산(같은 base, 반대 axis/방향) 필요.
베이스라인
- 단순 compactProtein(중앙 정렬)은 실제 효과 없음 (user.cpp 버그 — user 로컬 백업만 이동, gElements는 안 움직임).
- 실전에서는 fold로만 조작. 초기 일자 상태 + 소수 fold로 점수 향상 시도.
- 합법 보장 최우선 → 보수적으로 fold 적용.
목표
- 0점 회피(합법 100%) + 무거운 원소 인접 클러스터링으로 점수 향상.
- 단순히 일자 상태 유지해도 최소 점수는 확보. fold는 신중하게.