Spaces:
Sleeping
Sleeping
| """Hugging Face Space โ Gradio ๋ฐ๋ชจ (v3, ๊ฐ์ฉ์ฑ ์ธ์ง ์ปจํด์ ์ ์ ์ฑ ). | |
| ์ฌ๊ณ + ๋น์ผ ์ ์ฒด ๊ฐ์ฉ์ฑ์ ์ ๋ ฅํ๋ฉด RL ์์ด์ ํธ๊ฐ ์ํฉ๋ณ ์ต์ ๋ฐ์ฃผ๋ฅผ ์ถ์ฒํ๋ค. | |
| ๊ฐ์ฉ์ฑ์ ๋ฐ๊พธ๋ฉด ์ถ์ฒ ์ ์ฒด๊ฐ ๋ฐ๋๋ ์ปจํด์ ์ ์ ์ฑ ์ ์ฒดํํ ์ ์๋ค. | |
| """ | |
| import gradio as gr | |
| from model import CONFIG, SUPPLIERS, demand_factors, load_model, recommend | |
| MODEL_PATH = "best_model_v3.pt" | |
| model = load_model(MODEL_PATH) | |
| TAU_MAX = CONFIG["tau_max"] | |
| SUP_NAMES = ["A", "B", "C", "D", "E"] | |
| def predict(on_hand, pipeline_str, day_of_year, avail_a, avail_b, avail_c, avail_d, avail_e): | |
| try: | |
| pipeline = [float(x.strip()) for x in pipeline_str.split(",") if x.strip() != ""] | |
| except ValueError: | |
| return "โ ๏ธ ํ์ดํ๋ผ์ธ์ ์ซ์ ์ฝค๋ง๊ตฌ๋ถ (์: 0,0,0,0,0,0,0)" | |
| if len(pipeline) != TAU_MAX: | |
| return f"โ ๏ธ ํ์ดํ๋ผ์ธ์ {TAU_MAX}๊ฐ ๊ฐ ํ์ (๋ฐ์ {len(pipeline)}๊ฐ)" | |
| available = [avail_a, avail_b, avail_c, avail_d, avail_e] | |
| idx, name, qty = recommend(model, float(on_hand), pipeline, int(day_of_year), available) | |
| df = demand_factors(int(day_of_year)) | |
| avail_str = ", ".join(n for n, a in zip(SUP_NAMES, available) if a) or "(์ ๋ถ ํ์ )" | |
| if idx == 0: | |
| head = "### ์ถ์ฒ: **๋ฐ์ฃผ ์ ํจ (None)**\n๊ฐ์ฉ ์ ์ฒด ์ค ๋ฐ์ฃผ ์ด๋์ด ์๊ฑฐ๋ ์ฌ๊ณ ์ถฉ๋ถ." | |
| body = "" | |
| else: | |
| info = SUPPLIERS[idx] | |
| head = f"### ์ถ์ฒ ๊ณต๊ธ์ ์ฒด: **{name}** ยท ์ฃผ๋ฌธ๋ **{qty}**" | |
| body = (f"\n- ๋ฆฌ๋ํ์ {info['tau']}์ผ ยท ๋จ๊ฐ {info['P']} ยท MOQ {info['MOQ']}") | |
| return ( | |
| f"{head}{body}\n\n" | |
| f"> ๊ฐ์ฉ ์ ์ฒด: **{avail_str}**\n" | |
| f"> ๊ธฐ๋์์(์ค๋/3์ผ/7์ผ): {df[0]:.2f} / {df[1]:.2f} / {df[2]:.2f}\n" | |
| f"> ์ฌ๊ณ {on_hand}, ์ฐ์ค์ผ {day_of_year}" | |
| ) | |
| with gr.Blocks(title="Dynamic Supplier Selection v3") as demo: | |
| gr.Markdown( | |
| "# ๐ฆ ๋์ ๊ณต๊ธ์ ์ฒด ์ ์ RL ์์ด์ ํธ (v3)\n" | |
| "์ฌ๊ณ + **๋น์ผ ์ ์ฒด ๊ฐ์ฉ์ฑ**์ ์ ๋ ฅํ๋ฉด ์ํฉ๋ณ ์ต์ ๋ฐ์ฃผ๋ฅผ ์ถ์ฒํฉ๋๋ค. " | |
| "๊ฐ์ฉ์ฑ ์ฒดํฌ๋ฅผ ๋ฐ๊ฟ๋ณด์ธ์ โ 1์์ ์ ์ฒด๊ฐ ํ์ ์ด๋ฉด **์ฐจ์ ์ฑ ์ผ๋ก ์๋ ํด๋ฐฑ**ํ๋ " | |
| "์ปจํด์ ์ ์ ์ฑ ์ ํ์ธํ ์ ์์ต๋๋ค." | |
| ) | |
| with gr.Row(): | |
| with gr.Column(): | |
| on_hand = gr.Number(value=1000, label="ํ์ฌ ๋ณด์ ์ฌ๊ณ (on_hand)") | |
| pipeline = gr.Textbox(value="0,0,0,0,0,0,0", | |
| label=f"ํ์ดํ๋ผ์ธ (ํฅํ 1~{TAU_MAX}์ผ ์ ๊ณ ์์ , ์ฝค๋ง {TAU_MAX}๊ฐ)") | |
| day = gr.Slider(0, 364, value=150, step=1, label="์ฐ์ค ์ผ์ (๊ณ์ ์ฑ)") | |
| gr.Markdown("**๋น์ผ ์ ์ฒด ๊ฐ์ฉ์ฑ** (์ฒดํฌ=์ฃผ๋ฌธ ๊ฐ๋ฅ)") | |
| with gr.Row(): | |
| ca = gr.Checkbox(value=True, label="A (๋ฆฌ๋7ยท์ ๊ฐ)") | |
| cb = gr.Checkbox(value=True, label="B (๋ฆฌ๋5)") | |
| cc = gr.Checkbox(value=True, label="C (๋ฆฌ๋3)") | |
| cd = gr.Checkbox(value=True, label="D (๋ฆฌ๋1)") | |
| ce = gr.Checkbox(value=True, label="E (์ฆ์ยท๊ณ ๊ฐ)") | |
| btn = gr.Button("๋ฐ์ฃผ ์ถ์ฒ ๋ฐ๊ธฐ", variant="primary") | |
| with gr.Column(): | |
| out = gr.Markdown() | |
| inputs = [on_hand, pipeline, day, ca, cb, cc, cd, ce] | |
| btn.click(predict, inputs=inputs, outputs=out) | |
| gr.Examples( | |
| examples=[ | |
| [1000, "0,0,0,0,0,0,0", 150, True, True, True, True, True], | |
| [1000, "0,0,0,0,0,0,0", 150, False, True, True, True, True], | |
| [200, "0,0,0,0,0,0,0", 100, True, True, True, True, True], | |
| [1800, "0,0,0,0,0,0,0", 100, True, True, True, True, True], | |
| ], | |
| inputs=inputs, | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() | |