diff --git a/.gitignore b/.gitignore index 0d7149b..50a5148 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +__pycache__/ latex-template/ .DS_Store ~$*.* diff --git a/kmin_effectiveness.png b/kmin_effectiveness.png index da6da19..e960552 100644 Binary files a/kmin_effectiveness.png and b/kmin_effectiveness.png differ diff --git a/kmin_effectiveness.py b/kmin_effectiveness.py index ec49942..038d42c 100644 --- a/kmin_effectiveness.py +++ b/kmin_effectiveness.py @@ -1,10 +1,13 @@ """ K_min-有效性分析 k_min为实数:如2.7表示70%站点最低2次,30%站点最低3次 + +有效性计算支持引入需求标准差(正态分布),并通过 Monte Carlo 多次模拟求均值。 """ import numpy as np import pandas as pd +import math try: import matplotlib @@ -21,8 +24,82 @@ except ModuleNotFoundError: # 参数 C_OPT = 250 N_TOTAL = 722 -ALPHA = 0.4 +ALPHA = 0.5 BETA = 0.2 +N_SIMS = 2000 +RANDOM_SEED = 42 + + +def gini_coefficient(values): + """ + 计算基尼系数(0=完全均等,1=完全不均等) + 约定:values 非负;若总和为0,则返回0。 + """ + x = np.asarray(values, dtype=float) + x = x[np.isfinite(x)] + if x.size == 0: + return 0.0 + x = np.clip(x, 0, None) + total = x.sum() + if total <= 0: + return 0.0 + + x_sorted = np.sort(x) + n = x_sorted.size + idx = np.arange(1, n + 1, dtype=float) + return float((2.0 * (idx * x_sorted).sum()) / (n * total) - (n + 1.0) / n) + + +def _norm_pdf(z): + return np.exp(-0.5 * z * z) / np.sqrt(2.0 * np.pi) + + +def _norm_cdf(z): + z = np.asarray(z, dtype=float) + erf_vec = np.vectorize(math.erf, otypes=[float]) + return 0.5 * (1.0 + erf_vec(z / np.sqrt(2.0))) + + +def expected_clipped_normal(mu, sigma, lower=0.0, upper=1.0): + """ + X ~ Normal(mu, sigma^2). 返回 E[clip(X, lower, upper)]. + - 支持 lower=0 用于避免负需求 + - sigma<=0 时退化为 clip(mu, lower, upper) + """ + mu = np.asarray(mu, dtype=float) + sigma = np.asarray(sigma, dtype=float) + lower = float(lower) + upper = float(upper) + + if lower > upper: + raise ValueError("lower must be <= upper") + + out = np.empty_like(mu, dtype=float) + mask = sigma > 0 + out[~mask] = np.clip(mu[~mask], lower, upper) + + if np.any(mask): + m = mu[mask] + s = sigma[mask] + + z_u = (upper - m) / s + z_l = (lower - m) / s + + Phi_u = _norm_cdf(z_u) + Phi_l = _norm_cdf(z_l) + phi_u = _norm_pdf(z_u) + phi_l = _norm_pdf(z_l) + + # E[X 1_{X<=a}] = mu*Phi(z) - sigma*phi(z), z=(a-mu)/sigma + ex_le_u = m * Phi_u - s * phi_u + ex_le_l = m * Phi_l - s * phi_l + + p_le_l = Phi_l + p_gt_u = 1.0 - Phi_u + + out[mask] = lower * p_le_l + (ex_le_u - ex_le_l) + upper * p_gt_u + + return out def load_data(): @@ -76,67 +153,148 @@ def allocate_visits(df, k_min_real, n_total, c_opt): return df -def calc_effectiveness(df, c_opt=C_OPT, alpha=ALPHA, beta=BETA): - """计算有效性指标""" +def calc_effectiveness( + df, + c_opt=C_OPT, + alpha=ALPHA, + beta=BETA, + method="mc", + n_sims=N_SIMS, + seed=RANDOM_SEED, +): + """计算有效性指标(method='mc' 多次模拟取均值;method='analytic' 用闭式期望)""" d = df['Average Demand per Visit'].values + d_std = df.get('StDev(Demand per Visit)', pd.Series(0.0, index=df.index)).values + d_std = np.clip(d_std, 0, None) k = df['AllocatedVisits'].values D = df['TotalDemand'].values - # 截断:单次有效服务 = min(需求, 容量) - eff_per_visit = np.minimum(d, c_opt) - annual_eff = k * eff_per_visit + method = (method or "mc").lower() + if method not in {"mc", "analytic"}: + raise ValueError("method must be 'mc' or 'analytic'") - # 缺货率、浪费率 - unmet = np.maximum(0, D - annual_eff) / np.maximum(D, 1) - waste = np.maximum(0, k * c_opt - D) / np.maximum(k * c_opt, 1) + if method == "analytic": + # 正态分布需求:单次期望有效服务 = E[min(max(N(d, std),0), 容量)] + eff_per_visit = expected_clipped_normal(d, d_std, lower=0.0, upper=float(c_opt)) + annual_eff = k * eff_per_visit - # 有效性得分 - base = annual_eff / np.maximum(D, 1) - score = np.clip(base - alpha * unmet - beta * waste, 0, 1) + unmet = np.maximum(0, D - annual_eff) / np.maximum(D, 1) + waste = np.maximum(0, k * c_opt - annual_eff) / np.maximum(k * c_opt, 1) - n = score.size - bottom_n = max(1, int(np.ceil(n * 0.10))) - bottom10_mean = float(np.sort(score)[:bottom_n].mean()) + base = annual_eff / np.maximum(D, 1) + score = np.clip(base - alpha * unmet - beta * waste, 0, 1) - # 总服务客户数 = Σ min(供给能力, 需求) - total_served = np.minimum(k * c_opt, D).sum() - total_demand = D.sum() + n = score.size + bottom_n = max(1, int(np.ceil(n * 0.10))) + + total_served = np.minimum(annual_eff, D).sum() + total_demand = D.sum() + + return { + 'mean': float(score.mean()), + 'min': float(score.min()), + 'bottom10_mean': float(np.sort(score)[:bottom_n].mean()), + 'gini_eff': float(gini_coefficient(score)), + 'std': float(score.std()), + 'total_unmet': float((D - annual_eff).clip(min=0).sum()), + 'total_waste': float((k * c_opt - annual_eff).clip(min=0).sum()), + 'total_served': float(total_served), + 'total_demand': float(total_demand), + 'serve_ratio': float(total_served / total_demand) if total_demand > 0 else 0.0 + } + + # Monte Carlo:每次访问的需求 ~ Normal(mu, sigma),重复 n_sims 次取均值 + n_sims = int(n_sims) + if n_sims <= 0: + raise ValueError("n_sims must be > 0") + + rng = np.random.default_rng(seed) + n_sites = len(df) + annual_eff_sims = np.zeros((n_sites, n_sims), dtype=float) + + for i in range(n_sites): + k_i = int(k[i]) + if k_i <= 0: + continue + + mu_i = float(d[i]) + sigma_i = float(d_std[i]) + if sigma_i <= 0: + demand = np.full((n_sims, k_i), mu_i, dtype=float) + else: + demand = rng.normal(mu_i, sigma_i, size=(n_sims, k_i)) + demand = np.clip(demand, 0, None) + annual_eff_sims[i, :] = np.minimum(demand, float(c_opt)).sum(axis=1) + + D2 = D.reshape(-1, 1) + cap2 = (k * c_opt).reshape(-1, 1) + + unmet = np.maximum(0, D2 - annual_eff_sims) / np.maximum(D2, 1) + waste = np.maximum(0, cap2 - annual_eff_sims) / np.maximum(cap2, 1) + base = annual_eff_sims / np.maximum(D2, 1) + score_sims = np.clip(base - alpha * unmet - beta * waste, 0, 1) + + # 每个站点的期望得分(跨模拟平均) + avg_score = score_sims.mean(axis=1) + bottom_n = max(1, int(np.ceil(n_sites * 0.10))) + + total_served_sims = np.minimum(annual_eff_sims, D2).sum(axis=0) + total_unmet_sims = np.maximum(0, D2 - annual_eff_sims).sum(axis=0) + total_waste_sims = np.maximum(0, cap2 - annual_eff_sims).sum(axis=0) + total_demand = float(D.sum()) + total_served = float(total_served_sims.mean()) return { - 'mean': score.mean(), - 'min': score.min(), - 'bottom10_mean': bottom10_mean, - 'std': score.std(), - 'total_unmet': (D - annual_eff).clip(min=0).sum(), - 'total_waste': (k * c_opt - D).clip(min=0).sum(), + 'mean': float(avg_score.mean()), + 'min': float(avg_score.min()), + 'bottom10_mean': float(np.sort(avg_score)[:bottom_n].mean()), + 'gini_eff': float(gini_coefficient(avg_score)), + 'std': float(avg_score.std()), + 'total_unmet': float(total_unmet_sims.mean()), + 'total_waste': float(total_waste_sims.mean()), 'total_served': total_served, 'total_demand': total_demand, - 'serve_ratio': total_served / total_demand + 'serve_ratio': float(total_served / total_demand) if total_demand > 0 else 0.0 } -def analyze_kmin_range(df, k_range=np.arange(1.0, 10.1, 0.1)): +def analyze_kmin_range( + df, + k_range=np.arange(1.0, 10.1, 0.1), + method="mc", + n_sims=N_SIMS, + seed=RANDOM_SEED, +): """扫描k_min范围,计算有效性""" results = [] + n_sites = len(df) + site_cols = [f"visits_{i+1:02d}" for i in range(n_sites)] for k_min in k_range: df_alloc = allocate_visits(df, k_min, N_TOTAL, C_OPT) if df_alloc is None: continue - metrics = calc_effectiveness(df_alloc) - results.append({ + metrics = calc_effectiveness(df_alloc, method=method, n_sims=n_sims, seed=seed) + row = { 'k_min': k_min, 'effectiveness': metrics['mean'], 'min_eff': metrics['min'], 'bottom10_eff': metrics['bottom10_mean'], + 'gini_eff': metrics['gini_eff'], 'std_eff': metrics['std'], 'unmet': metrics['total_unmet'], 'waste': metrics['total_waste'], 'total_served': metrics['total_served'], 'total_demand': metrics['total_demand'], 'serve_ratio': metrics['serve_ratio'] - }) + } + + # 追加每个站点在该 k_min 下的访问次数(按 df 当前排序的站点顺序) + alloc = df_alloc["AllocatedVisits"].astype(int).tolist() + row.update({col: v for col, v in zip(site_cols, alloc)}) + + results.append(row) return pd.DataFrame(results) @@ -146,18 +304,26 @@ def plot_results(results): if not _HAS_MPL: raise RuntimeError("缺少依赖: matplotlib(无法绘图)。请先安装 matplotlib 再运行绘图部分。") - fig, axes = plt.subplots(3, 2, figsize=(12, 10)) + fig, axes = plt.subplots(4, 2, figsize=(12, 13)) - # 找最优点 - best_idx = results['effectiveness'].idxmax() - best_k = results.loc[best_idx, 'k_min'] - best_eff = results.loc[best_idx, 'effectiveness'] + # 红线选点:基尼系数第一次 < 0.2 的 k_min(若不存在则回退到均值有效性最优点) + gini_candidates = results.loc[results["gini_eff"] < 0.2, "k_min"] + if len(gini_candidates) > 0: + selected_k = float(gini_candidates.iloc[0]) + selected_label = f'First Gini<0.2: k_min={selected_k:.1f}' + else: + best_idx = results['effectiveness'].idxmax() + selected_k = float(results.loc[best_idx, 'k_min']) + selected_label = f'Best mean eff: k_min={selected_k:.1f}' + + selected_idx = (results["k_min"] - selected_k).abs().idxmin() + selected_eff = float(results.loc[selected_idx, "effectiveness"]) # 1. 有效性均值 ax = axes[0, 0] ax.plot(results['k_min'], results['effectiveness'], 'b-', lw=2) - ax.axvline(best_k, color='r', ls='--', label=f'Best k_min={best_k:.1f}') - ax.scatter([best_k], [best_eff], c='r', s=100, zorder=5) + ax.axvline(selected_k, color='r', ls='--', label=selected_label) + ax.scatter([selected_k], [selected_eff], c='r', s=100, zorder=5) ax.set_xlabel('k_min') ax.set_ylabel('Mean Effectiveness') ax.set_title('Mean Effectiveness vs k_min') @@ -167,7 +333,7 @@ def plot_results(results): # 2. 最低10%有效性均值 ax = axes[0, 1] ax.plot(results['k_min'], results['bottom10_eff'], 'm-', lw=2) - ax.axvline(best_k, color='r', ls='--') + ax.axvline(selected_k, color='r', ls='--') ax.set_xlabel('k_min') ax.set_ylabel('Bottom 10% Mean Effectiveness') ax.set_title('Bottom 10% Mean Effectiveness vs k_min') @@ -177,7 +343,7 @@ def plot_results(results): ax = axes[1, 0] ax.plot(results['k_min'], results['total_served'] / 1000, 'c-', lw=2) ax.axhline(results['total_demand'].iloc[0] / 1000, color='gray', ls=':', label='Total Demand') - ax.axvline(best_k, color='r', ls='--') + ax.axvline(selected_k, color='r', ls='--') ax.set_xlabel('k_min') ax.set_ylabel('Served Families (×1000)') ax.set_title('Total Served vs k_min') @@ -187,7 +353,7 @@ def plot_results(results): # 4. 最小有效性 ax = axes[1, 1] ax.plot(results['k_min'], results['min_eff'], 'g-', lw=2) - ax.axvline(best_k, color='r', ls='--') + ax.axvline(selected_k, color='r', ls='--') ax.set_xlabel('k_min') ax.set_ylabel('Min Effectiveness') ax.set_title('Worst Site Effectiveness vs k_min') @@ -197,7 +363,7 @@ def plot_results(results): ax = axes[2, 0] ax.plot(results['k_min'], results['unmet'] / 1000, 'r-', lw=2, label='Unmet') ax.plot(results['k_min'], results['waste'] / 1000, 'b-', lw=2, label='Waste') - ax.axvline(best_k, color='gray', ls='--') + ax.axvline(selected_k, color='gray', ls='--') ax.set_xlabel('k_min') ax.set_ylabel('Families (×1000)') ax.set_title('Unmet Demand vs Wasted Capacity') @@ -207,17 +373,30 @@ def plot_results(results): # 6. 有效性标准差 ax = axes[2, 1] ax.plot(results['k_min'], results['std_eff'], color='tab:orange', lw=2) - ax.axvline(best_k, color='gray', ls='--') + ax.axvline(selected_k, color='gray', ls='--') ax.set_xlabel('k_min') ax.set_ylabel('Std Effectiveness') ax.set_title('Effectiveness Std vs k_min') ax.grid(True, alpha=0.3) + # 7. 基尼系数 + ax = axes[3, 0] + ax.plot(results['k_min'], results['gini_eff'], color='tab:purple', lw=2) + ax.axhline(0.2, color='gray', ls=':', lw=1) + ax.axvline(selected_k, color='r', ls='--') + ax.set_xlabel('k_min') + ax.set_ylabel('Gini Coefficient') + ax.set_title('Gini (Effectiveness) vs k_min') + ax.grid(True, alpha=0.3) + + # 8. 空白占位(避免最后一格空图框太挤) + axes[3, 1].axis('off') + plt.tight_layout() plt.savefig('kmin_effectiveness.png', dpi=150) plt.close(fig) - return best_k, best_eff + return selected_k, selected_eff def main(): @@ -225,10 +404,19 @@ def main(): df = load_data() print(f"站点数: {len(df)}, 总运力: {N_TOTAL}") print(f"总需求: {df['TotalDemand'].sum():,.0f} 家庭次") + site_name_col = "Site Name" if "Site Name" in df.columns else None + sites_out = pd.DataFrame( + { + "site_idx": np.arange(1, len(df) + 1, dtype=int), + "site_name": df[site_name_col].astype(str).values if site_name_col else [f"Site_{i+1:02d}" for i in range(len(df))], + "total_demand": df["TotalDemand"].values, + } + ) # 2. 扫描k_min print("\n扫描 k_min ∈ [1.0, 10.0]...") - results = analyze_kmin_range(df) + print(f"使用 Monte Carlo 平均:n_sims={N_SIMS}, seed={RANDOM_SEED}") + results = analyze_kmin_range(df, method="mc", n_sims=N_SIMS, seed=RANDOM_SEED) # 3. 绘图 best_idx = results['effectiveness'].idxmax() @@ -245,7 +433,7 @@ def main(): # 5. 生成最优方案 df_opt = allocate_visits(df, best_k, N_TOTAL, C_OPT) - metrics = calc_effectiveness(df_opt) + metrics = calc_effectiveness(df_opt, method="mc", n_sims=N_SIMS, seed=RANDOM_SEED) print(f"\n最优方案统计:") print(f" 有效性: {metrics['mean']:.4f} (min={metrics['min']:.4f})") @@ -256,7 +444,8 @@ def main(): # 6. 保存 results.to_csv('kmin_effectiveness_data.csv', index=False) - print("\n已保存: kmin_effectiveness.png, kmin_effectiveness_data.csv") + sites_out.to_csv("kmin_effectiveness_sites.csv", index=False) + print("\n已保存: kmin_effectiveness.png, kmin_effectiveness_data.csv, kmin_effectiveness_sites.csv") if __name__ == '__main__': diff --git a/kmin_effectiveness_data.csv b/kmin_effectiveness_data.csv new file mode 100644 index 0000000..6089440 --- /dev/null +++ b/kmin_effectiveness_data.csv @@ -0,0 +1,92 @@ +k_min,effectiveness,min_eff,bottom10_eff,gini_eff,std_eff,unmet,waste,total_served,total_demand,serve_ratio,visits_01,visits_02,visits_03,visits_04,visits_05,visits_06,visits_07,visits_08,visits_09,visits_10,visits_11,visits_12,visits_13,visits_14,visits_15,visits_16,visits_17,visits_18,visits_19,visits_20,visits_21,visits_22,visits_23,visits_24,visits_25,visits_26,visits_27,visits_28,visits_29,visits_30,visits_31,visits_32,visits_33,visits_34,visits_35,visits_36,visits_37,visits_38,visits_39,visits_40,visits_41,visits_42,visits_43,visits_44,visits_45,visits_46,visits_47,visits_48,visits_49,visits_50,visits_51,visits_52,visits_53,visits_54,visits_55,visits_56,visits_57,visits_58,visits_59,visits_60,visits_61,visits_62,visits_63,visits_64,visits_65,visits_66,visits_67,visits_68,visits_69,visits_70 +1.0,0.6341145571330261,0.0,0.0,0.3576469174594097,0.44121099409856696,7211.9349775511755,52958.89819394406,95261.06502244883,102473.0,0.9296211199286528,1,1,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,5,5,5,5,5,5,6,6,6,7,8,8,9,9,10,10,10,11,11,11,12,12,12,12,12,12,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,16,16,16,16,20,20,21,21,23,25,29 +1.1,0.631881646766723,0.0,0.0,0.3595928073033041,0.44071458493703186,7339.685342065542,52748.84063760984,95133.31465793446,102473.0,0.9283744465169798,1,1,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,5,5,5,5,5,5,6,6,6,7,8,8,9,9,9,10,10,10,11,11,11,12,12,12,12,12,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,16,16,16,16,20,21,21,22,24,26,29 +1.2000000000000002,0.6287203388568261,0.0,0.0,0.36192497743028307,0.4401312771373341,7408.3988763206435,52820.73192590341,95064.60112367936,102473.0,0.9277038939396657,2,2,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,5,6,6,6,7,7,8,9,9,9,10,10,10,11,11,11,12,12,12,12,12,12,13,13,13,13,14,14,14,14,14,14,14,15,16,16,16,16,17,17,17,20,20,21,21,23,26,30 +1.3000000000000003,0.625341285955271,0.0,0.0,0.36601171772562924,0.44375909970982375,7550.927051345476,52494.00979479516,94922.07294865453,102473.0,0.92631300877943,1,2,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,7,7,8,9,9,9,10,10,10,11,11,11,12,12,12,12,12,12,13,13,13,13,13,15,15,15,15,15,15,16,16,16,16,16,16,17,17,20,20,21,21,23,25,29 +1.4000000000000004,0.6265696005707148,0.0,0.0,0.3654665646918591,0.4447023695438366,7501.118967467812,52848.239886346324,94971.88103253218,102473.0,0.9267990693405305,2,2,2,2,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,6,6,7,7,8,9,9,9,10,10,10,11,11,11,11,11,12,12,13,13,13,14,14,14,14,15,15,15,15,15,15,15,15,15,16,16,16,16,16,20,20,21,21,23,25,29 +1.5000000000000004,0.6273784849051388,0.0,0.0,0.365603962742173,0.4457907186128677,7548.454665638993,52647.80885347686,94924.54533436101,102473.0,0.9263371359710462,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5,5,6,6,7,7,8,8,9,9,10,10,10,11,12,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,15,15,15,15,15,15,16,16,16,16,20,20,21,21,23,25,28 +1.6000000000000005,0.6351745888908343,0.0,0.0,0.3583174145196568,0.44765752532432257,7157.600450378414,52929.82720279829,95315.39954962158,102473.0,0.9301513525477109,1,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,5,5,5,5,5,6,6,7,7,9,9,10,10,11,11,11,11,12,12,12,12,12,12,13,13,13,13,14,14,14,15,15,15,15,15,15,15,15,15,15,16,16,16,16,19,20,20,21,22,24,28 +1.7000000000000006,0.6456242859884709,0.0,0.0,0.3471226552522928,0.43861774016419797,6818.575651507843,53696.13656158148,95654.42434849216,102473.0,0.9334597830500928,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,5,5,6,6,6,7,7,8,8,9,9,9,10,10,11,11,11,12,12,12,12,12,12,12,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,16,16,16,16,19,19,20,20,22,24,29 +1.8000000000000007,0.6497067453511609,0.0,0.0,0.3429817305473586,0.4366951731325637,6634.194990693854,54326.7753900214,95838.80500930613,102473.0,0.9352590927298521,1,1,2,2,3,3,3,3,3,3,3,3,3,3,4,4,5,5,5,6,6,6,6,6,6,7,8,8,9,9,9,10,10,11,11,11,12,12,12,12,12,12,12,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,16,16,16,19,19,20,20,22,24,27 +1.9000000000000008,0.6479086942180893,0.0,1.8874178475584306e-06,0.3439427977054208,0.43422510675539777,6625.760124161231,55179.116128219976,95847.23987583877,102473.0,0.9353414057931237,1,2,2,2,2,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6,6,7,8,8,8,9,9,10,10,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,16,16,19,19,20,20,22,24,27 +2.000000000000001,0.6450114362988062,0.0,7.002540308021955e-07,0.3443258020190607,0.4293116930939743,6544.538620188119,56364.45571260375,95928.46137981188,102473.0,0.9361340194959832,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,8,8,8,9,9,10,10,10,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,15,19,19,19,20,22,24,28 +2.100000000000001,0.6436543540132394,0.0,7.002540308021955e-07,0.3449664909747885,0.42836930389058037,6566.428277419522,56177.68784796532,95906.5717225805,102473.0,0.93592040559543,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,8,8,9,9,10,10,10,10,11,11,11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,15,15,15,15,15,19,20,20,20,23,25,28 +2.200000000000001,0.640615443074095,0.0,0.0,0.34729636140039655,0.42745500295385896,6767.5375026086895,55856.20958482915,95705.46249739132,102473.0,0.9339578474075251,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,11,11,12,12,12,12,12,13,13,13,13,14,14,14,14,14,14,14,15,15,15,16,16,16,16,19,19,20,20,23,25,28 +2.300000000000001,0.6391013329876792,0.0,1.0242202730648707e-06,0.34867294623408696,0.4271995249335246,6905.077160433514,55592.77065358443,95567.92283956648,102473.0,0.9326156435311398,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,8,8,9,9,9,10,10,10,11,11,11,11,11,11,12,12,12,12,12,13,13,13,15,15,15,15,15,15,15,15,15,15,16,16,16,16,19,19,20,20,22,24,27 +2.4000000000000012,0.639803650595918,0.0,1.0242202730648707e-06,0.3487515336799809,0.42802622039076316,6932.664095262117,55715.21451516906,95540.33590473789,102473.0,0.9323464317892313,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,13,13,13,13,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,16,19,19,20,20,22,23,28 +2.5000000000000013,0.6442489623054904,0.0,1.0242202730648707e-06,0.34570884327343787,0.43035880554927297,6662.5040375645995,56116.90784451566,95810.4959624354,102473.0,0.9349828341361666,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,7,7,8,8,9,9,9,10,10,10,11,12,12,12,12,12,12,12,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,16,16,19,19,19,20,21,23,26 +2.6000000000000014,0.6491835835297891,0.0,1.0242202730648707e-06,0.34181447890974836,0.4336409043163825,6371.990180915909,56296.556302436664,96101.00981908411,102473.0,0.9378178624523934,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,7,7,9,10,10,10,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,18,19,19,19,21,23,27 +2.7000000000000015,0.6609465817980453,0.0,0.0,0.3299006772092712,0.42627196745848805,6040.884555252093,56870.683649712824,96432.11544474789,102473.0,0.9410490123715309,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,5,5,5,5,7,7,7,7,7,8,8,9,9,10,10,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,18,18,19,19,21,23,27 +2.8000000000000016,0.6602502925666722,0.0,8.213844609905636e-07,0.3286933930973204,0.4213906998087764,6045.176219552856,57330.752973745075,96427.82378044716,102473.0,0.9410071314438648,3,3,3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,6,6,6,6,6,6,7,7,7,8,8,9,9,9,10,10,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,18,18,19,20,22,23,26 +2.9000000000000017,0.6659411249444852,0.0,1.4980286066269457e-06,0.3218974442032083,0.4160195392945425,5830.436156881196,58487.43375616116,96642.5638431188,102473.0,0.94310270845119,2,3,3,3,3,3,3,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,8,8,9,9,9,10,10,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,18,18,19,19,20,22,25 +3.0000000000000018,0.6641011063606157,0.0,1.1993630141609899e-05,0.3226762381404542,0.41435101002065494,5873.787918096625,58968.950172073186,96599.21208190337,102473.0,0.9426796530003354,3,3,3,3,3,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,8,8,9,9,9,10,10,10,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,18,18,18,19,20,22,25 +3.100000000000002,0.666831364628495,0.0,0.0022015391055339633,0.31803630855430987,0.40906228346688567,5784.401522965496,59577.74465380383,96688.59847703451,102473.0,0.9435519451663805,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,8,8,9,9,9,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,15,15,18,19,19,19,21,23,26 +3.200000000000002,0.6633233953109756,0.0,0.0022015391055339633,0.3210069673734737,0.40855905164027995,5987.992435432583,59569.10873999842,96485.00756456742,102473.0,0.9415651690159107,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,8,8,8,9,9,10,10,10,10,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,15,15,15,15,15,15,16,18,18,19,19,21,22,25 +3.300000000000002,0.6580043587555976,0.0,0.0022015391055339633,0.32589677061691713,0.409633968091643,6278.195307786394,59339.38960666879,96194.8046922136,102473.0,0.9387331754922136,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,8,8,8,9,9,9,10,10,10,11,11,11,11,11,11,11,11,12,12,12,13,13,13,14,14,14,14,14,14,15,15,15,15,15,15,15,15,18,18,19,19,20,22,25 +3.400000000000002,0.6606938285246241,0.0,0.001543791230764743,0.32478442980717737,0.41165702632438744,6189.2452730002815,59365.09125233717,96283.7547269997,102473.0,0.9396012093624633,3,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,18,18,19,19,20,22,25 +3.500000000000002,0.6612908675572927,0.0,0.0008337677151051152,0.326606218887306,0.41781552058996624,5985.129478415322,59321.46864709561,96487.87052158467,102473.0,0.9415931076633325,3,3,3,4,4,4,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,8,8,8,9,9,9,10,10,10,11,12,12,12,12,12,12,12,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,18,18,18,18,20,22,24 +3.6000000000000023,0.6669437575805018,0.0,1.168490953085006e-06,0.321586248093926,0.41856406474471325,5699.352658819076,59135.943229198914,96773.64734118093,102473.0,0.9443819088070119,3,3,3,3,3,3,4,4,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,8,9,10,10,10,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,15,15,15,15,17,18,18,18,20,21,24 +3.7000000000000024,0.6744779015099097,0.0,6.590543711507239e-06,0.3140246957764117,0.41321255649937455,5526.486590266524,59580.772071120875,96946.51340973348,102473.0,0.9460688514021595,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5,5,6,6,6,6,7,7,7,7,8,8,9,9,10,10,10,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,15,15,15,17,17,18,18,19,21,24 +3.8000000000000025,0.681615495969978,0.0,0.0009221158077961178,0.3042263516502324,0.40348061080459563,5250.8764999393425,60913.85863351621,97222.12350006065,102473.0,0.9487584388088633,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,6,6,7,7,7,7,7,7,7,8,8,9,9,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,15,17,17,18,18,19,21,23 +3.9000000000000026,0.6853821766169409,3.30497610019623e-05,0.007932827219986203,0.2978931315589526,0.39680727593432125,5201.559752708698,61685.64913686827,97271.44024729129,102473.0,0.9492397045786821,4,4,4,4,4,4,4,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,17,17,17,18,20,22,24 +4.000000000000003,0.6914569650779431,0.014477187193806694,0.03640711330564476,0.2871798658562652,0.38334001402625417,5216.457200703124,62823.33648114507,97256.54279929689,102473.0,0.949094325327617,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,17,17,17,18,20,21,24 +4.100000000000003,0.6850659849402758,0.014477187193806694,0.028528765775422103,0.29243472824319183,0.38363786530657673,5424.008527466386,62136.42524042886,97048.99147253361,102473.0,0.9470689008083457,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,17,18,19,19,21,22,25 +4.200000000000003,0.6840718619194874,0.014477187193806694,0.028528765775422103,0.2928382753350951,0.38295853367504773,5472.7249288252415,62248.03595051339,97000.27507117476,102473.0,0.9465934936146572,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,7,7,7,7,7,7,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,14,14,14,15,15,15,15,17,17,18,18,20,22,24 +4.3000000000000025,0.6805992192285779,0.014477187193806694,0.028528765775422103,0.29719282140069625,0.3866556104078709,5586.201159642076,62187.08559152845,96886.79884035794,102473.0,0.9454861167366813,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8,8,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,14,14,14,14,14,14,14,14,14,14,14,15,15,15,17,17,18,18,19,21,23 +4.400000000000003,0.6800617457783857,0.004505100763259419,0.01878612938068374,0.2996197566089933,0.38989880230343654,5604.944076419209,62119.597750029025,96868.05592358077,102473.0,0.945303210831934,4,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,8,8,9,9,9,9,10,10,10,10,11,11,11,11,11,11,12,12,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,15,15,17,17,17,18,19,20,23 +4.5000000000000036,0.6816629209607336,0.014477187193806694,0.028528765775422103,0.29773214235069423,0.3892791887269054,5515.7331481710935,62288.54317165098,96957.2668518289,102473.0,0.9461737906748987,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,8,8,8,9,9,9,10,10,10,11,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,17,17,17,17,20,21,23 +4.600000000000003,0.6884613577815473,0.014477187193806694,0.028528765775422103,0.2923334832928999,0.390155234231087,5156.478753919141,62635.828814680026,97316.52124608084,102473.0,0.9496796350851526,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,8,8,9,10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,16,17,17,17,18,21,23 +4.700000000000003,0.6992711654105389,0.014477187193806694,0.028528765775422103,0.28196983142402976,0.38418806613546364,4802.168292736121,63568.508088769966,97670.83170726389,102473.0,0.9531372332932957,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,8,8,8,8,8,9,9,9,10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,16,16,17,17,18,19,22 +4.800000000000003,0.709343056854343,0.004505100763259419,0.01878612938068374,0.26999421260821377,0.37217760692806867,4543.6102681953325,64352.12773565445,97929.38973180467,102473.0,0.9556604152489404,4,5,5,5,5,5,5,5,5,5,5,5,5,5,7,7,7,7,7,7,7,8,8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,16,16,17,17,18,19,21 +4.900000000000004,0.7142827246508412,0.004505100763259419,0.06066984900885367,0.2586130693544262,0.35498388813882364,4692.959527929367,65221.81965025295,97780.04047207063,102473.0,0.9542029653866934,4,5,5,5,5,5,5,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,14,14,14,14,16,16,16,17,18,19,21 +5.0000000000000036,0.7259868623762766,0.0832493215512994,0.1168799727456342,0.2425715853567605,0.3387195747932674,4622.424440440173,66436.98183372286,97850.57555955982,102473.0,0.9548912938975127,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,9,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,14,14,16,16,16,16,17,19,21 +5.100000000000003,0.7208106938879523,0.0832493215512994,0.10980044215747,0.24664381568534255,0.3400097635691426,4820.138880379911,65828.26744186327,97652.86111962008,102473.0,0.9529618642922534,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,16,17,17,17,18,19,23 +5.200000000000004,0.7177875697235016,0.0832493215512994,0.10980044215747,0.24784697511274256,0.33855608622079,5025.939462776529,65728.27098137868,97447.06053722346,102473.0,0.950953524706249,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,14,14,14,14,14,14,14,16,16,17,17,19,20,22 +5.300000000000004,0.7142111171952614,0.07348441191132199,0.10000036160779545,0.253045651007741,0.34411011450034157,5108.17103936397,65532.66371302016,97364.82896063602,102473.0,0.9501510540399521,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,9,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,11,12,12,12,12,13,13,13,13,13,13,14,14,14,14,14,14,14,14,16,16,17,17,18,19,21 +5.400000000000004,0.7203895188484549,0.0832493215512994,0.10980044215747,0.248361620075485,0.34275400450461885,4802.36203119521,65928.34920714199,97670.63796880477,102473.0,0.9531353426639678,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,9,9,9,10,10,10,10,10,11,11,11,11,11,11,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,16,16,16,16,17,19,22 +5.5000000000000036,0.7196399650976707,0.07348441191132199,0.10000036160779545,0.251093269657265,0.34736063687163327,4730.956915071836,65933.6442361288,97742.04308492815,102473.0,0.9538321614954979,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,8,8,8,8,9,9,9,9,10,10,10,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,16,16,16,16,17,18,20 +5.600000000000004,0.7253016151099078,0.07348441191132199,0.10000036160779545,0.24769879669511008,0.35078105496647327,4410.597069975457,66144.82883707383,98062.40293002455,102473.0,0.9569584469082055,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,8,8,8,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,15,16,16,16,17,18,20 +5.700000000000005,0.7299551764183926,0.07348441191132199,0.10014393102439718,0.24204279509450788,0.3427191360387187,4261.257403164137,66715.89227930848,98211.74259683587,102473.0,0.9584158031563034,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,16,16,17,18,20 +5.800000000000004,0.7354459936439799,0.07348441191132199,0.115405341726701,0.2332737695306486,0.3308323044024175,4237.529019990446,67435.4809155012,98235.47098000956,102473.0,0.9586473605731223,5,5,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,15,16,17,18,19 +5.900000000000004,0.7509719239050769,0.13821333572534547,0.18812980173499994,0.21291983852227303,0.3073640537928038,4169.825734746329,68968.69980521659,98303.17426525368,102473.0,0.9593080544656024,6,6,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,15,15,15,15,16,17,19 +6.000000000000004,0.7587084085840446,0.2007652470176261,0.21525234804741264,0.20082531954159233,0.2898905802940388,4218.158380105238,69826.34855626158,98254.84161989475,102473.0,0.9588363922193627,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,15,15,15,15,16,17,19 +6.100000000000005,0.7507928383441442,0.07348441191132199,0.1950774221901012,0.2087261237351874,0.2977873892863632,4446.823689131523,69062.98332019962,98026.17631086847,102473.0,0.9566049233541368,5,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,9,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,15,16,16,16,17,18,20 +6.200000000000005,0.7473720194279226,0.07348441191132199,0.18716560156783743,0.21199997114070013,0.3005726175732655,4517.879768410358,68876.2291231841,97955.12023158965,102473.0,0.9559115106573405,5,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,14,14,14,15,15,16,16,17,18,19 +6.300000000000004,0.7505986121271847,0.07348441191132199,0.19495293674484174,0.20763770208546872,0.2945345169606789,4508.731844980599,69320.56981363284,97964.2681550194,102473.0,0.9560007822062337,5,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,15,16,16,17,19 +6.400000000000005,0.7477915407161522,0.07348441191132199,0.18716560156783743,0.21406499190804396,0.30494802636860674,4391.094640276807,68939.8874611163,98081.9053597232,102473.0,0.9571487646474993,5,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,15,15,16,17,19 +6.500000000000005,0.7469722291548991,0.07348441191132199,0.17506391629179285,0.21893776255174613,0.31544038385934325,4150.55483928604,68684.61225927786,98322.44516071396,102473.0,0.9594961127391016,5,6,6,6,6,6,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,15,15,15,15,16,17,18 +6.600000000000005,0.7558450997480074,0.07348441191132199,0.19495293674484174,0.20748683183566685,0.3020258332143076,4135.267241472138,69439.64473757535,98337.73275852785,102473.0,0.9596452993327789,5,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,9,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,15,15,15,16,17,18 +6.700000000000005,0.7631822174952849,0.07348441191132199,0.19495293674484174,0.2012032123470906,0.29742317474619256,3888.3675418251623,70190.35253111576,98584.63245817483,102473.0,0.962054711564752,5,6,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8,9,9,9,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,14,14,15,15,15,16,18 +6.800000000000005,0.7742788983907305,0.2007652470176261,0.24623570627632324,0.18554563154777326,0.27601139028303695,3841.635680903716,71276.83665952102,98631.36431909628,102473.0,0.9625107522869075,6,6,7,7,7,7,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,9,9,9,9,9,9,9,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,14,14,14,14,15,16,17 +6.900000000000006,0.7768193089816157,0.07348441191132199,0.27769217064895646,0.17777191642901058,0.26126519459817593,3934.5825702802817,72004.61116336135,98538.41742971972,102473.0,0.9616037144391177,5,5,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,14,14,14,14,15,16,17 +7.000000000000005,0.7828676736759198,0.21141698653295748,0.30318262358092885,0.17045584225601118,0.25180980113185436,3959.173440620721,72578.12563516332,98513.82655937927,102473.0,0.961363740296266,6,6,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,14,14,14,14,15,16,17 +7.100000000000005,0.7807777178069581,0.21141698653295748,0.32195081552070076,0.16785773461899445,0.24354883233026034,4150.11479768182,72534.41225493529,98322.88520231818,102473.0,0.9595004069590837,6,6,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,14,14,15,15,16,16,18 +7.2000000000000055,0.775133038015558,0.21141698653295748,0.31567470470006054,0.17154505228418926,0.2459195189823457,4527.50268287182,72315.02421740451,97945.49731712817,102473.0,0.9558176038286005,6,6,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,13,13,13,13,13,13,13,14,14,15,15,15,16,17 +7.300000000000006,0.775149176109478,0.21141698653295748,0.31567470470006054,0.1723551414769291,0.24751769515832298,4384.579605943557,72256.6828321812,98088.42039405645,102473.0,0.9572123427054585,6,6,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13,13,13,13,13,13,13,13,14,14,14,14,15,16,17 +7.400000000000006,0.7809967621056142,0.32223829343894156,0.3375250156554298,0.16953488542508377,0.24698740844264155,4253.766638747558,72639.34173296284,98219.23336125245,102473.0,0.958488903040337,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,14,14,14,14,15,16,17 +7.500000000000005,0.7807882492930738,0.3216641490697723,0.33731899225641004,0.17121080778282716,0.25146308336613815,4108.402330564411,72509.7329469793,98364.59766943559,102473.0,0.9599074650828568,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,10,10,10,10,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,14,14,14,14,15,15,17 +7.600000000000006,0.7812780328980804,0.27237311875411147,0.3238652266861477,0.1728985774812395,0.25538139420337513,4105.99895450063,72568.95772318324,98367.00104549939,102473.0,0.9599309188322718,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,14,14,15,16,17 +7.700000000000006,0.7840365908187781,0.27237311875411147,0.3046885968094987,0.17005801309799184,0.25328828229302064,4279.983987143974,73130.08782085778,98193.01601285601,102473.0,0.9582330566379047,7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,14,14,15,16 +7.800000000000006,0.788193311582141,0.27237311875411147,0.3144838028260904,0.16071153932230753,0.2387256959750916,4630.604035678342,73947.47170100175,97842.39596432167,102473.0,0.9548114719420888,7,7,7,7,7,7,7,7,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,14,14,16 +7.900000000000006,0.7933137365802887,0.27237311875411147,0.3583529811321033,0.1492237507538623,0.21953151585098715,5061.180514373063,75087.92247014942,97411.81948562694,102473.0,0.9506096189789207,7,7,7,7,7,7,7,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,14,14,15 +8.000000000000007,0.8016247595789884,0.4084848830732427,0.4336055829218711,0.13405656576443814,0.19532565244165145,5409.448055334993,76388.14137148118,97063.55194466501,102473.0,0.9472109916237937,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,13,13,13,13,13,14,15 +8.100000000000007,0.8011388458377203,0.36104155099913815,0.42002752321012,0.13697169655865005,0.20035133219756798,4817.179328912768,75900.80414480765,97655.82067108723,102473.0,0.9529907455728556,7,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,13,13,14,14,14,15,16 +8.200000000000006,0.797789485426574,0.32238893028292404,0.405182160600766,0.14328734655991404,0.20974884376314862,4657.859408037618,75264.12343995336,97815.14059196238,102473.0,0.954545495808285,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,13,14,14,14,15,15,16 +8.300000000000006,0.7968489277811575,0.32238893028292404,0.3875284242452703,0.14692101462480478,0.21570275402907024,4589.3735753210485,74851.65424082112,97883.62642467895,102473.0,0.9552138263218501,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,14,14,15,15,16 +8.400000000000006,0.7971388389146357,0.32238893028292404,0.3875284242452703,0.1476376657080356,0.21673847115774006,4807.958226935044,75025.2078102511,97665.04177306495,102473.0,0.9530807312469133,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,15,16 +8.500000000000007,0.795389677041941,0.32221457539316145,0.379132026007549,0.14841430581272874,0.218017881569985,5242.43269079732,75116.21940878025,97230.56730920268,102473.0,0.9488408391400923,7,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,14,14 +8.600000000000007,0.7961233313622772,0.32238893028292404,0.3628581479882768,0.14874618504679993,0.22038636933275307,5016.824893755313,75061.32260905889,97456.17510624469,102473.0,0.9510424707605387,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,13,14,14,14,15 +8.700000000000006,0.7997451225721456,0.32238893028292404,0.3628581479882768,0.14305773674632682,0.21431662920577796,5095.537468064261,75751.34948835697,97377.46253193571,102473.0,0.9502743408696507,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,13,13,13,14,14,15 +8.800000000000008,0.8042745029967951,0.32238893028292404,0.3875284242452703,0.13533134943798308,0.20398423062017557,5339.828726794848,76606.6456004738,97133.17127320517,102473.0,0.947890383546936,8,8,8,8,8,8,8,8,8,8,8,8,8,8,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,13,13,14,14,15 +8.900000000000007,0.8079295192635825,0.4084848830732427,0.4405057331506766,0.12325627306650921,0.1818363729946722,6306.434137529574,77957.24091488871,96166.56586247042,102473.0,0.9384576021241734,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,14,14 +9.000000000000007,0.8117004237468507,0.446657061020355,0.4735032012756305,0.1156269997219812,0.16915541871571346,7080.438876922228,79088.05804725448,95392.56112307779,102473.0,0.9309043467359966,8,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,13 +9.100000000000007,0.8126137972212444,0.4481856425545815,0.47877168436952156,0.11403013652829874,0.16715509550062319,5896.365121369083,78376.40379910794,96576.63487863091,102473.0,0.9424593295661385,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,13,13,13,14,15 +9.200000000000006,0.8089121744707536,0.4481856425545815,0.47877168436952156,0.11808973322099758,0.17086651846083545,6537.055327113591,78275.54888351755,95935.9446728864,102473.0,0.9362070464696691,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,13,14,14 +9.300000000000008,0.80564492750086,0.4481856425545815,0.47877168436952156,0.12165327501209289,0.1746249088197644,6433.224352916678,77837.39247678294,96039.77564708331,102473.0,0.9372202984891953,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,13,13,13,13,14,14 +9.400000000000007,0.8077635212055309,0.4481856425545815,0.47877168436952156,0.12071585545211128,0.1743340901060208,6162.779757835198,77787.25398795617,96310.22024216481,102473.0,0.9398594775420336,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,13,13,13,13,13,13,14 +9.500000000000007,0.808509439543914,0.4481856425545815,0.47877168436952156,0.12105094891620816,0.17550241878161524,6314.678106553784,77980.58279109478,96158.3218934462,102473.0,0.9383771519663346,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,13,13,13,13,13 +9.600000000000009,0.8058655507276798,0.4481856425545815,0.47877168436952156,0.12049369150712552,0.17391165737453954,7302.774186657075,78520.5814117638,95170.22581334293,102473.0,0.9287346502331632,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,13,13,13 +9.700000000000008,0.8064502387127079,0.4481856425545815,0.476547460056087,0.11902466475189621,0.17168055078562658,8239.454710509244,79354.63790836581,94233.54528949076,102473.0,0.9195938958505242,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12 +9.800000000000008,0.8076475189123503,0.44651479330912663,0.5113300841067435,0.11526170920813494,0.1650931019869161,8480.936845901337,79663.12310649859,93992.06315409867,102473.0,0.9172373518302251,8,8,8,9,9,9,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12 +9.900000000000007,0.8151751387260774,0.5312495689084592,0.5609390490568522,0.10130999409522201,0.14482812067158074,8775.800580810099,81091.12156669094,93697.1994191899,102473.0,0.9143598744956223,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12 +10.000000000000007,0.81413809378208,0.5312495689084592,0.5821711443660381,0.09482423393197092,0.13502169240796746,9127.088715300657,81781.01860973697,93345.91128469935,102473.0,0.9109317701706727,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,12,12,12,12,12,12,12,12,12,12 diff --git a/kmin_effectiveness_sites.csv b/kmin_effectiveness_sites.csv new file mode 100644 index 0000000..97c3afc --- /dev/null +++ b/kmin_effectiveness_sites.csv @@ -0,0 +1,71 @@ +site_idx,site_name,total_demand +1,MFP Senior - Woodsedge Apartments,172.0 +2,MFP Senior - Harry L Apartments,197.0 +3,MFP Senior - Cayuga Meadows,233.0 +4,MFP Senior - Wells Apartments,235.0 +5,MFP Senior - Lincoln Court,260.0 +6,MFP Senior - Park Terrace Congregate Apartments,268.0 +7,MFP Senior - Ellis Hollow,272.0 +8,MFP Senior - Jefferson Village,273.0 +9,MFP Senior - Springview Apartments,331.0 +10,MFP Senior - Addison Place Apartments,331.0 +11,MFP Senior - Conifer Village,338.0 +12,MFP Senior - Carpenter Apartments,342.0 +13,"MFP Senior - Elizabeth Square, Waverly",348.0 +14,MFP Senior - North Shore Towers,350.0 +15,MFP Senior - Village Square/Manor,411.0 +16,MFP Senior - Long Meadow Senior Housing,417.0 +17,MFP Senior - East Hill Senior Living,478.0 +18,"MFP Senior - Northern Broome Senior Center, Whitney Point",560.0 +19,MFP Senior - Metro Plaza Apartments,563.0 +20,MFP Senior - Bragg,602.0 +21,MFP Nichols-The Creamery,612.0 +22,MFP Senior - Corning Senior Center,675.0 +23,MFP Senior - Flannery,679.0 +24,MFP Senior - Titus Towers,728.0 +25,MFP Senior - Villa Serene,767.0000000000001 +26,MFP Senior - Dayspring,849.0 +27,MFP Schuyler Outreach,972.0 +28,MFP Troupsburg,1041.0 +29,MFP Senior - CFS Lakeview,1120.0 +30,MFP College Ithaca College,1245.0 +31,MFP Lamphear Court,1260.0 +32,MFP Bradford,1345.0 +33,MFP Danby,1442.0 +34,MFP Saint Mary Recreation Center,1483.0 +35,MFP College Corning Community College,1506.0 +36,MFP College TC3 -College,1569.0 +37,MFP Montour Falls-Schuyler County Human Services Complex,1643.0 +38,MFP Millport,1660.0 +39,MFP Beaver Dams,1707.0 +40,MFP Birnie Transportation Services,1707.0 +41,MFP Prattsburgh,1734.0 +42,MFP First Assembly Of God Church,1752.0 +43,MFP Canisteo,1770.0 +44,MFP Conklin- Maines Community Center,1838.0 +45,MFP Deposit,1879.0 +46,MFP Erin,1913.0 +47,MFP Lansing,1991.0 +48,MFP Salvation Army Ithaca,1993.0 +49,MFP Campbell,2022.0 +50,MFP Boys and Girls Club,2108.0 +51,MFP Woodhull,2112.0 +52,MFP Owego VFW,2115.0 +53,MFP Tuscarora,2119.0 +54,MFP Van Etten,2137.0 +55,MFP Wayland,2165.0 +56,MFP Reach for Christ Church Freeville,2200.0 +57,MFP American Legion - Binghamton,2202.0 +58,MFP Windsor,2210.0 +59,MFP Whitney Point,2228.0 +60,MFP Redeemer Lutheran Church,2306.0 +61,MFP Lindley,2329.0 +62,MFP Rehoboth Deliverance Ministry,2359.0 +63,MFP Colesville,2368.0 +64,MFP Richford,2925.0000000000005 +65,MFP Rathbone,2959.9999999999995 +66,MFP Bath,3074.0 +67,MFP The Love Church,3112.0 +68,MFP Endwell United Methodist Church,3423.0 +69,MFP Avoca,3775.0 +70,MFP Waverly,4363.0