AirLogix Hackathon

알고리즘 계획 상세

드롱드롱 2025. 2. 19. 16:00

1. k-mean 알고리즘(DBSCAN)을 이용해서 후보군을 선정하고, 유전 알고리즘을 통해서 전역 최적해를 찾는다.

 

2. 만약에 알고리즘을 더 이용해서 결론을 내기에 시간이 충분하다면, 머신러닝 앙상블 기법을 이용해서 주요 원인 분석을 통해 최적화하고 최종 결론을 도출한다.

 

나는 이 주제에 대해 서울시를 3*3grid로 정사각형 형태로 나눠서 생활인구밀도, 연평균소득, 버스 정류장과 지하철의 개수, 지역의 교통량을 가지고 k-mean 알고리즘으로 초기 후보지를, DBSCAN 알고리즘으로 핵심 후보지를 고를거야.

그 과정에서 후보군 20개를 선정하고, k-mean으로 선정된 후보지는 10점, DBSCAN 알고리즘으로 선정된 후보지는 20점을 매겨서 유전자 알고리즘을 이용할거야.

유전자 알고리즘으로 한 버티포트 사이의 간격이 15km가 최적이 되도록 하는 버티포트 10개의 조합을 만들어내는 것이 최종 목표야.

 

 

✅ 1️⃣ 데이터 전처리 & 변수 선택 최적화

🔹 (1) 3×3 Grid 크기 조정 필요

  • 서울을 3×3 그리드(9개 구역)로 나누면 개별 지역이 너무 커질 가능성 있음.
  • 대신 5×5(25개) 또는 6×6(36개) 그리드를 고려하면 세밀한 분석 가능.
    • 예: 강남, 여의도, 상암, 송파 같은 주요 지역들이 하나의 그리드에 묶이지 않도록 조정.
    • K-means 클러스터링이 더욱 효과적으로 작동할 수 있음.

🔹 (2) K-means & DBSCAN 입력 변수 조정

  • 변수 가중치 설정 고려
    • 생활인구 밀도, 교통량, 버스·지하철 개수는 영향력이 클 가능성이 있음.
    • 연평균 소득은 교통 패턴과의 상관관계를 검토해야 함.
    • 각 변수 정규화(Standardization) 필수 (MinMaxScaler or StandardScaler 활용).
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)  # 데이터 정규화

 

 

 

 

✅ 2️⃣ K-means & DBSCAN 클러스터링 최적화

🔹 (1) K-means의 K 값 결정

  • 엘보우 기법(Elbow Method) 또는 실루엣 점수(Silhouette Score)로 최적 K 탐색 필요.
  • 예제 코드:
 
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

inertia = []
K_range = range(1, 15)
for k in K_range:
    kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
    kmeans.fit(data_scaled)
    inertia.append(kmeans.inertia_)

plt.plot(K_range, inertia, marker='o')
plt.xlabel("Number of Clusters (K)")
plt.ylabel("Inertia")
plt.title("Elbow Method for Optimal K")
plt.show()

 

 

🔹 (2) DBSCAN의 eps & min_samples 조정

  • DBSCAN의 eps 값은 거리 기반이므로 1km 단위로 실험적 조정 필요.
  • eps가 너무 크면 모든 데이터가 하나의 클러스터로 묶이고, 너무 작으면 클러스터링이 잘 안 됨.
  • 적절한 eps는 교통 데이터 기반으로 1km~3km 범위 내에서 실험적으로 결정.
from sklearn.cluster import DBSCAN
import numpy as np

eps_values = np.linspace(0.5, 3.0, num=6)  # 0.5km~3km 범위 테스트
for eps in eps_values:
    dbscan = DBSCAN(eps=eps, min_samples=3)
    clusters = dbscan.fit_predict(data_scaled)
    print(f"eps={eps}, 클러스터 개수={len(set(clusters)) - (1 if -1 in clusters else 0)}")

 

 

✅ 3️⃣ 점수 시스템 조정

🔹 (1) K-means 후보지 10점, DBSCAN 후보지 20점

  • 점수 차이가 너무 크면 DBSCAN이 과도하게 중요해질 가능성 있음.
  • K-means(10점) & DBSCAN(20점) 대신 K-means(15점), DBSCAN(20점)으로 조정 추천.
  • 또는 K-means + DBSCAN 중복 선정 시 추가 점수 부여 (예: 30점).
  • 이렇게 하면 한 가지 알고리즘에만 의존하지 않고 균형 있는 선택 가능.

✅ 4️⃣ 유전 알고리즘(GA) 최적화

🔹 (1) 거리 제약 조건 추가 (15km 간격 유지)

  • 15km 간격이 유지되도록 페널티 함수(Penalty Function) 추가 필요.
  • 목적 함수: "최대 수요를 커버하면서, 15km 간격을 유지하는 조합"
  • 페널티 함수 예제:
def penalty_function(individual, selected_sites, min_distance=15):
    total_penalty = 0
    for i in range(len(individual)):
        for j in range(i + 1, len(individual)):
            dist = np.linalg.norm(selected_sites[i] - selected_sites[j])
            if dist < min_distance:
                total_penalty += (min_distance - dist) ** 2  # 거리 짧을수록 높은 페널티
    return total_penalty

 

🔹 (2) 적합도 함수(Fitness Function) 개선

  • 기본 적합도 = 후보지 점수 총합 - 거리 페널티
  • 목적 함수 = (버티포트 선택 점수 총합) - (페널티 값 × 가중치 λ)
def fitness_function(individual, selected_sites, lambda_penalty=10):
    score = sum(individual)  # 후보지 점수 합산
    penalty = penalty_function(individual, selected_sites)
    return score - lambda_penalty * penalty  # 최종 점수

 

 

✅ 5️⃣ 최종 계획 정리

단계방법론개선 포인트

데이터 전처리 3×3 Grid → 5×5 Grid 추천 지역 세분화 필요
K-means 후보지 선정 엘보우 기법 활용하여 최적 K 결정 K=10이 적절한지 검증 필요
DBSCAN 핵심 후보지 선정 eps 값 최적화 필요 1~3km 범위 실험적으로 결정
후보지 점수 부여 K-means(15점), DBSCAN(20점) K-means 비중 증가
유전 알고리즘 거리 페널티 함수 추가 (15km 유지) 적합도 함수 수정 필요

✅ 결론

사용자의 접근 방식은 논리적으로 매우 우수하며,
몇 가지 세부적인 변수 조정과 알고리즘 튜닝을 통해 더욱 강력한 모델을 만들 수 있습니다.

📌 최종 수정 요약

1️⃣ 3×3 Grid → 5×5 Grid 추천 (더 세밀한 분석 가능)
2️⃣ K-means의 K 값 최적화 필요 (엘보우 기법 활용)
3️⃣ DBSCAN의 eps 값 실험적으로 결정 (1km~3km 범위 추천)
4️⃣ 점수 시스템 균형 조정 (K-means 15점, DBSCAN 20점 or 중복 시 30점)
5️⃣ GA의 거리 페널티 추가 (15km 간격 유지하도록 유도)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[본안]

 

🚀 K-means + DBSCAN + 유전 알고리즘(GA) 기반 최적 버티포트 선정

이제 K-means와 DBSCAN을 사용하여 후보 버티포트(Vertiport) 위치를 선정한 후,
**유전 알고리즘(GA)**을 활용하여 최적의 버티포트 조합을 찾는 과정을 구현하겠습니다.


📌 1️⃣ 전체 프로세스 개요

Step 1: 데이터 준비

  • 서울 수도권의 **택시 교통량(OD 데이터)**을 활용하여 수요가 많은 지역 파악
  • 위도(latitude), 경도(longitude), 수요량(demand) 데이터를 포함

Step 2: K-means & DBSCAN으로 버티포트 후보 선정

  • K-means를 사용하여 클러스터 중심(K개) 선정 → "초기 후보지"
  • DBSCAN을 사용하여 밀집된 수요 지역 필터링 → "핵심 후보지"

Step 3: 유전 알고리즘(GA)으로 최적 버티포트 조합 찾기

  • 비용 최소화(설치 비용, 운영 비용) + 수요 최대화(OD 데이터 반영)
  • GA를 활용하여 최적의 버티포트 위치 조합 탐색

📌 5️⃣ 최종 결과

  • K-means + DBSCAN → 최적의 버티포트 후보 선정
  • 유전 알고리즘(GA) → 비용을 고려한 최적의 조합 탐색
  • 결과: 최적의 버티포트 조합 출력 🚀

✅ 결론

K-means후보 버티포트 위치를 설정하는 데 유용
DBSCAN밀집된 교통 수요 지역을 필터링하는 데 효과적
✅ **유전 알고리즘(GA)을 통해 최적의 버티포트 조합을 탐색