- 1형 당뇨를 가진 Martin Janiczek는 혈당 조절이 음식·인슐린·운동·스트레스·시간대의 지연 효과에 크게 흔들린다고 보고, 이를 시뮬레이션과 최적화 문제로 다루려 함
- 수동 관리는 혈당을 4~10 mmol/l 범위에 두는 것이 목표지만, 음식과 인슐린의 작용 지연 때문에 저혈당·고혈당 보정이 쉽게 과해져 짧은 피드백 루프가 필요함
- Freestyle Libre 같은 연속 혈당 측정기는 14일마다 팔에 장착해 분당 측정값을 제공하지만, 실제 치료 조정은 여전히 3개월마다 평균 데이터를 보고 용량을 바꾸는 방식에 가까움
- SmartCGMS의 C# 래퍼와 GeneticSharp를 이용해 식사·인슐린 일정을 시뮬레이션하고, 저혈당·고혈당 횟수와 혈당 진폭, 인슐린 총량을 기준으로 유전 알고리듬 최적화를 시도함
- 현재 결과는 SmartCGMS의 가상 환자에 대한 실험이며, 실제 본인에게 쓰려면 Freestyle Libre 과거 데이터로 모델 파라미터를 맞추고 장기 지속형 인슐린을 별도로 모델링해야 함
“감”에 의존하는 1형 당뇨 관리
- 1형 당뇨는 췌장이 인슐린을 만들지 못해, 혈당을 세포 에너지로 쓰게 하는 인슐린을 외부에서 공급해야 하는 상태임
- 목표는 혈당을 너무 높지도 낮지도 않은 범위에 두는 것임
- 고혈당은 10 mmol/l 초과로, 장기적으로 몸에 위험함
- 저혈당은 4 mmol/l 미만으로, 단기적으로 몸에 위험함
- 혈당이 높으면 인슐린을 주사하고, 낮으면 당을 먹어야 함
- 수동 조절이 어려운 이유는 여러 지연과 변수가 겹치기 때문임
- 인슐린은 브랜드에 따라 다르지만 혈당을 낮추기까지 약 20분 지연이 있음
- 음식도 종류에 따라 혈당을 올리기까지 약 20분 지연이 있음
- 과일 같은 단순당은 더 빠르게 작용하고 더 빨리 멈춤
- 쌀·감자 같은 복합당은 더 느리게 작용함
- 지방도 당 소화에 영향을 주지만, Janiczek는 이를 계산에서 사실상 제외함
- 식사 약 15분 전에 인슐린을 맞으면 식후 혈당 급등을 줄일 수 있지만, 식사량이 줄거나 음식이 늦게 나오거나 급한 일이 생길 수 있어 보통 식사 직전이나 식후에 맞게 됨
- 당 1g이 혈당을 얼마나 올리는지, 인슐린 1단위가 혈당을 얼마나 낮추는지에 대한 일반 공식을 본인은 알지 못하며, 실제 조절은 전부 감에 가깝다고 봄
- 저혈당 상태에서는 판단력이 떨어지고, 이미 충분히 먹었다는 것을 알아도 몸이 즉시 당을 요구해 과보정으로 이어질 수 있음
- 인슐린은 먹어서 효과를 볼 수 없고 주사하거나 흡입해야 하며, 주사는 불편해 보통 하루 4회 수준으로 제한됨
- 세 끼 식사 대응용 인슐린
- 하루 한 번 장기 지속형 인슐린
- 손가락을 찔러 시험지로 혈당을 측정하는 방식은 고통스럽기 때문에 보통 하루 4~6회로 제한됨
- Freestyle Libre 같은 연속 혈당 측정기(CGM) 는 14일마다 팔에 장착하고, Bluetooth로 휴대폰에 매분 측정값을 보냄
- 운동, 질병, 스트레스, 계절도 당과 인슐린에 대한 몸의 반응을 바꿈
- 일부 당뇨 환자에게는 아침에 혈당이 계속 오르는 dawn phenomenon이 있으며, Janiczek도 이를 겪음
진료 루틴과 닫힌 루프에서 얻은 힌트
- 일상적인 치료는 Freestyle Libre 앱을 자주 열어 혈당이 높아지면 소량의 인슐린을 맞는 방식임
- 앱이 “15 mmol/l가 한 시간째”라고 경고해도 주의를 기울이지 않게 되는 알림 피로가 생김
- 당뇨 전문의와 정한 추천 투여량 예시는 다음과 같음
- 아침: 인슐린 18단위, 당 24g
- 점심: 인슐린 22단위, 당 60g
- 저녁: 인슐린 21단위, 당 60g
- 자기 전: 장기 지속형 인슐린 32단위
- 3개월마다 진료에서 7일·14일·30일 평균을 보고, 예를 들어 오후 15시 무렵 고혈당이 반복되면 점심 전 인슐린을 늘려보라는 식으로 조정함
- Janiczek는 의사가 모델이나 시뮬레이션으로 몸의 파라미터를 찾고 일정을 개선해주길 바라지만, 실제 조정은 여전히 추측에 가깝다고 느낌
- 일부 사람들은 인슐린 펌프와 연속 혈당 측정기를 결합해 혈당 측정값으로 펌프를 제어하는 “closed loop” 또는 “artificial pancreas”를 만듦
- 펌프는 아주 작고 잦은 양의 인슐린을 제공하지만, 그 자체로는 똑똑하지 않음
- 공식적으로 얻기는 매우 어렵거나 불가능하며, FDA 미승인이나 대학 연구 참여 필요 같은 제약이 있음
- Scott Hanselman은 1형 당뇨를 가진 Microsoft 프로그래머로, 개인 펌프와 CGM을 직접 연결하는 #WeAreNotWaiting 흐름을 알리고 있음
- Janiczek는 인슐린 펌프가 없어 같은 방식의 닫힌 루프를 만들 수는 없지만, “기다리지 않는다”는 태도를 자신의 방식으로 적용하려 함
SmartCGMS로 혈당 시뮬레이션 만들기
- 새벽 3시경 저혈당을 고치러 내려가던 중, 과거 혈당값·일상 일정·신체 정보를 넣고 투여량·식사 시간·주사 시간을 상호작용적으로 예측해볼 앱이 왜 없는지 떠올림
- 검색 결과, 포도당과 인슐린 상호작용을 미분방정식으로 다루고 artificial pancreas를 자동 제어하는 논문은 많았지만, Janiczek에게 필요한 것은 하루 4회 주사에 쓸 수 있는 도구였음
- diabetes.zcu.cz의 SmartCGMS를 발견했고, 스크린샷상 본인이 생각한 앱과 관련이 있어 보였음
- SmartCGMS 관련 maintainer에게 이메일을 보낸 뒤, 핵심 SmartCGMS 엔진을 감싼 C# 래퍼를 받음
- 래퍼 API는 간단한 시뮬레이션 루프를 만들 수 있게 해줌
.Create(...): 시뮬레이션 초기화.Step(): 보통 1분 단위로 시뮬레이션 진행.ScheduleInsulinBasalRate(double unitsPerHour): 펌프용 기저 인슐린 투여율 예약.ScheduleInsulinBolus(double units): 단기 작용 인슐린 주사 예약.ScheduleCarbohydratesIntake(double grams): 탄수화물 섭취 예약.Terminate(): 시뮬레이션 종료
- 시뮬레이션 상태에는 현재 혈당과 흡수 대기 중인 인슐린·탄수화물 등이 포함됨
.BloodGlucose: 현재 혈당, 단위는 mmol/l.InterstitialGlucose: 간질액 내 포도당.InsulinOnBoard: 아직 흡수될 인슐린.CarbohydratesOnBoard: 아직 흡수될 당
- 식사와 인슐린 투여를
Intake로 모델링하고, 일정 입력을 받아 여러 날의OutputRow를 생성하는simulate함수를 구성함 - 초기 결과를 CSV로 뽑아 Google Sheets에 넣자 잘못된 축 선택으로 우연한 그래프가 나왔고, 올바른 X축을 쓰자 의미 있는 혈당 그래프가 만들어짐
- 이 단계의 그래프는 Janiczek 본인이 아니라 SmartCGMS가 가진 어떤 환자를 시뮬레이션한 결과임
Windows 앱과 유전 알고리듬 최적화
- CSV와 Google Sheets를 거치지 않기 위해 Windows Forms 앱과 OxyPlot 차트를 만들어 시뮬레이션 결과를 바로 표시함
- 첫날만 보면 장기 지속형 인슐린을 22:00에 맞기 전까지 혈당이 높게 보이므로, 여러 날을 시뮬레이션해 안정화 과정을 확인함
- 3일째부터 그래프가 주기적으로 반복되는 모습을 확인했고, 저혈당·고혈당 범위를 차트에 추가해 목표 범위를 보기 쉽게 만듦
- 현재 SmartCGMS가 시뮬레이션하는 사람에게 Janiczek의 투여량은 맞지 않았고, 심한 저혈당 구간이 나타남
- 이후
NuGet에서genetic을 검색해 GeneticSharp를 설치함 - GeneticSharp를 쓰려면 염색체, 교차, 선택, 집단 크기, 종료 기준, fitness 함수를 제공해야 했음
- fitness 함수는 입력 일정을 3일 시뮬레이션한 뒤 여러 항목을 정규화하고 가중합으로 묶음
- 안정화된 마지막 날의 저혈당 측정 횟수 최소화
- 마지막 날의 고혈당 측정 횟수 최소화
- 마지막 날의 최소·최대 혈당 사이 진폭 최소화
- bolus 인슐린 총량 최소화
- basal 인슐린 투여량 최소화
- 첫 2일 안정화 구간의 저혈당 측정 횟수 최소화
- 첫 2일 안정화 구간의 고혈당 측정 횟수 최소화
- 우선순위는 동일하지 않으며, 장기 저혈당을 가장 중요하게 보고 안정화 중 임시 고혈당을 가장 낮게 둠
- 모든 조합을 정렬하는 방식도 생각했지만, 유전 프로그래밍 라이브러리의 핵심은 전체 공간을 직접 훑지 않는 데 있다고 봄
- 특정 예시 일정에서 인슐린을 0~50단위로 가정하면 네 번의 주사 조합은
51^4, 약 670만 개가 됨 - fitness 함수 안에서 전체 시뮬레이션을 돌리면 1~2초가 걸리지만, 병렬화가 가능해 16코어를 활용함
- 입력이 사실상 순수 함수에 가까워 네 개 정수 입력에 대한 fitness를 memoization했고, 유전 알고리듬이 후반부에 같은 추측을 반복할 때 시간을 많이 절약함
실제 치료 도구가 되기까지 남은 작업
- 최적화 버튼을 추가한 뒤 유전 알고리듬을 돌리자, 시뮬레이션 환자는 4~10 mmol/l 범위 안에서 안정화됨
- 이 결과가 “당뇨를 해결했다”는 뜻은 아니며, 예상치 못한 일과 몸의 변화에 계속 반응해야 하고 고혈당·저혈당은 여전히 발생할 수 있음
- 실제로 유용하려면 상호작용성이 필요함
- 주사나 식사를 추가할 수 있어야 함
- 시간과 양을 위아래·좌우로 바꿀 수 있어야 함
- 그래프가 즉시 바뀌어야 함
- “오늘 점심 전에 더 맞아보고 두 시간 뒤 확인”하거나 “3개월마다 상담”하는 방식보다 짧은 피드백 루프를 제공해야 함
- 가장 큰 과제는 SmartCGMS가 본인 몸을 시뮬레이션하게 만드는 것임
- Freestyle Libre 센서의 과거 혈당 데이터를 내려받아 모델 파라미터를 맞추는 과정이 필요할 것으로 봄
- Janiczek는 수학적 과정은 잘 모르지만 가능하다고 판단함
- 또 다른 문제는 현재 알고리듬이 펌프에 최적화되어 있다는 점임
- Janiczek의 장기 지속형 인슐린은 현재 하루 한 번 전체 투여가 아니라 매시간 전체량의 1/24을 맞는 것처럼 모델링됨
- 특정 인슐린 브랜드와 작동 특성이 소프트웨어에 반영되면
.ScheduleInsulinBasal(double units)같은 형태로 더 정확하게 다룰 수 있기를 기대함
- 마지막으로 Janiczek는 Markov Chains를 글 중에 쓰지 않았지만 여러 실험을 했고, 각 투여량을
-2..+2범위에서 무작위로 바꾼 뒤 fitness가 좋아지면 유지하고 아니면 되돌리는 random walk 영상도 남김