Koh Young Technology

AOI Inspection Time Optimization — Practical Guide

4th Koh Young AI Contest — ICCAS 2026
📘 This is a supplementary document. For official contest rules, see Contest Rules ★
Quick Start — Get Started in 5 Minutes
It may look complicated, but what you actually need to do is simple. Write your code in the solver/ folder.

Environment Setup (1 min)

# Install required packages pip install -r requirements.txt

Generate Data & Run Baseline (2 min)

# Generate simulation data (8 scenarios x 12 = 96 datasets) python 1_generate_data.py # Run baseline solver on all data -> check CT python 2_run.py --solver greedy
       PCB |  FOVs |  Cover |  Order |   CT (s)
--------------------------------------------------
  PCB0000 |    42 |   True |   True |   28.53
  PCB0001 |    38 |   True |   True |   25.17
      ... |   ... |    ... |    ... |     ...

Write Your Own Code in solver/ (This Is the Core of the Contest!)

Create files freely inside the solver/ folder. Just export a solve function from solver/__init__.py.

# solver/__init__.py from .my_solver import solve # solver/my_solver.py (filename is up to you) def solve(data_folder: str) -> int: # 1. Read input_component.csv, input_size.csv, input_parameter.csv # 2. Determine FOV placement (position, count) # 3. Assign components to FOVs # 4. Determine inspection order (Fiducial -> Barcode -> Normal) # 5. Save output_fov.csv # 6. return FOV count
💡 Start simple: Assigning one FOV per component is a valid result. From there, merge FOVs and improve the ordering.

📊 FOV Placement Optimization — Before vs After

FOV size is determined by the camera field of view — all FOVs are the same size. The key is deciding where and how many same-sized FOVs to place.

Before — Inefficient placement (9 FOVs)
9 FOVs — mostly overlapping, long travel
After — Optimal placement (4 FOVs)
0 1 2 3 4 FOVs — no overlap, short travel
Key: FOV size is fixed — optimize placement to cover all components with fewer FOVs and minimize travel distance

Verify Results (1 min)

# Run my solver -> constraint verification + automatic CT calculation python 2_run.py --solver greedy # Scoring only (evaluate existing output without running solver) python 2_run.py --solver greedy --eval # View result interactively in browser python 3_view.py --solver greedy --dataset S00_sparse_fast_001 --open
Cover = True: All components are included in FOVs
Order = True: Inspection order constraints satisfied
If Cover or Order is False, a constraint is violated → penalty_solver is automatically applied. checker.py will log which constraints were violated.

⚠ Penalty Solver — Automatically Applied on Constraint Violation

If a constraint (cover_all_components or fov_inspection_order) is violated, the Checker automatically runs the penalty_solver. Your existing valid FOVs are kept intact, and additional FOVs are placed only for the uncovered (violating) components to recalculate CT.

1. Detect Uncovered Components
Components not covered by the participant's output_fov.csv, or those violating inspection order, are identified. Properly covered components and their FOVs are retained as-is.
2. Additional FOV Placement (Greedy)
Additional FOVs are placed via greedy method for uncovered components. These extra FOVs are appended to the existing path in nearest neighbor order.
Existing FOVs kept + extra FOVs for uncovered
⚠ Penalty Effect
• Your existing FOV placement is preserved, but additional FOVs increase total FOV count and travel distance.
• The greedy placement of extra FOVs is far from optimal, so CT will be higher than a well-tuned solver.
• Finding better FOV placements while satisfying all constraints is the core challenge of this contest.
🔥 Make sure to cover all components! When penalty_solver is applied, extra FOVs are inserted, increasing CT. Always verify that cover_all_components() = True and fov_inspection_order() = True.

🔍 result.html Viewer — Normal vs Constraint Violation

After running 3_view.py --solver <name>, a result.html file is generated in each <dataset>/<solver>/ folder. Open it in a browser to interactively inspect the PCB layout and timing.

Normal (Cover=PASS, Order=PASS)
PCB Inspection Viewer FOVs: 6 CT: 45.2s PASS PASS Cover Order 0 1 2 3 4 5 Move Capture Recon C3 C2 C1 C0 Timelog (45.2s)
Constraint Violation (Cover=FAIL) — Missing Components + FOV Overflow
PCB Inspection Viewer FOVs: 5 CT: 38.7s FAIL PASS Cover Order 0 1 2 3 4 Outside FOV! No FOV assigned Move Capture Recon C3 C2 C1 C0 Timelog (38.7s)
✅ Normal Output (2_run.py --solver greedy)
PCB | FOVs | Core | Cover | Order | CT (s) ---------------------------------------------------------- PCB_01 | 6 | 10 | True | True | 45.20 PCB_02 | 8 | 12 | True | True | 52.80
❌ Constraint Violation → penalty_solver Auto-applied
PCB | FOVs | Core | Cover | Order | CT (s) ---------------------------------------------------------- PCB_01 | 6 | 10 | True | True | 45.20 PCB_02 | 5 | 12 | False | True | 78.50* ---------------------------------------------------------- AVG | | | | | 61.85 * = penalty_solver applied (1/2 datasets)
When Cover=False or Order=False, penalty_solver places additional FOVs for uncovered components.
The * next to CT indicates penalty was applied. Check error.log for violation details.
💡 Viewer tips: Run python 3_view.py --solver greedy --open to generate and open result.html. Click a FOV to highlight its components and timing. Drag to zoom in, double-click to reset zoom. Use Step filters (Step=0/Step=1) to view by height level.
STEP 1
Generate Data
generator.py
STEP 2
Write solver/
FOV placement + ordering
STEP 3
Verify & Improve
checker.py → check CT
STEP 4
Submit
Submit solver/ folder
🔍 result.html Viewer Usage
Run 3_view.py --solver <name> to generate result.html in each <dataset>/<solver>/ folder. Open it in any browser to access the interactive PCB inspection viewer.

💻 Opening the Viewer

After 2_run.py has been run for a solver, use 3_view.py to render result pages. Each solver's output is in its own subfolder (e.g., simulation_data/S00_sparse_fast_001/greedy/result.html).

# Generate result.html for a specific solver python 3_view.py --solver greedy # View a single dataset and open in browser python 3_view.py --solver greedy --dataset S00_sparse_fast_001 --open # e.g., simulation_data/S00_sparse_fast_001/greedy/result.html

🗺 Viewer Layout

Header Bar

FOVs: Total FOV count
CT: Calculated Cycle Time (seconds)
Cover: PASS
Order: PASS
Cover: FAIL — uncovered components exist
Step Filters: All Step=0 Step=1 — click to show only that step's FOVs/components; others are dimmed
PCB Inspection Viewer FOVs: 42 CT: 28.53s Cover: PASS Order: PASS All Step=0 Step=1 PCB Layout Step=1 region 0 1 2 3 4 5 6 7 Side FOV Selected FOV Timing (Gantt Chart) Move Capture Recon Inspect 5s 10s 15s 20s Core 4 Inspect Core 3 Inspect Core 2 3D Recon Core 1 3D Recon Core 0 Camera ... CT = 28.53s FOV #4

Left Panel — PCB Layout

  • FOV rectangles: Each FOV is shown as a rectangle on the PCB board
  • Components: Individual components inside their FOVs (gray=normal, green=fiducial, purple=barcode)
  • Side FOV: FOVs containing side components show a blue dashed inner region
  • Error FOV: Components outside FOV bounds are highlighted with a red border
  • Trajectory: Inspection path connecting FOV centers as a polyline
  • Step region: Step=1 areas shown with ochre dashed outline

Right Panel — Timing Gantt Chart

  • Core 3+ (Inspect): Inspection time (orange)
  • Core 1~2 (3D Recon): 3D Reconstruction time (red)
  • Core 0 (Camera): Move (blue) + Capture (green) alternating
  • CT: Total pipeline completion = last core finish time

🖱 Interaction Controls

🖱
Click a FOV
Highlights its components on the PCB and corresponding timing bars on the Gantt chart
🔍
Drag to Zoom
Click and drag on either panel to zoom into a region for detailed inspection
Double-Click to Reset
Double-click anywhere to reset the zoom level back to the full view

🎨 Color Coding Reference

Color Element Meaning
Green Component Fiducial mark (type=2)
Purple Component Barcode (type=1) — or error component (filled red with X mark)
Gray Component Normal component (type=0)
Blue Component Side component
Orange FOV Currently selected / highlighted FOV
Red border FOV Error FOV — contains components that violate coverage constraints
× Red + X Component Error component — extends outside its assigned FOV boundary or is unassigned

📊 Understanding the Gantt Chart

The right panel displays a pipeline timing diagram showing how inspection tasks are distributed across CPU cores:

Move (stage repositioning)
Capture (camera image acquisition)
Reconstruction (3D height map)
Inspection (defect detection)
Core Assignment
  • Core 3+ (C3, C4, ...): Handle inspection of reconstructed data
  • Core 1–2 (C1, C2): Handle reconstruction of captured images
  • Core 0 (C0): Dedicated to camera — alternates between Move and Capture
Pipeline Behavior
  • Tasks execute in a pipelined fashion across cores
  • More cores = more parallel inspection, reducing CT
  • The bottleneck determines overall CT — balance is key
  • CT is measured from the first Move to the last Inspection completion
💡 Pro tip: Use the viewer to identify bottlenecks in your solution. If the Gantt chart shows long idle gaps between bars, your FOV ordering or placement may benefit from optimization. Comparing result.html across different solver iterations helps you visualize improvements.
2 Contest Format & Scoring
The problem is published first, then participants are recruited. Write your code in the solver/ folder.

🏆 Scoring Method

Score = AVGi=all ( Cycle Timei + Computation Timei )    (lower is better)

Each dataset has a fixed max_core (random 4–16). The Checker uses it directly — no core sweep. Cycle Time is the inspection time; Computation Time is the solver's execution time. For the full formula, examples, and detailed explanation, see Problem Description §2 “Contest Format & Scoring”.

💡 Key insight: Core count is a given constraint. Focus on minimizing FOV count and optimizing visit order while keeping computation time low.

Important Notes

Prohibited: It is forbidden to call the provided ky_solver/ (Koh Young baseline) to generate or update solutions.
Participants must generate output_fov.csv using their own algorithm. Directly or indirectly calling functions from ky_solver/ to produce results is grounds for disqualification.
However, using it for purposes that do not directly contribute to the solution output, such as generating training data, is permitted.
Permitted: External libraries (numpy, scipy, OR-Tools, etc.) may be used freely. Using AI tools (ChatGPT, Claude, Copilot, etc.) for code writing is also allowed.

🖥 Evaluation Environment

  • All teams' code runs on the same evaluation server
  • CPU Only — GPU not available
  • Time limit applied per dataset (results up to that point are used if exceeded)
  • Participants develop freely on their own PC; final submission is the solver/ folder
Eliminating hardware differences: Since all teams run on the same server, there is no advantage or disadvantage based on hardware. The contest is purely about algorithm efficiency.

📦 Provided Materials

File / FolderPurpose
ky_solver/Koh Young baseline solver (compiled binary, source not provided)
solver/Participant code folder — write your code here freely
utils/checker.pyConstraint verification + automatic CT calculation
utils/generator.pySimulation data generator (unlimited training data)
1_generate_data.pySimulation data generator
2_run.pyRun solver & score (per solver)
3_view.pyRender result.html viewer (per solver)
simulation_data/96 datasets (8 scenarios × 12)
# solver/__init__.py from .my_solver import solve # solver/my_solver.py (filename is up to you) def solve(data_path: str) -> int: # Input: data folder path # Process: FOV placement + component assignment + order determination # Save: output_fov.csv # Return: FOV count (int) ...
With the generator + checker open-sourced, RL/ML-based approaches are possible. Traditional optimization, AI, hybrid — any method is welcome.
📖 Glossary
TermDescription
AOIAutomated Optical Inspection — equipment that automatically inspects electronic components on PCBs using cameras
PCBPrinted Circuit Board — the board on which electronic components are mounted
FOVField of View — the rectangular area captured in a single camera shot
CTCycle Time — total inspection time for one PCB (seconds)
Computation TimeSolver computation time (seconds)
CoreParallel processing unit in the inspection pipeline. C0=Capture/Move, C1~C2=3D Reconstruction, C3+=Inspection
PipelineParallel structure where Capture → 3D Reconstruction → Inspection run concurrently across multiple Cores
FiducialReference point defining the PCB coordinate origin (type=2). Must be placed exclusively in the first FOV
BarcodePCB model identifier (type=1). Inspected right after Fiducial
Side CameraCamera capturing solder fillet from an angled view. Side FOV = 1/2 of Top FOV size
StepHeight regions on PCB (step=0, 1). Transitioning between steps adds +5s penalty
Penalty SolverGreedy correction auto-applied on constraint violations. Significantly increases CT
Koh Young Technology

AOI 검사시간 최적화 — 실무 가이드

제4회 고영 AI 경진대회 — ICCAS 2026
📘 이 문서는 보조 자료입니다. 공식 대회 규칙은 대회규칙 ★을 참고하세요.
Quick Start — 5분 안에 시작하기
복잡해 보이지만, 실제로 해야 할 일은 단순합니다. solver/ 폴더에 코드를 작성하면 됩니다.

환경 설치 (1분)

# 필수 패키지 설치 pip install -r requirements.txt

데이터 생성 & 베이스라인 실행 (2분)

# 시뮬레이션 데이터 생성 (8 시나리오 x 12 = 96개) python 1_generate_data.py # 베이스라인 솔버로 전체 데이터 실행 → CT 확인 python 2_run.py --solver greedy
       PCB |  FOVs |  Cover |  Order |   CT (s)
--------------------------------------------------
  PCB0000 |    42 |   True |   True |   28.53
  PCB0001 |    38 |   True |   True |   25.17
      ... |   ... |    ... |    ... |     ...

solver/ 폴더에 나만의 코드 작성 (여기가 대회의 핵심!)

solver/ 폴더 안에 자유롭게 파일을 만드세요. solver/__init__.py에서 solve 함수를 export하면 됩니다.

# solver/__init__.py from .my_solver import solve # solver/my_solver.py (파일명 자유) def solve(data_folder: str) -> int: # 1. input_component.csv, input_size.csv, input_parameter.csv 읽기 # 2. FOV 배치 결정 (위치, 개수) # 3. 부품을 FOV에 할당 # 4. 검사 순서 결정 (Fiducial → Barcode → 일반) # 5. output_fov.csv 저장 # 6. return FOV 개수
💡 처음엔 간단하게: 모든 부품마다 FOV 1개씩 배치하는 것도 유효한 결과입니다. 거기서부터 FOV를 합치고, 순서를 개선해 나가면 됩니다.

📊 FOV 배치 최적화 — Before vs After

FOV 크기는 카메라 시야각으로 결정되므로 모든 FOV는 동일한 크기입니다. 핵심은 같은 크기의 FOV를 어디에, 몇 개 배치하느냐입니다.

Before — 비효율 배치 (FOV 9개)
FOV 9개 — 대부분 중복, 이동 거리 김
After — 최적 배치 (FOV 4개)
0 1 2 3 FOV 4개 — 중복 없음, 이동 거리 짧음
핵심: FOV 크기는 고정 — 위치만 조절하여 적은 수의 FOV로 모든 부품을 커버하고, 이동 경로를 최소화하는 것이 목표

결과 검증 (1분)

# 내 solver 실행 → 제약 검증 + CT 자동 계산 python 2_run.py --solver greedy # 채점만 (solver 실행 없이 기존 output 평가) python 2_run.py --solver greedy --eval # 결과 인터랙티브 뷰어 열기 python 3_view.py --solver greedy --dataset S00_sparse_fast_001 --open
Cover = True: 모든 부품이 FOV에 포함됨
Order = True: 검사 순서 제약 통과
Cover 또는 Order가 False이면 제약 위반 → penalty_solver가 자동 적용됩니다. checker.py가 어떤 제약을 위반했는지 로그로 알려줍니다.

⚠ Penalty Solver — 제약 위반 시 자동 적용

제약 조건(cover_all_components 또는 fov_inspection_order)을 위반하면 Checker가 penalty_solver를 자동 실행합니다. 참가자의 solver 출력 중 정상적인 FOV는 유지하고, 제약을 위반한(커버되지 않은) 부품에 대해서만 추가 FOV를 배치하여 CT를 재계산합니다.

1. 미커버 부품 탐지
참가자의 output_fov.csv에서 커버되지 않은 부품 또는 검사 순서를 위반한 부품을 식별합니다. 정상적으로 커버된 부품과 FOV는 그대로 유지됩니다.
2. 추가 FOV 배치 (그리디)
미커버 부품에 대해 그리디 방식으로 추가 FOV를 배치합니다. 추가된 FOV는 기존 경로 끝에 nearest neighbor 순서로 연결됩니다.
기존 FOV 유지 + 미커버 부품용 FOV 추가
⚠ 페널티 효과
• 참가자의 기존 FOV 배치는 유지되지만, 추가 FOV로 인해 총 FOV 수와 이동 거리가 증가합니다.
• 추가 FOV의 그리디 배치는 최적과 거리가 있으므로, 잘 만든 solver 대비 CT가 증가합니다.
• 제약 조건을 만족하면서 더 나은 FOV 배치를 찾는 것이 대회의 핵심입니다.
🔥 반드시 모든 부품을 커버하세요! penalty_solver가 적용되면 추가 FOV가 삽입되어 CT가 증가합니다. cover_all_components() = Truefov_inspection_order() = True를 항상 확인하세요.

🔍 result.html Viewer — 정상 vs 제약 위반

3_view.py --solver <name> 실행 후 각 <dataset>/<solver>/ 폴더에 result.html이 생성됩니다. 브라우저에서 열면 PCB 배치와 Timing을 인터랙티브하게 확인할 수 있습니다.

정상 (Cover=PASS, Order=PASS)
PCB Inspection Viewer FOVs: 6 CT: 45.2s PASS PASS Cover Order 0 1 2 3 4 5 Move Capture Recon C3 C2 C1 C0 Timelog (45.2s)
제약 위반 (Cover=FAIL) — 부품 누락 + FOV 이탈
PCB Inspection Viewer FOVs: 5 CT: 38.7s FAIL PASS Cover Order 0 1 2 3 4 FOV 이탈! FOV 미할당 Move Capture Recon C3 C2 C1 C0 Timelog (38.7s)
✅ 정상 출력 (2_run.py --solver greedy)
PCB | FOVs | Core | Cover | Order | CT (s) ---------------------------------------------------------- PCB_01 | 6 | 10 | True | True | 45.20 PCB_02 | 8 | 12 | True | True | 52.80
❌ 제약 위반 → penalty_solver 자동 적용
PCB | FOVs | Core | Cover | Order | CT (s) ---------------------------------------------------------- PCB_01 | 6 | 10 | True | True | 45.20 PCB_02 | 5 | 12 | False | True | 78.50* ---------------------------------------------------------- AVG | | | | | 61.85 * = penalty_solver applied (1/2 datasets)
Cover=False 또는 Order=False이면 미커버 부품에 대해 penalty_solver가 추가 FOV를 배치합니다.
CT 옆의 * 표시가 penalty가 적용된 데이터임을 나타냅니다. error.log에서 위반 내용을 확인할 수 있습니다.
💡 Viewer 활용법: python 3_view.py --solver greedy --open으로 result.html을 생성하고 열 수 있습니다. FOV 클릭 시 해당 부품과 Timing이 하이라이트됩니다. 드래그로 확대, 더블클릭으로 원래 크기로 돌아갑니다. Step 필터(Step=0/Step=1)로 단차별 보기도 가능합니다.
STEP 1
데이터 생성
generator.py
STEP 2
solver/ 작성
FOV 배치 + 순서
STEP 3
검증 & 개선
checker.py → CT 확인
STEP 4
제출
solver/ 폴더 제출
🔍 result.html Viewer 사용법
3_view.py --solver <name>을 실행하면 각 <dataset>/<solver>/ 폴더에 result.html이 생성됩니다. 브라우저에서 열면 PCB 배치와 Timing을 인터랙티브하게 확인할 수 있습니다.

Viewer 생성

# 특정 solver의 result.html 생성 python 3_view.py --solver greedy # 특정 데이터셋만 생성하고 브라우저에서 열기 python 3_view.py --solver greedy --dataset S00_sparse_fast_001 --open # 생성된 viewer 위치 # simulation_data/S00_sparse_fast_001/greedy/result.html

화면 구성

상단 — 헤더 바

FOVs: 총 FOV 개수
CT: 계산된 Cycle Time (초)
Cover: PASS
Order: PASS
Cover: FAIL — 미커버 부품 존재
Step 필터: All Step=0 Step=1 — 클릭하면 해당 Step의 FOV/부품만 표시, 나머지는 흐리게 처리
PCB Inspection Viewer FOVs: 42 CT: 28.53s Cover: PASS Order: PASS All Step=0 Step=1 PCB Layout Step=1 영역 0 1 2 3 4 5 6 7 Side FOV 선택된 FOV Timing (Gantt Chart) Move Capture Recon Inspect 5s 10s 15s 20s Core 4 Inspect Core 3 Inspect Core 2 3D Recon Core 1 3D Recon Core 0 Camera CT = 28.53s FOV #4

좌측 — PCB 배치 패널

  • FOV 박스: 사각형으로 표시. 번호는 검사 순서
  • 부품: FOV 내부의 작은 사각형 (회색=일반, 녹색=fiducial, 보라=barcode)
  • Side FOV: Side 카메라 부품이 있는 FOV에 파란 점선 영역 표시
  • 에러 FOV: 부품이 FOV 밖으로 이탈하면 빨간 테두리 + 빨간 배경
  • 이동 경로: FOV 간 이동 궤적이 선으로 연결됨
  • Step 영역: Step=1 구간은 황토색 점선으로 표시

우측 — Timing 패널 (Gantt Chart)

  • Core 3+ (Inspect): 검사 시간 (주황)
  • Core 1~2 (3D Recon): 3D 복원 시간 (빨강)
  • Core 0 (Camera): Move(파랑) + Capture(녹색) 교대 표시
  • CT: 전체 파이프라인 완료 시간 = 마지막 Core의 종료 시점

인터랙션 (마우스 조작)

동작PCB 패널Timing 패널
클릭 FOV 선택 → 주황색 하이라이트
해당 FOV의 부품이 강조 표시
해당 FOV의 Capture/Recon/Inspect 구간 하이라이트
드래그 영역 선택 → 확대 (Zoom In)
세밀한 부품/FOV 배치 확인 가능
더블클릭 전체 보기로 복원 (Zoom Reset)
빈 영역 클릭 FOV 선택 해제 타이밍 하이라이트 해제

🎨 FOV 색상 의미

연녹색 — type=2 (Fiducial 포함 FOV)
연보라 — type=1 (Barcode 포함 FOV)
연회색 — type=0 (일반 FOV)
주황 — 현재 선택된 FOV
빨강 테두리 — 에러 FOV (부품 이탈)
파랑 점선 — Side 카메라 FOV 영역

🐛 Viewer로 디버깅하기

부품 누락 확인: Cover=FAIL이면 빨간색 부품이 FOV 밖에 떨어져 있음. 드래그 확대로 정확한 위치 확인 → FOV 배치 수정
경로 최적화: 이동 경로 선이 많이 교차하면 방문 순서가 비효율적. nearest-neighbor나 TSP 기법으로 개선 여지 확인
📊 파이프라인 병목: Timing 패널에서 Core 0(Camera)에 긴 빈 시간이 있으면 이동 경로 비효율. Recon/Inspect에 빈 시간이 많으면 FOV 수를 줄일 여지
Step 구분 확인: Step 필터로 Step=0 / Step=1 FOV를 각각 확인. Step 순서 제약(Step=0 → Step=1)이 올바른지 시각적으로 검증
2 대회 형식 및 채점
문제를 먼저 공개하고 참가자를 모집합니다. solver/ 폴더에 코드를 작성하면 됩니다.

🏆 채점 방식

Score = AVGi=all ( Cycle Timei + Computation Timei )    (낮을수록 우수)

각 데이터셋에 max_core가 고정 입력(랜덤 4~16)으로 주어지며, Checker가 그대로 사용합니다 (Core 수 탐색 없음). Cycle Time은 검사 시간, Computation Time은 solver 계산 시간입니다. 수식, 예시, 상세 설명은 문제설명 §2 “대회 형식 및 채점”을 참조하세요.

💡 핵심: Core 수는 고정 입력이므로, FOV 수를 줄이고 방문 순서를 최적화하되 계산 시간도 함께 고려해야 합니다.

유의사항

금지: 제공된 ky_solver/(Koh Young 베이스라인)를 호출하여 해(solution)를 생성하거나 업데이트하는 방식은 금지합니다.
참가자는 자체 알고리즘으로 output_fov.csv를 생성해야 하며, ky_solver/의 함수를 직접·간접적으로 호출하여 결과를 얻는 것은 실격 사유에 해당합니다.
단, 학습용 데이터 생성 등 솔루션 출력에 직접 사용하지 않는 목적으로의 활용은 허용됩니다.
허용: 외부 라이브러리(numpy, scipy, OR-Tools 등) 자유롭게 사용 가능합니다. AI 도구(ChatGPT, Claude, Copilot 등)를 활용한 코드 작성도 허용됩니다.

🖥 평가 환경

  • 동일 평가 서버에서 모든 팀의 코드를 실행
  • CPU Only — GPU 사용 불가
  • 데이터당 시간 제한 적용 (초과 시 해당 시점까지의 결과 사용)
  • 참가자는 자기 PC에서 자유롭게 개발, 최종 제출은 solver/ 폴더
PC 환경 차이 해소: 모든 팀이 동일한 서버에서 실행되므로, 하드웨어 성능에 따른 유불리가 없습니다. 알고리즘 효율성만으로 경쟁합니다.

📦 제공 자료

파일/폴더역할
ky_solver/Koh Young 베이스라인 솔버 (컴파일 바이너리, 소스 비공개)
solver/참가자 코드 폴더 — 여기에 자유롭게 작성
utils/checker.py제약 조건 검증 + CT 자동 계산
utils/generator.py시뮬레이션 데이터 생성기 (학습 데이터 무한 생성)
1_generate_data.py시뮬레이션 데이터 생성기
2_run.pySolver 실행 & 채점 (solver별 분리)
3_view.pyresult.html 뷰어 생성 (solver별)
simulation_data/96개 데이터셋 (8 시나리오 × 12)
# solver/__init__.py from .my_solver import solve # solver/my_solver.py (파일명 자유) def solve(data_path: str) -> int: # 입력: data 폴더 경로 # 처리: FOV 배치 + 부품 할당 + 순서 결정 # 저장: output_fov.csv # 반환: FOV 개수 (int) ...
generator + checker 공개로 RL/ML 등 학습 기반 접근이 가능합니다. 전통 최적화, AI, 하이브리드 어떤 방법이든 자유입니다.
📖 용어 사전 (Glossary)
용어설명
AOIAutomated Optical Inspection — PCB 위 전자 부품을 카메라로 자동 검사하는 장비
PCBPrinted Circuit Board — 전자 부품이 실장되는 인쇄 회로 기판
FOVField of View — 카메라가 한 번에 촬영하는 직사각형 영역
CTCycle Time — PCB 1장의 전체 검사에 소요되는 시간 (초)
Computation TimeSolver 계산 시간 (초)
Core검사 파이프라인의 병렬 처리 단위. C0=촬상/이동, C1~C2=3D 복원, C3+=검사
Pipeline촬상 → 3D 복원 → 검사를 여러 Core가 동시에 수행하는 병렬 구조
FiducialPCB 좌표계 원점을 정의하는 기준점 (type=2). 반드시 첫 번째 FOV에 단독 배치
BarcodePCB 모델 구분자 (type=1). Fiducial 다음으로 검사
Side 카메라부품 측면 납땜을 비스듬히 촬영하는 카메라. Side FOV = Top FOV의 1/2 크기
Step (단차)PCB 위 높이가 다른 영역 (step=0, 1). 단차 전환 시 +5초 페널티
Penalty Solver제약 위반 시 자동 실행되는 greedy 보정. CT가 크게 증가함