---
id: wiki-2026-0508-heuristics
title: Heuristics
category: 10_Wiki/Topics
status: verified
canonical_id: self
aliases: [heuristics, rule of thumb, Kahneman, biases, mental shortcut, fast and frugal]
duplicate_of: none
source_trust_level: A
confidence_score: 0.94
verification_status: applied
tags: [decision-making, heuristics, kahneman, gigerenzer, biases, ai-search]
raw_sources: []
last_reinforced: 2026-05-10
github_commit: pending
tech_stack:
  language: Decision Theory / AI
  applicable_to: [Decision Support, AI Search, UX]
---

# Heuristics

## 매 한 줄
> **"매 fast 의 의 의 'good enough' rule"**. Tversky & Kahneman (heuristics & biases) ↔ Gigerenzer (fast and frugal). 매 AI: 매 A* heuristic, 매 game tree pruning. 매 cognitive: 매 availability, anchoring, representativeness. 매 modern LLM 의 의 의 heuristic-like.

## 매 핵심

### 매 cognitive heuristics (Kahneman)
- **Availability**: 매 easily recalled = more frequent.
- **Anchoring**: 매 first number bias.
- **Representativeness**: 매 stereotype-based.
- **Affect**: 매 emotional shortcut.

### 매 fast and frugal (Gigerenzer)
- **Take-the-best**: 매 single most valid cue.
- **Tallying**: 매 count positive cues.
- **Recognition**: 매 known = better.

### 매 AI
- **A* heuristic**: 매 admissible (lower bound).
- **Alpha-beta pruning**: 매 game tree.
- **Greedy**.
- **Beam search**: 매 LLM decoding.

### 매 응용
1. **AI search / planning**.
2. **Decision support**.
3. **UX defaults**.
4. **Risk assessment**.
5. **Medical triage**.

## 💻 패턴

### A* heuristic (admissible)
```python
import heapq

def a_star(start, goal, neighbors_fn, heuristic_fn):
    """매 heuristic: estimate cost to goal (lower bound)."""
    open_set = [(0 + heuristic_fn(start, goal), 0, start, [start])]
    visited = set()
    
    while open_set:
        f, g, node, path = heapq.heappop(open_set)
        if node == goal: return path
        if node in visited: continue
        visited.add(node)
        
        for nb, cost in neighbors_fn(node):
            if nb not in visited:
                new_g = g + cost
                new_f = new_g + heuristic_fn(nb, goal)
                heapq.heappush(open_set, (new_f, new_g, nb, path + [nb]))
    return None

# 매 example: Manhattan distance for grid
def manhattan(a, b):
    return abs(a[0] - b[0]) + abs(a[1] - b[1])
```

### Alpha-beta pruning
```python
def alphabeta(node, depth, alpha, beta, maximizing):
    if depth == 0 or is_terminal(node): return evaluate(node)
    
    if maximizing:
        v = -float('inf')
        for child in children(node):
            v = max(v, alphabeta(child, depth-1, alpha, beta, False))
            alpha = max(alpha, v)
            if alpha >= beta: break  # 매 prune
        return v
    else:
        v = float('inf')
        for child in children(node):
            v = min(v, alphabeta(child, depth-1, alpha, beta, True))
            beta = min(beta, v)
            if alpha >= beta: break
        return v
```

### Take-the-best (Gigerenzer)
```python
def take_the_best(cues, ordered_by_validity, options):
    """매 매 single most valid cue 의 의 의 의 decide."""
    for cue in ordered_by_validity:
        a_val = cues[options[0]][cue]
        b_val = cues[options[1]][cue]
        if a_val != b_val:
            return options[0] if a_val > b_val else options[1]
    return options[0]  # 매 tie: arbitrary
```

### Greedy (knapsack value/weight)
```python
def greedy_knapsack(items, capacity):
    items = sorted(items, key=lambda i: i.value / i.weight, reverse=True)
    chosen = []
    remaining = capacity
    for item in items:
        if item.weight <= remaining:
            chosen.append(item); remaining -= item.weight
    return chosen
```

### Beam search (LLM decoding)
```python
def beam_search(model, prompt, beam_width=5, max_len=50):
    beams = [(0, prompt)]  # 매 (log_prob, sequence)
    for _ in range(max_len):
        candidates = []
        for log_p, seq in beams:
            next_logits = model(seq)
            top_k = next_logits.topk(beam_width)
            for tok, p in zip(top_k.indices, top_k.values.log_softmax(-1)):
                candidates.append((log_p + p.item(), seq + [tok]))
        beams = sorted(candidates, key=lambda x: x[0], reverse=True)[:beam_width]
    return beams[0][1]
```

### Anchoring effect (detect)
```python
def anchoring_check(estimates, anchor_provided):
    """매 매 anchor 의 매 estimate 의 의 magnitude."""
    if not anchor_provided: return None
    median_est = np.median(estimates)
    distance_from_anchor = abs(median_est - anchor_provided)
    return distance_from_anchor < 0.3 * abs(median_est)  # 매 within 30%
```

### Availability heuristic (debiasing)
```python
def availability_debias(memory_prevalence, base_rate_data):
    """매 'easily recalled' 의 의 의 = 매 frequent 의 X."""
    return {
        'memory_estimate': memory_prevalence,
        'actual_base_rate': base_rate_data,
        'correction_factor': base_rate_data / memory_prevalence,
    }
```

### Recognition heuristic
```python
def recognition_heuristic(option_a, option_b, recognized_set):
    a_known = option_a in recognized_set
    b_known = option_b in recognized_set
    if a_known and not b_known: return option_a
    if b_known and not a_known: return option_b
    return None  # 매 both known or both unknown
```

### Triage (medical, simple)
```python
def triage(vitals):
    if vitals.unconscious: return 'red'
    if vitals.systolic_bp < 90: return 'red'
    if vitals.respiratory_rate > 30: return 'red'
    if vitals.glucose < 60: return 'red'
    if vitals.pain > 7: return 'orange'
    return 'green'
```

### Heuristic evaluation (UX, Nielsen)
```python
NIELSEN_HEURISTICS = [
    'visibility_of_system_status',
    'match_real_world',
    'user_control_freedom',
    'consistency_standards',
    'error_prevention',
    'recognition_over_recall',
    'flexibility_efficiency',
    'aesthetic_minimalist',
    'help_recovery',
    'help_documentation',
]

def usability_audit(interface):
    return {h: evaluate(interface, h) for h in NIELSEN_HEURISTICS}
```

### LLM-as-heuristic
```python
def llm_decision(options, criteria, llm):
    prompt = f"""Apply heuristic: {criteria}.
Options: {options}.
Pick best option (single). Output JSON: {{ choice: ..., reason: ... }}"""
    return json.loads(llm.generate(prompt))
```

## 매 결정 기준
| 상황 | Approach |
|---|---|
| Path planning | A* + admissible heuristic |
| Game tree | Alpha-beta |
| Quick decision | Take-the-best |
| Knapsack-like | Greedy (approximation) |
| LLM decoding | Beam search / nucleus |
| UX | Nielsen heuristics |
| Medical | Triage rules |

**기본값**: 매 admissible heuristic 의 always prefer (A*) + 매 fast-and-frugal in time pressure + 매 LLM 의 modern heuristic substitute.

## 🔗 Graph
- 부모: [[Decision-Making]]
- 변형: [[Heuristics|Heuristic-Search]] · [[Cognitive Bias]]
- Adjacent: [[Foundation-Models]]

## 🤖 LLM 활용
**언제**: 매 fast decision. 매 search. 매 default rule.
**언제 X**: 매 high-stakes precision needed.

## ❌ 안티패턴
- **Inadmissible heuristic in A***: 매 wrong path.
- **Heuristic for high-stakes**: 매 systematic bias.
- **Over-trust availability**: 매 base rate ignore.
- **Anchoring without awareness**: 매 manipulated.

## 🧪 검증 / 중복
- Verified (Tversky & Kahneman, Gigerenzer, Russell & Norvig AI).
- 신뢰도 A.

## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-04-26 | Auto |
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — heuristics + 매 A*/alpha-beta/take-the-best/Nielsen code |
