251108 - Project (1)

TaeHyun·2025년 11월 8일

TIL

목록 보기
97/182

시작하며

오늘은 프로젝트에서 사용될 두 가지의 로직 중 하나를 임시로 만들어 보았다. 아직 return 값을 리스트로 할지 딕셔너리로 할지 등 정해진 내용이 없다 보니 추후에 바뀔 수 있는 부분은 #TODO로 남겨두고 완성했다.

control_logic.py

from itertools import combinations
import json

# config.json 불러오기
with open("config.json") as f:
    config = json.load(f)

# 최적 판매 조합 추천 함수

# battery : 배터리 저장 전력 %
# power : 실시간 생산 전력
# channel_config : 각 채널별 소비 전력
# duration_minutes : 유지 시간

#TODO 반환 형식 처리 / 경우에 따라 리스트 -> 딕셔너리
#TODO config 파일 업데이트 (현재는 테스트용 값 적용)
def get_optimal_combination(battery, power, channel_config=None, duration_minutes=None):
    # 에러 처리
    if not 0 <= battery <= 100:
        raise ValueError("battery 값이 잘못되었습니다.")
    if power < 0:
        raise ValueError("power 값이 잘못되었습니다.")
    
    # 채널별 소비 전력값 설정 (W)
    if channel_config is None:
        channel_config = config["channel_config"]
    # 유지 시간 설정 (minute)
    if duration_minutes is None:
        duration_minutes = config["duration_minutes"]
    # 배터리 용량 설정
    battery_capacity_wh = config["battery_capacity_wh"]

    print("====[최적 판매 조합 계산 실행]====\n")

    # 배터리 W 계산 
    battery_wh = battery_capacity_wh * (battery / 100)
    battery_w = battery_wh / (duration_minutes / 60)

    # 총 가용 전력
    available_power = battery_w + power

    print(f"배터리 잔량 : {battery} % \n실시간 생산량 : {power} W \n총 가용 전력 : {available_power} W\n")

    # 모든 조합 생성
    channels = ["A", "B", "C", "D"]
    all_combinations = []

    # 1개 ~ 4개 조합 생성
    for i in range(1, len(channels) + 1):
        for combi in combinations(channels, i):
            all_combinations.append(list(combi))
    
    # 유효 조합
    valid_combinations = []

    for combi in all_combinations:
        # 조합의 총 소비 전력 계산
        total_power = sum(channel_config[ch] for ch in combi)

        # 현재 가용 전력으로 사용 가능한지 확인
        if total_power <= available_power:
            valid_combinations.append({
                "channels": combi,
                "power": total_power
            })
    
    print(f"유효 조합 수 : {len(valid_combinations)} 개\n")

    # 최적 조합 선택 (가장 많은 채널 활성화 -> 더 큰 전력 소비 기준)
    if not valid_combinations:
        print("판매 가능한 채널이 없습니다.")
        return []
    
    best = max(valid_combinations, key=lambda x: (len(x["channels"]), x["power"]))
    print(f"최적 판매 조합 : {best["channels"]}")
    return best["channels"]

이전 프로젝트들을 거쳐오면서 배운 점과 부족하다 느꼈던 점들을 자연스럽게 많이 사용했던 함수였던 것 같다. 먼저 함수의 구조를 완성한 뒤 config.json 파일을 만들어서 이후 변경될 수 있는 정보들을 관리해주었고, 에러 처리 및 로그 문구 출력을 추가했다. 이후 임의 값을 사용해서 여러 번 테스트를 하여 아쉬운 부분과 의도와 다른 부분을 수정해가며 어느 정도 완성을 하였다.


마치며

코드를 작성하면서도 디테일한 부분을 조금이나마 자연스럽게 처리하는 것 같은 느낌이 들어서 그래도 4개월 정도의 기간 동안 조금이나마 성장을 한 것 같아서 기분이 좋았던 것 같다. 내일 다른 로직 코드도 구현을 한 뒤 머신러닝 데이터를 찾고 전처리까지 어느 정도 할 수 있으면 꽤나 빠르게 진행이 될 것 같다.

profile
Hello I'm TaeHyunAn, Currently Studying Data Analysis

0개의 댓글