File size: 2,125 Bytes
b645841
 
2579cbe
 
 
b645841
2579cbe
 
 
 
42492c6
 
2579cbe
b645841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2579cbe
b645841
2579cbe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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}')