오늘은 프로젝트에서 사용될 두 가지의 로직 중 하나를 임시로 만들어 보았다. 아직 return 값을 리스트로 할지 딕셔너리로 할지 등 정해진 내용이 없다 보니 추후에 바뀔 수 있는 부분은 #TODO로 남겨두고 완성했다.
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개월 정도의 기간 동안 조금이나마 성장을 한 것 같아서 기분이 좋았던 것 같다. 내일 다른 로직 코드도 구현을 한 뒤 머신러닝 데이터를 찾고 전처리까지 어느 정도 할 수 있으면 꽤나 빠르게 진행이 될 것 같다.