import streamlit as st # Layout st.set_page_config(page_title='报价计算器') # 设定参数 st.sidebar.header('参数设置') k = st.sidebar.slider('设定最低价', min_value=0, max_value=100, value=10) h = st.sidebar.slider('设定最高价', min_value=0, max_value=100, value=76) max_score = st.sidebar.slider('设定满分', min_value=0, max_value=10, value=2) high_penalty = st.sidebar.slider('设定高价扣分值', min_value=0.00, max_value=0.08, value=0.03, step=0.01) low_penalty = st.sidebar.slider('设定低价扣分值', min_value=0.00, max_value=0.08, value=0.02, step=0.01) step = st.sidebar.slider('设定迭代步长', min_value=0.01, max_value=1.00, value=0.01, step=0.01) def score(price, base_price): deviation_rate = (price - base_price) / base_price if price == base_price: return max_score elif price > base_price: return max(max_score - deviation_rate * 100 * high_penalty, 0) else: return max(max_score - abs(deviation_rate) * 100 * low_penalty, 0) def find_range(): max_score_diff = max_score / 3 # 最大分数差距 A0_range = [k, h] for A6_price in [k, (k+h)/2, h]: temp_range = [0.0, 0.0] for A0_price in [k + x*step for x in range(int((h-k)/step) + 1)]: base_price = (h * 2 + k * 2 + A6_price + A0_price) / 6 A6_score = score(A6_price, base_price) A0_score = score(A0_price, base_price) if A0_score >= A6_score - max_score_diff: temp_range[0] = A0_price break for A0_price in [h - x*step for x in range(int((h-k)/step) + 1)]: base_price = (h * 2 + k * 2 + A6_price + A0_price) / 6 A6_score = score(A6_price, base_price) A0_score = score(A0_price, base_price) if A0_score >= A6_score - max_score_diff: temp_range[1] = A0_price break A0_range = [max(A0_range[0], temp_range[0]), min(A0_range[1], temp_range[1])] return A0_range # Display A0_range = find_range() st.header(f'A0的报价范围是 {A0_range[0]:.2f} 到 {A0_range[1]:.2f}')