{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "d4b330ea",
   "metadata": {},
   "source": [
    "# 生产计划优化 — 线性规划\n",
    "\n",
    "对应案例: [生产计划](/docs/case-studies/operations/production-planning-case/)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "cc630fc2",
   "metadata": {},
   "source": [
    "## 1. 问题建模"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ed7d833c",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np, pandas as pd, matplotlib.pyplot as plt\n",
    "from scipy.optimize import linprog\n",
    "# Products: A, B, C\n",
    "profit=np.array([40,50,60])  # per unit\n",
    "# Resource constraints\n",
    "A_constraints=np.array([[2,1,3],[1,2,2],[3,1,1],[1,1,1]])\n",
    "b_resources=np.array([200,150,180,100])  # available\n",
    "print('Products: A,B,C')\n",
    "print(f'Profit: {profit}')\n",
    "print(f'Resources: {b_resources}')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b763b30",
   "metadata": {},
   "source": [
    "## 2. 求解最优生产计划"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "fdd8b849",
   "metadata": {},
   "outputs": [],
   "source": [
    "res=linprog(-profit,A_ub=A_constraints,b_ub=b_resources,bounds=(0,None),method='highs')\n",
    "if res.success:\n",
    "    print(f'Optimal: A={res.x[0]:.1f}, B={res.x[1]:.1f}, C={res.x[2]:.1f}')\n",
    "    print(f'Profit: ${-res.fun:.2f}')\n",
    "    usage=A_constraints@res.x\n",
    "    for i,u in enumerate(usage):\n",
    "        print(f'Resource {i+1}: {u:.1f}/{b_resources[i]} ({(u/b_resources[i])*100:.0f}%)')\n",
    "else:\n",
    "    print('No solution')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c37421dd",
   "metadata": {},
   "source": [
    "## 3. 敏感性分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "777f2dda",
   "metadata": {},
   "outputs": [],
   "source": [
    "# What if profit increases?\n",
    "profits=np.linspace(40,80,5)\n",
    "results=[]\n",
    "for p in profits:\n",
    "    pr=np.array([p,50,60])\n",
    "    r=linprog(-pr,A_ub=A_constraints,b_ub=b_resources,bounds=(0,None),method='highs')\n",
    "    if r.success:\n",
    "        results.append({'p_A':p,'A':r.x[0],'B':r.x[1],'C':r.x[2],'profit':-r.fun})\n",
    "sensitivity=pd.DataFrame(results)\n",
    "print(sensitivity.round(1))\n",
    "# Plot\n",
    "fig,ax=plt.subplots(figsize=(10,5))\n",
    "ax.bar(range(len(sensitivity)),sensitivity['profit'],color='#2196F3')\n",
    "ax.set_xticks(range(len(sensitivity)))\n",
    "ax.set_xticklabels([f'pA=${p:.0f}' for p in sensitivity['p_A']])\n",
    "ax.set_ylabel('Total Profit'); ax.set_title('Sensitivity: Product A Profit')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5dcfbcc0",
   "metadata": {},
   "source": [
    "---\n",
    "*更多分析见 [案例文档](/docs/case-studies/operations/production-planning-case/)*"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.10.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
