- μ£Όμ : 24μ μκΈμ²΄κ³λ₯Ό μν μ€μΈ AED μ΅μ μμΉ μ μ
- κΈ°κ° : 2022.11. ~ 2022.12
- μ΅μ’ μμ : 1 st (50 teams)
- κ΄λ ¨ κΈ : λΈλ‘κ·Έ
- 2023.08.05 : μ½λ refactoring
- 2023.08.31 : λΈλ‘κ·Έ λ§ν¬ μΆκ°
- νμ¬ AEDλ 곡곡기κ΄κ³Ό μ§νμ² μ λ°μ§λμ΄ ν΄κ·Όμκ° λ μ΄ν λλΆλΆ μ¬μ© λΆκ°ν¨
- μ΄μ λλ문ꡬλ₯Ό κΈ°μ€μΌλ‘ λλΆλΆμ μ§μμμ 24μ λ΄λ΄ AEDλ₯Ό μ¬μ©ν μ μκ² μ€μΈ μ€λ§νΈ AEDλ₯Ό μ€μΉνκ³ μ ν¨
AED μ ν¨λ³μ(200m) μκ°ν, μμλ κ³μ° λ° λͺ¨λΈλ§μ μνμ¬ 200 buffer, 100 bufferλ₯Ό μμ±
- Example code:
# geodata λ³κ²½ buffer μμ± - κΈ°μ‘΄ 24μκ° κ°λ AEDμμ μ ν¨κ±°λ¦¬ κΈ°λ° μμλ b(buffer_100)
gs = gpd.GeoSeries.from_wkt(df['λ
Έλ WKT'])
df_dobo_100 = gpd.GeoDataFrame(df, geometry = gs, crs = 'epsg:4326')
df_dobo_100 = df_dobo_100.set_geometry('geometry')
df_dobo_100['buffer_100'] = df_dobo_100.to_crs('epsg:5179').buffer(100).to_crs('epsg:4326')
df_dobo_100 = df_dobo_100.set_geometry('buffer_100')
df_dobo_100['buffer_100_coordinates'] = df_dobo_100['buffer_100'].apply(polygon_to_coordinates)
μμ€λ¬Όμ κ°μ νΉμ μμ° λΉμ©μ΄ μ νλμμΒ λ, μμ€λ¬Όμ μλΉμ€ μμ€μ λμ΄κΈ° μνμ¬ μ£Όμ΄μ§ μ μ½μ‘°κ±΄ νμμ μμ€λ¬Όμ΄ 컀λ²νλ μμλμ μ΅λννλ μμΉλ₯Ό μ μ νλ λ°©λ²
- μμμ§μ ν보μ§λ λμΌ
- AED μ ν¨κ±°λ¦¬λ 200m
- λ보 λ Έλ-λ§ν¬ λ°μ΄ν°λ₯Ό ν보μ§λ‘ νμ©
λλ³, μ±λ³, λμ΄λλ³ μΈκ΅¬λ°μ΄ν°μ ν΄λΉ κ΅¬κ° λ³ μ¬μ μ§ λ°μλμ κ³±ν weighted sum
pop = pd.read_csv('./λλ문ꡬ_λλ³_μ°λ Ήλλ³_μΈκ΅¬μ.csv')
cols = pop.columns
pop['male'] = pop[cols[2]] * 0.01 + pop[cols[3]] * 0.026 + pop[cols[4]] * 0.039 + pop[cols[5]] * 0.075 + pop[cols[6]] * 0.139 + pop[cols[7]] * 0.7
pop['male'] = pop['male'] / pop['male'].max()
pop['female'] = pop[cols[8]] * 0.01 + pop[cols[9]] * 0.026 + pop[cols[10]] * 0.039 + pop[cols[11]] * 0.075 + pop[cols[12]] * 0.139 + pop[cols[13]] * 0.7
pop['female'] = pop['female'] / pop['female'].max()
pop['a'] = 0.64 * pop['male'] + 0.36 * pop['female']
μ£Όλ³μ κΈ°μ‘΄ 24μκ° κ°λ AEDκ° λͺκ° μκ³ μΌλ§λ κ°κΉκ² μλκ°
total = pd.DataFrame()
for i in tqdm(df_dobo_100.index):
db = df_dobo_100.loc[i, 'buffer_100']
num = []
area = []
for j in aed_24_100.index:
aed = aed_24_100.loc[j, "buffer_100"]
num.append(db.intersects(aed))
if db.intersects(aed) == True:
area.append(db.intersection(aed).area)
info = {"intersects_num" : sum(num), "intersects_area" : sum(area)}
total = total.append(info, ignore_index=True)
# μ κ·ν λ° μ΅μ’
μμλ μ°μΆ
total['intersects_num_scaled'] = (total['intersects_num'].max() - total['intersects_num']) / total['intersects_num'].max()
total['intersects_area_scaled'] = (total['intersects_area'].max() - total['intersects_area']) / total['intersects_area'].max()
df_dobo_200['b'] = total['intersects_num_scaled'].values
df_dobo_200['c'] = total['intersects_area_scaled'].values
df_dobo_200['w'] = 0.4 * df_dobo_200['a'] + 0.3 * df_dobo_200['b'] + 0.3 * df_dobo_200['c']
mlp(mixed integer programming)μ ν΅ν μ΅μ ν
temp = df_dobo_200.copy()
temp['λ
Έλ ID'] = pd.to_numeric(temp['λ
Έλ ID'])
temp['w'].index = temp['λ
Έλ ID']
w = temp['w']
model = Model()
model.max_gap = 0.0
x = [model.add_var(name = "x%d" % i, var_type = BINARY) for i in temp['λ
Έλ ID']] # μ μ½ μ‘°κ±΄ 3 : ν¬μΈνΈμ μ€μΉλλκ°
y = [model.add_var(name = "y%d" % i, var_type = BINARY) for i in temp['λ
Έλ ID']] # μ μ½ μ‘°κ±΄ 4 : ν¬μΈνΈκ° 컀λ²λλκ°
model.objective = maximize(xsum(w[i] * model.vars['y%d' %i] for i in temp['λ
Έλ ID'])) # λͺ©μ ν¨μ
model += xsum(model.vars['x%d' %j] for j in temp['λ
Έλ ID']) == 40 # μ μ½ μ‘°κ±΄ 2 : μ€μΉν AED κ°μ
for num, idx in enumerate(temp['λ
Έλ ID']):
model += xsum(model.vars['x%d' %j] for j in cond_list[num]) >= model.vars['y%d' %idx] # μ μ½ μ‘°κ±΄ 1 : cond_list(μ§ν© N)μ μν νλ³΄μ§ μ€ μ μ΄λ ν κ³³μ AEDκ° μ
μ§νλ©΄ iλ 컀λ²λ¨
model.optimize()
solution = []
for j in temp['λ
Έλ ID']:
if model.vars['x%d' %j].x == 0:
solution.append(0)
else:
solution.append(1)
temp['sol'] = solution
sol = temp[temp['sol'] == 1]
μΆκ° AED κ°μ μ¦κ°μ λ°λΌ 컀λ²λ¦¬μ§ μ¦κ°μ¨μ΄ 체κ°, ν©λ¦¬μ μΈ κ°μ μ€μ μ΄ νμ
- μ΅μ’ μ μΌλ‘ 40κ°μ μΆκ° AED μ€μΉ, μ 체 μ½ 81% 컀λ²
- 보λΌμ : κΈ°μ‘΄ 24μκ° AED
- λ Έλμ : μλ‘ μΆκ°λ μ€μΈ AED
- geopandas
- pydeck
- mip
- pandas
- shapely