This commit is contained in:
Zyy554 2025-11-30 00:44:13 +08:00
commit e4c411bbe2
28 changed files with 5975 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

184
.gitignore vendored Normal file
View File

@ -0,0 +1,184 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
output/
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
cover/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
db.sqlite3
db.sqlite3-journal
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
.pybuilder/
target/
# Jupyter Notebook
.ipynb_checkpoints
# IPython
profile_default/
ipython_config.py
# pyenv
# For a library or package, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# .python-version
# pipenv
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
# However, in case of collaboration, if having platform-specific dependencies or dependencies
# having no cross-platform support, pipenv may install dependencies that don't work, or not
# install all needed dependencies.
#Pipfile.lock
# UV
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
#uv.lock
# poetry
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
# This is especially recommended for binary packages to ensure reproducibility, and is more
# commonly ignored for libraries.
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
#poetry.lock
# pdm
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
#pdm.lock
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
# in version control.
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
.pdm.toml
.pdm-python
.pdm-build/
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
__pypackages__/
# Celery stuff
celerybeat-schedule
celerybeat.pid
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
.dmypy.json
dmypy.json
# Pyre type checker
.pyre/
# pytype static type analyzer
.pytype/
# Cython debug symbols
cython_debug/
# PyCharm
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/
# Ruff stuff:
.ruff_cache/
# PyPI configuration file
.pypirc
# Cursor
# Cursor is an AI-powered code editor.`.cursorignore` specifies files/directories to
# exclude from AI features like autocomplete and code analysis. Recommended for sensitive data
# refer to https://docs.cursor.com/context/ignore-files
.cursorignore
.cursorindexingignore
*.xlsx

201
LICENSE Normal file
View File

@ -0,0 +1,201 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

2
README.md Normal file
View File

@ -0,0 +1,2 @@
# gw

259
app.py Normal file
View File

@ -0,0 +1,259 @@
import json
import os
import matplotlib
import pandas as pd
import solara
from mesa.visualization import SolaraViz, make_plot_component
from simulation_model import SimulationModel
# Configure matplotlib to support Chinese labels.
matplotlib.rcParams["font.family"] = ["Microsoft YaHei", "SimHei", "sans-serif"]
matplotlib.rcParams["axes.unicode_minus"] = False
# Load default parameters from data/model_params.json
with open("data/model_params.json", "r", encoding="utf-8") as f:
_cfg = json.load(f)
def _load_factory_name_map():
try:
with open("data/factory_mapping.json", "r", encoding="utf-8") as f:
data = json.load(f)
except FileNotFoundError:
return {}
# data is Chinese name -> code; invert it
return {v: k for k, v in data.items()}
FACTORY_NAME_MAP = _load_factory_name_map()
def _load_product_catalog():
try:
try:
df = pd.read_csv("data/product.csv", encoding="utf-8")
except UnicodeDecodeError:
df = pd.read_csv("data/product.csv", encoding="gbk")
except FileNotFoundError:
return pd.DataFrame()
df.columns = [c.strip() for c in df.columns]
rename_map = {
df.columns[0]: "平台",
df.columns[1]: "标准机型",
df.columns[2]: "叶片型号",
}
df = df.rename(columns=rename_map)
df["平台"] = df["平台"].astype(str).str.strip()
df["标准机型"] = df["标准机型"].astype(str).str.strip()
df["叶片型号"] = df["叶片型号"].astype(str).str.strip()
return df
PRODUCT_DF = _load_product_catalog()
ALL_PLATFORMS = sorted(PRODUCT_DF["平台"].dropna().unique()) if not PRODUCT_DF.empty else []
ALL_STANDARDS = sorted(PRODUCT_DF["标准机型"].dropna().unique()) if not PRODUCT_DF.empty else []
def _platform_options():
return ["全部"] + ALL_PLATFORMS
def _standard_options(platform):
if PRODUCT_DF.empty:
return ["全部"]
if platform and platform != "全部":
stds = sorted(PRODUCT_DF.loc[PRODUCT_DF["平台"] == platform, "标准机型"].dropna().unique())
else:
stds = ALL_STANDARDS
return ["全部"] + [s for s in stds if s]
def _product_set_for_selection(platform, standard):
if PRODUCT_DF.empty:
return []
df = PRODUCT_DF
if platform and platform != "全部":
df = df[df["平台"] == platform]
if standard and standard != "全部":
df = df[df["标准机型"] == standard]
return sorted(df["叶片型号"].dropna().unique())
def _legend_postprocess(label_map, ylabel=None):
def _post(ax):
handles, labels = ax.get_legend_handles_labels()
if labels:
mapped = [label_map.get(label, label) for label in labels]
ax.legend(handles, mapped, loc="best")
if ylabel:
ax.set_ylabel(ylabel)
return _post
def _split_product_set(text: str):
return [p.strip() for p in text.split(",") if p.strip()]
@solara.component
def Page():
platform_selected = solara.use_reactive("全部")
standard_selected = solara.use_reactive("全部")
initial_product_set_text = ",".join(_cfg.get("product_set", []))
product_set_value = solara.use_reactive(initial_product_set_text)
def sync_product_set(platform_val, standard_val):
blades = _product_set_for_selection(platform_val, standard_val)
if blades:
product_set_value.set(",".join(blades))
elif PRODUCT_DF.empty:
product_set_value.set(initial_product_set_text)
else:
product_set_value.set("")
def on_platform_change(val):
platform_selected.set(val)
std_opts = _standard_options(val)
if standard_selected.value not in std_opts:
standard_selected.set("全部")
active_std = "全部"
else:
active_std = standard_selected.value
sync_product_set(val, active_std)
def on_standard_change(val):
standard_selected.set(val)
sync_product_set(platform_selected.value, val)
# Build model params fresh each render so product_set value stays in sync
model_params = {
"product_set": {"type": "InputText", "value": product_set_value, "label": "产品集合(逗号分隔)"},
"is_within_region_allocation_only": {
"type": "Select",
"value": bool(_cfg.get("is_within_region_allocation_only", False)),
"values": [False, True],
"label": "仅区域内调拨?(布尔)",
},
"month1": {"type": "InputText", "value": _cfg.get("month1", 220), "label": "第1个月效率小时/支)"},
"month2": {"type": "InputText", "value": _cfg.get("month2", 100), "label": "第2个月效率小时/支)"},
"month3": {"type": "InputText", "value": _cfg.get("month3", 45), "label": "第3个月效率小时/支)"},
"month4": {"type": "InputText", "value": _cfg.get("month4", 36), "label": "第4个月及以后效率小时/支)"},
"holiday_days_1": {"type": "InputText", "value": _cfg.get("holiday_days_1", 2), "label": "1月假日天数"},
"holiday_days_2": {"type": "InputText", "value": _cfg.get("holiday_days_2", 2), "label": "2月假日天数"},
"holiday_days_3": {"type": "InputText", "value": _cfg.get("holiday_days_3", 2), "label": "3月假日天数"},
"holiday_days_4": {"type": "InputText", "value": _cfg.get("holiday_days_4", 2), "label": "4月假日天数"},
"holiday_days_5": {"type": "InputText", "value": _cfg.get("holiday_days_5", 2), "label": "5月假日天数"},
"holiday_days_6": {"type": "InputText", "value": _cfg.get("holiday_days_6", 2), "label": "6月假日天数"},
"holiday_days_7": {"type": "InputText", "value": _cfg.get("holiday_days_7", 2), "label": "7月假日天数"},
"holiday_days_8": {"type": "InputText", "value": _cfg.get("holiday_days_8", 2), "label": "8月假日天数"},
"holiday_days_9": {"type": "InputText", "value": _cfg.get("holiday_days_9", 2), "label": "9月假日天数"},
"holiday_days_10": {"type": "InputText", "value": _cfg.get("holiday_days_10", 2), "label": "10月假日天数"},
"holiday_days_11": {"type": "InputText", "value": _cfg.get("holiday_days_11", 2), "label": "11月假日天数"},
"holiday_days_12": {"type": "InputText", "value": _cfg.get("holiday_days_12", 2), "label": "12月假日天数"},
}
for key, val in _cfg.items():
if key.startswith("factor_"):
suffix = key.replace("factor_", "")
label_name = FACTORY_NAME_MAP.get(suffix, suffix)
model_params[key] = {"type": "InputText", "value": val, "label": f"{label_name} 磨合系数(倍率)"}
active_model = solara.use_memo(
lambda: SimulationModel(product_set=_split_product_set(product_set_value.value)),
dependencies=[product_set_value.value],
)
production_label_map = {region: f"{region}-产出[套]" for region in active_model.region_names}
demand_label_map = {f"demand_{region}": f"{region}-需求[套]" for region in active_model.demand_regions}
inventory_label_map = {f"inventory_{region}": f"{region}-库存[套]" for region in active_model.region_names}
fulfill_pct_label_map = {f"fulfill_pct_{region}": f"{region}-满足率[%]" for region in active_model.demand_regions}
unmet_label_map = {f"unmet_{region}": f"{region}-未满足需求[套]" for region in active_model.demand_regions}
overall_fulfill_label_map = {"fulfill_pct_overall": "总体满足率[%]"}
transport_cost_label_map = {"transport_cost": "运输成本[万元]"}
fulfill_month_label_map = {f"fulfill_month_{region}": f"{region}-当月满足率[%]" for region in active_model.demand_regions}
fulfill_cum_label_map = {f"fulfill_cum_{region}": f"{region}-累计满足率[%]" for region in active_model.demand_regions}
transport_units_label_map = {f"transport_units_{region}": f"{region}-运输量[套]" for region in active_model.demand_regions}
RegionPlot = make_plot_component(
{region: f"C{idx}" for idx, region in enumerate(active_model.region_names)},
post_process=_legend_postprocess(production_label_map, ylabel="产出[套]"),
)
DemandPlot = make_plot_component(
{f"demand_{region}": f"C{idx}" for idx, region in enumerate(active_model.demand_regions)},
post_process=_legend_postprocess(demand_label_map, ylabel="需求量[套]"),
)
InventoryPlot = make_plot_component(
{f"inventory_{region}": f"C{idx}" for idx, region in enumerate(active_model.region_names)},
post_process=_legend_postprocess(inventory_label_map, ylabel="库存量[套]"),
)
FulfillPlot = make_plot_component(
{f"fulfill_pct_{region}": f"C{idx}" for idx, region in enumerate(active_model.demand_regions)},
post_process=_legend_postprocess(fulfill_pct_label_map, ylabel="满足率[%]"),
)
UnmetPlot = make_plot_component(
{f"unmet_{region}": f"C{idx}" for idx, region in enumerate(active_model.demand_regions)},
post_process=_legend_postprocess(unmet_label_map, ylabel="未满足需求[套]"),
)
OverallFulfillPlot = make_plot_component(
{"fulfill_pct_overall": "tab:purple"},
post_process=_legend_postprocess(overall_fulfill_label_map, ylabel="总体满足率[%]"),
)
TransportCostPlot = make_plot_component(
{"transport_cost": "tab:brown"},
post_process=_legend_postprocess(transport_cost_label_map, ylabel="运输成本[万元]"),
)
FulfillMonthPlot = make_plot_component(
{f"fulfill_month_{region}": f"C{idx}" for idx, region in enumerate(active_model.demand_regions)},
post_process=_legend_postprocess(fulfill_month_label_map, ylabel="当月满足率[%]"),
)
FulfillCumPlot = make_plot_component(
{f"fulfill_cum_{region}": f"C{idx}" for idx, region in enumerate(active_model.demand_regions)},
post_process=_legend_postprocess(fulfill_cum_label_map, ylabel="累计满足率[%]"),
)
TransportUnitsPlot = make_plot_component(
{f"transport_units_{region}": f"C{idx}" for idx, region in enumerate(active_model.demand_regions)},
post_process=_legend_postprocess(transport_units_label_map, ylabel="运输量[套]"),
)
def get_total_production(model):
return solara.Markdown(f"**累计产量(机组):{model.cumulative_production:.2f}**")
def get_mean_abs_error(model):
return solara.Markdown(f"**工厂年产量均值绝对误差:{model.mean_abs_error:.2f}**")
with solara.Column() as main:
with solara.Card("产品筛选"):
solara.Select(
label="平台",
value=platform_selected,
values=_platform_options(),
on_value=on_platform_change,
)
solara.Select(
label="标准机型",
value=standard_selected,
values=_standard_options(platform_selected.value),
on_value=on_standard_change,
)
solara.Text(f"叶片型号数:{len(_split_product_set(product_set_value.value))}")
SolaraViz(
active_model,
renderer=None,
components=[
RegionPlot,
DemandPlot,
InventoryPlot,
FulfillPlot,
UnmetPlot,
OverallFulfillPlot,
TransportCostPlot,
FulfillMonthPlot,
FulfillCumPlot,
TransportUnitsPlot,
get_total_production,
get_mean_abs_error,
],
model_params=model_params,
name="产线生产与需求可视化",
show_parameter_values=True,
)
return main
page = Page()

65
build_distance_matrix.py Normal file
View File

@ -0,0 +1,65 @@
import math
from pathlib import Path
import pandas as pd
def haversine(lat1, lon1, lat2, lon2):
R = 6371.0 # Earth radius in km
phi1, phi2 = math.radians(lat1), math.radians(lat2)
dphi = math.radians(lat2 - lat1)
dlambda = math.radians(lon2 - lon1)
a = math.sin(dphi / 2) ** 2 + math.cos(phi1) * math.cos(phi2) * math.sin(dlambda / 2) ** 2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
def _read_csv_flexible(path: str, header: int = 0):
for enc in ["utf-8", "utf-8-sig", "gbk", "latin1"]:
try:
return pd.read_csv(path, encoding=enc, engine="python")
except UnicodeDecodeError:
continue
# fallback with ignoring errors
return pd.read_csv(path, encoding="utf-8", engine="python", encoding_errors="ignore")
def _infer_coords(df, name_col, lat_col, lon_col):
# Cast numeric columns
df[lat_col] = pd.to_numeric(df[lat_col], errors="coerce")
df[lon_col] = pd.to_numeric(df[lon_col], errors="coerce")
lat_range = df[lat_col].between(-90, 90).mean()
lon_range = df[lon_col].between(-180, 180).mean()
# If swapped, switch
if lat_range < lon_range:
df[lat_col], df[lon_col] = df[lon_col], df[lat_col]
df = df.rename(columns={name_col: "name", lat_col: "lat", lon_col: "lon"})
return df[["name", "lat", "lon"]].dropna()
def main():
demand = _read_csv_flexible("data/DemandLocation.csv")
factory = _read_csv_flexible("data/FactoryLocation.csv")
# Demand: assume first column name, last two numeric
demand_coords = _infer_coords(demand, demand.columns[0], demand.columns[-2], demand.columns[-1])
# Factory: assume first column name, last two numeric
factory_coords = _infer_coords(factory, factory.columns[0], factory.columns[-2], factory.columns[-1])
rows = []
for _, drow in demand_coords.iterrows():
for _, frow in factory_coords.iterrows():
dist = haversine(drow["lat"], drow["lon"], frow["lat"], frow["lon"])
rows.append({"demand_city": drow["name"], "factory": frow["name"], "distance_km": dist})
df = pd.DataFrame(rows)
out_path = Path("data") / "distance_matrix.csv"
df.to_csv(out_path, index=False, encoding="utf-8-sig")
print(f"Saved {len(df)} rows to {out_path}")
if __name__ == "__main__":
main()

98
data/DemandLocation.csv Normal file
View File

@ -0,0 +1,98 @@
需求方,经度,纬度
三门峡市,111.581892,34.592412
中卫市,104.326348,37.42582674
乌兰察布市,112.583248,41.859146
乌鲁木齐市,88.3526,43.4871
佳木斯市,132.578341,46.90926
兴安盟,122.089308,45.921339
南阳市,112.97302,32.488644
吐鲁番地区,88.26158,42.931764
吴忠市,105.999463,37.823582
哈密市,93.2830057,43.96107218
哈尔滨市,128.1882308,45.77706491
商丘市,115.17386,34.39346
国际,101.091124,38.787478
塔城地区,85.047175,46.867906
大同市,114.3823027,39.46432744
天津市,117.408432,40.046544
定西市,104.24555,34.360151
巴音郭楞蒙古自治州,87.795193,39.202885
庆阳市,106.578249,36.363741
延安市,107.7202223,36.9307021
张家口市,114.366182,41.115161
德州市,116.7061394,37.21128042
忻州市,111.320864,38.89993
恩施土家族苗族自治州,108.789522,30.452828
承德市,117.306009,41.817294
新疆生产建设兵团第十师,87.659628,47.373723
昆明市,103.3556505,25.74601202
昌吉回族自治州,90.524934,44.753213
晋中市,113.9980185,37.59244878
曲靖市,104.066905,25.501188
朔州市,111.95946,39.612056
朝阳市,120.960563,42.159688
来宾市,108.8706184,23.53272696
松原市,123.5325177,44.3099525
梧州市,110.8023439,23.92578726
榆林市,109.424847,38.670326
永州市,111.470832,25.975085
沈阳市,123.350854,42.471099
沧州市,117.354557,38.27852
河池市,106.764545,25.04219
济源市,112.1719039,35.04617738
海南藏族自治州,99.66212099,36.11799294
海西蒙古族藏族自治州,96.085432,37.13638947
渭南市,109.5518929,35.41186149
烟台市,121.0760873,36.62456081
玉林市,110.140777,22.17541
白城市,123.906296,45.50445
百色市,105.9323029,24.4875734
秦皇岛市,119.2400992,39.53770068
绥化市,127.581712,46.566521
聊城市,115.4099,36.5642
荆州市,112.2145266,29.71230666
荆门市,112.590853,31.324363
葫芦岛市,120.69668,40.701877
衡水市,115.432929,38.006891
赣州市,114.879181,25.768879
辽阳市,123.438258,41.423986
运城市,111.8791446,35.53009921
通辽市,121.079033,43.025639
邢台市,114.9568513,37.40531178
鄂尔多斯市,110.669035,40.003893
酒泉市,97.142116,40.792238
重庆市,108.012898,29.179982
钦州市,109.3893375,22.15819114
铜仁市,108.504004,28.563993
锡林郭勒盟,114.8256,44.5873
锦州市,121.510124,40.97325273
阜阳市,114.967423,33.016503
阳江市,112.0157107,20.9886087
阳泉市,113.148888,38.211682
阿勒泰地区,85.62480544,47.14043099
鞍山市,122.3749923,41.31678205
黄冈市,115.937974,29.922599
黔西南布依族苗族自治州,105.87635,24.965761
济南市,117.02,36.40
安阳市,114,35.72
白银市,104.09,36.41
毕节市,106,26.86
邯郸市,114.47,36.60
七台河市,131.01,45.78
通化市,125.95,41.73
盐城市,120.17,33.36
本溪市,123.69,41.49
鹤岗市,130.30,47.36
开封市,114.32,34.80
洛阳市,112.45,34.72
莆田市,119.01,25.46
新乡市,113.81,35.20
伊犁哈萨克自治州,43.916823,81.324136
镇江市,119.43,32.19
上海市,121.29,31.14
桂林市,110.296647,25.27981
呼和浩特市,111.41,40.48
济宁市,116.35,35.41
天门市,113.162071,30.647308
黔南布依族苗族自治州,106.45,25.45
黔东南苗族侗族自治州,107.1720,25.1920
1 需求方 经度 纬度
2 三门峡市 111.581892 34.592412
3 中卫市 104.326348 37.42582674
4 乌兰察布市 112.583248 41.859146
5 乌鲁木齐市 88.3526 43.4871
6 佳木斯市 132.578341 46.90926
7 兴安盟 122.089308 45.921339
8 南阳市 112.97302 32.488644
9 吐鲁番地区 88.26158 42.931764
10 吴忠市 105.999463 37.823582
11 哈密市 93.2830057 43.96107218
12 哈尔滨市 128.1882308 45.77706491
13 商丘市 115.17386 34.39346
14 国际 101.091124 38.787478
15 塔城地区 85.047175 46.867906
16 大同市 114.3823027 39.46432744
17 天津市 117.408432 40.046544
18 定西市 104.24555 34.360151
19 巴音郭楞蒙古自治州 87.795193 39.202885
20 庆阳市 106.578249 36.363741
21 延安市 107.7202223 36.9307021
22 张家口市 114.366182 41.115161
23 德州市 116.7061394 37.21128042
24 忻州市 111.320864 38.89993
25 恩施土家族苗族自治州 108.789522 30.452828
26 承德市 117.306009 41.817294
27 新疆生产建设兵团第十师 87.659628 47.373723
28 昆明市 103.3556505 25.74601202
29 昌吉回族自治州 90.524934 44.753213
30 晋中市 113.9980185 37.59244878
31 曲靖市 104.066905 25.501188
32 朔州市 111.95946 39.612056
33 朝阳市 120.960563 42.159688
34 来宾市 108.8706184 23.53272696
35 松原市 123.5325177 44.3099525
36 梧州市 110.8023439 23.92578726
37 榆林市 109.424847 38.670326
38 永州市 111.470832 25.975085
39 沈阳市 123.350854 42.471099
40 沧州市 117.354557 38.27852
41 河池市 106.764545 25.04219
42 济源市 112.1719039 35.04617738
43 海南藏族自治州 99.66212099 36.11799294
44 海西蒙古族藏族自治州 96.085432 37.13638947
45 渭南市 109.5518929 35.41186149
46 烟台市 121.0760873 36.62456081
47 玉林市 110.140777 22.17541
48 白城市 123.906296 45.50445
49 百色市 105.9323029 24.4875734
50 秦皇岛市 119.2400992 39.53770068
51 绥化市 127.581712 46.566521
52 聊城市 115.4099 36.5642
53 荆州市 112.2145266 29.71230666
54 荆门市 112.590853 31.324363
55 葫芦岛市 120.69668 40.701877
56 衡水市 115.432929 38.006891
57 赣州市 114.879181 25.768879
58 辽阳市 123.438258 41.423986
59 运城市 111.8791446 35.53009921
60 通辽市 121.079033 43.025639
61 邢台市 114.9568513 37.40531178
62 鄂尔多斯市 110.669035 40.003893
63 酒泉市 97.142116 40.792238
64 重庆市 108.012898 29.179982
65 钦州市 109.3893375 22.15819114
66 铜仁市 108.504004 28.563993
67 锡林郭勒盟 114.8256 44.5873
68 锦州市 121.510124 40.97325273
69 阜阳市 114.967423 33.016503
70 阳江市 112.0157107 20.9886087
71 阳泉市 113.148888 38.211682
72 阿勒泰地区 85.62480544 47.14043099
73 鞍山市 122.3749923 41.31678205
74 黄冈市 115.937974 29.922599
75 黔西南布依族苗族自治州 105.87635 24.965761
76 济南市 117.02 36.40
77 安阳市 114 35.72
78 白银市 104.09 36.41
79 毕节市 106 26.86
80 邯郸市 114.47 36.60
81 七台河市 131.01 45.78
82 通化市 125.95 41.73
83 盐城市 120.17 33.36
84 本溪市 123.69 41.49
85 鹤岗市 130.30 47.36
86 开封市 114.32 34.80
87 洛阳市 112.45 34.72
88 莆田市 119.01 25.46
89 新乡市 113.81 35.20
90 伊犁哈萨克自治州 43.916823 81.324136
91 镇江市 119.43 32.19
92 上海市 121.29 31.14
93 桂林市 110.296647 25.27981
94 呼和浩特市 111.41 40.48
95 济宁市 116.35 35.41
96 天门市 113.162071 30.647308
97 黔南布依族苗族自治州 106.45 25.45
98 黔东南苗族侗族自治州 107.1720 25.1920

28
data/FactoryLocation.csv Normal file
View File

@ -0,0 +1,28 @@
工厂,经度,纬度
艾郎玉门,97.142116,40.792238
艾郎张北,114.366182,41.115161
时代巴里坤,93.2830057,43.96107218
时代百色,105.9323029,24.4875734
时代射阳,119.5548,33.3112
时代松原,123.5325177,44.3099525
时代株洲,113.151737,27.835806
双瑞大丰,120.43,33.11
双瑞东营,118.07,36.55
天顺濮阳,115.0742,35.7773
天顺沙洋,112.590853,31.324363
中材白城,123.906296,45.50445
中材阜宁,119.8,33.8
中材哈密,93.2830057,43.96107218
中材邯郸,113.27,36.02
中材酒泉,97.142116,40.792238
中材连云港,119.13,34.36
中材萍乡,113.89,27.66
中材锡林,114.8256,44.5873
中材兴安盟,122.089308,45.921339
中材阳江,112.0157107,20.9886087
中材伊吾,93.2830057,43.96107218
中材玉溪,101.16,23.19
重通昌吉,90.524934,44.753213
重通大安,123.906296,45.50445
重通如东,120.42,32.12
重通武威,103.9680036,39.09623555
1 工厂 经度 纬度
2 艾郎玉门 97.142116 40.792238
3 艾郎张北 114.366182 41.115161
4 时代巴里坤 93.2830057 43.96107218
5 时代百色 105.9323029 24.4875734
6 时代射阳 119.5548 33.3112
7 时代松原 123.5325177 44.3099525
8 时代株洲 113.151737 27.835806
9 双瑞大丰 120.43 33.11
10 双瑞东营 118.07 36.55
11 天顺濮阳 115.0742 35.7773
12 天顺沙洋 112.590853 31.324363
13 中材白城 123.906296 45.50445
14 中材阜宁 119.8 33.8
15 中材哈密 93.2830057 43.96107218
16 中材邯郸 113.27 36.02
17 中材酒泉 97.142116 40.792238
18 中材连云港 119.13 34.36
19 中材萍乡 113.89 27.66
20 中材锡林 114.8256 44.5873
21 中材兴安盟 122.089308 45.921339
22 中材阳江 112.0157107 20.9886087
23 中材伊吾 93.2830057 43.96107218
24 中材玉溪 101.16 23.19
25 重通昌吉 90.524934 44.753213
26 重通大安 123.906296 45.50445
27 重通如东 120.42 32.12
28 重通武威 103.9680036 39.09623555

113
data/ProductionLine.csv Normal file
View File

@ -0,0 +1,113 @@
区域名,工厂名,是否新工厂,产线ID,生产型号,开始月份,结束月份
西北东部,艾郎玉门,是,艾郎玉门1,GWBD-A2,1,12
西北东部,艾郎玉门,是,艾郎玉门2,GWBD-A2,1,12
华北,艾郎张北,是,艾郎张北1,GWBD-A2,1,12
华北,艾郎张北,是,艾郎张北2,GWBD-A2,1,12
西北西部,时代巴里坤,是,时代巴里坤1,GWBD-A2,5,12
西北西部,时代巴里坤,是,时代巴里坤2,GWBD-A2,5,12
西北西部,时代巴里坤,是,时代巴里坤3,GW99A,3,4
西北西部,时代巴里坤,是,时代巴里坤4,GW99A,6,9
华南,时代百色,是,时代百色1,GWBD-A3,5,12
华南,时代百色,是,时代百色2,GWBD-A3,5,12
华东南北部,时代射阳,是,时代射阳1,GW130,9,12
华东南北部,时代射阳,是,时代射阳2,GW130,9,12
东北,时代松原,是,时代松原1,GWBD-A3,6,12
东北,时代松原,是,时代松原2,GWBD-A3,6,12
华东南南部,时代株洲,是,时代株洲1,GW99A,4,12
华东南南部,时代株洲,是,时代株洲2,GW99A,4,12
华东南北部,双瑞大丰,是,双瑞大丰1,GW110.5,2,11
华东南北部,双瑞大丰,是,双瑞大丰2,GW110.5,2,11
华东南北部,双瑞大丰,是,双瑞大丰3,GW93,1,1
华东南北部,双瑞东营,否,双瑞东营1,GWBD-A2,10,12
华东南北部,双瑞东营,否,双瑞东营2,GWBD-A2,10,12
华东南北部,双瑞东营,否,双瑞东营3,GWBD-A2,10,12
华东南北部,双瑞东营,否,双瑞东营4,GWBD-A2,10,12
华东南北部,天顺濮阳,否,天顺濮阳1,GW99A,8,12
华东南北部,天顺濮阳,否,天顺濮阳2,GW99A,8,12
华东南北部,天顺沙洋,否,天顺沙洋1,GW93,2,2
华东南北部,天顺沙洋,是,天顺沙洋2,GW93,5,5
华东南北部,天顺沙洋,否,天顺沙洋3,GW93,11,11
华东南北部,天顺沙洋,否,天顺沙洋4,GW99,10,11
华东南北部,天顺沙洋,否,天顺沙洋5,GW99A,5,12
华东南北部,天顺沙洋,否,天顺沙洋6,GW99A,5,12
东北,中材白城,否,中材白城1,GWBD-A3,8,8
华东南北部,中材阜宁,是,中材阜宁1,GW110.5,4,11
华东南北部,中材阜宁,是,中材阜宁2,GW110.5,4,11
华东南北部,中材阜宁,是,中材阜宁3,GW110.5,4,11
华东南北部,中材阜宁,是,中材阜宁4,GW83.4,1,11
华东南北部,中材阜宁,否,中材阜宁5,GW93,6,8
华东南北部,中材阜宁,否,中材阜宁6,GW99A,1,7
华东南北部,中材阜宁,否,中材阜宁7,GW99A,1,7
华东南北部,中材阜宁,否,中材阜宁8,SI90.2,1,12
华东南北部,中材阜宁,否,中材阜宁9,SI90.2,1,12
华东南北部,中材阜宁,是,中材阜宁10,SI90.2,3,12
华东南北部,中材阜宁,是,中材阜宁11,SI90.2,3,12
华东南北部,中材阜宁,是,中材阜宁12,SI90.2,3,12
华东南北部,中材阜宁,是,中材阜宁13,SI90.2,3,12
西北西部,中材哈密,否,中材哈密1,GWBD-A3,7,11
西北西部,中材哈密,否,中材哈密2,GWBD-A3,7,11
华北,中材邯郸,否,中材邯郸1,GW99A,1,12
华北,中材邯郸,否,中材邯郸2,GW99A,1,12
华北,中材邯郸,是,中材邯郸3,GWBD-A2,4,12
华北,中材邯郸,是,中材邯郸4,GWBD-A2,4,12
西北东部,中材酒泉,否,中材酒泉1,GW99,1,12
西北东部,中材酒泉,否,中材酒泉2,GW99,1,12
西北东部,中材酒泉,否,中材酒泉3,GWBD-A2,2,12
西北东部,中材酒泉,否,中材酒泉4,GWBD-A2,2,12
西北东部,中材酒泉,否,中材酒泉5,GWBD-A2,2,12
西北东部,中材酒泉,是,中材酒泉6,GWBD-A2,2,12
西北东部,中材酒泉,否,中材酒泉7,SI90.2,1,1
西北东部,中材酒泉,否,中材酒泉8,SI90.2,3,4
西北东部,中材酒泉,否,中材酒泉9,SI90.2,3,4
西北东部,中材酒泉,否,中材酒泉10,SI90.2,9,9
西北东部,中材酒泉,是,中材酒泉11,SI90.2,4,12
西北东部,中材酒泉,是,中材酒泉12,SI90.2,4,12
华东南北部,中材连云港,是,中材连云港1,GW93,4,4
华东南北部,中材连云港,否,中材连云港2,GW93,1,12
华东南北部,中材连云港,否,中材连云港3,GW93,1,12
华东南南部,中材萍乡,否,中材萍乡1,GW83.4,2,3
华东南南部,中材萍乡,是,中材萍乡2,GW93,1,10
华东南南部,中材萍乡,是,中材萍乡3,GW93,1,10
华东南南部,中材萍乡,是,中材萍乡4,GWBD-A3,2,12
华东南南部,中材萍乡,是,中材萍乡5,GWBD-A3,2,12
东北,中材锡林,否,中材锡林1,GW99,1,12
东北,中材锡林,否,中材锡林2,GW99,1,12
东北,中材锡林,是,中材锡林3,GWBD-A2,2,12
东北,中材锡林,是,中材锡林4,GWBD-A2,2,12
东北,中材锡林,是,中材锡林5,GWBD-A2,2,12
东北,中材锡林,否,中材锡林6,SI90.2,1,1
东北,中材锡林,否,中材锡林7,SI90.2,1,1
东北,中材兴安盟,是,中材兴安盟1,GW93,1,9
东北,中材兴安盟,是,中材兴安盟2,GW93,1,9
华南,中材阳江,是,中材阳江1,GW130,11,12
华南,中材阳江,是,中材阳江2,GW130,11,12
华南,中材阳江,否,中材阳江3,SI122,1,12
华南,中材阳江,否,中材阳江4,SI122,1,12
西北西部,中材伊吾,否,中材伊吾1,GWBD-A2,3,12
西北西部,中材伊吾,否,中材伊吾2,GWBD-A2,3,12
西北西部,中材伊吾,是,中材伊吾3,GWBD-A3,7,9
华南,中材玉溪,否,中材玉溪1,GW93,3,3
西北西部,重通昌吉,否,重通昌吉1,GW99,11,11
西北西部,重通昌吉,是,重通昌吉2,GW99A,2,10
西北西部,重通昌吉,否,重通昌吉3,GWBD-A2,1,12
西北西部,重通昌吉,否,重通昌吉4,GWBD-A2,1,12
西北西部,重通昌吉,否,重通昌吉5,GWBD-A2,1,12
东北,重通大安,是,重通大安1,GWBD-A2,3,12
东北,重通大安,是,重通大安2,GWBD-A2,4,12
华东南北部,重通如东,是,重通如东1,GW110.5,6,10
华东南北部,重通如东,是,重通如东2,GW110.5,6,10
华东南北部,重通如东,否,重通如东3,GW76,1,6
华东南北部,重通如东,否,重通如东4,GW76,1,6
华东南北部,重通如东,否,重通如东5,GW76,11,12
华东南北部,重通如东,否,重通如东6,GW76,11,12
华东南北部,重通如东,否,重通如东7,GW81,1,12
华东南北部,重通如东,否,重通如东8,GW81,1,12
华东南北部,重通如东,否,重通如东9,GW86,10,12
华东南北部,重通如东,否,重通如东10,GWBD-D,10,10
华东南北部,重通如东,是,重通如东11,GW83.3,7,9
西北东部,重通武威,否,重通武威1,GW83.4,1,1
西北东部,重通武威,否,重通武威2,GW99A,1,1
西北东部,重通武威,否,重通武威3,GWBD-A2,1,12
西北东部,重通武威,否,重通武威4,GWBD-A2,1,12
西北东部,重通武威,否,重通武威5,GWBD-A3,4,12
西北东部,重通武威,否,重通武威6,GWBD-A3,4,12
1 区域名 工厂名 是否新工厂 产线ID 生产型号 开始月份 结束月份
2 西北东部 艾郎玉门 艾郎玉门1 GWBD-A2 1 12
3 西北东部 艾郎玉门 艾郎玉门2 GWBD-A2 1 12
4 华北 艾郎张北 艾郎张北1 GWBD-A2 1 12
5 华北 艾郎张北 艾郎张北2 GWBD-A2 1 12
6 西北西部 时代巴里坤 时代巴里坤1 GWBD-A2 5 12
7 西北西部 时代巴里坤 时代巴里坤2 GWBD-A2 5 12
8 西北西部 时代巴里坤 时代巴里坤3 GW99A 3 4
9 西北西部 时代巴里坤 时代巴里坤4 GW99A 6 9
10 华南 时代百色 时代百色1 GWBD-A3 5 12
11 华南 时代百色 时代百色2 GWBD-A3 5 12
12 华东南北部 时代射阳 时代射阳1 GW130 9 12
13 华东南北部 时代射阳 时代射阳2 GW130 9 12
14 东北 时代松原 时代松原1 GWBD-A3 6 12
15 东北 时代松原 时代松原2 GWBD-A3 6 12
16 华东南南部 时代株洲 时代株洲1 GW99A 4 12
17 华东南南部 时代株洲 时代株洲2 GW99A 4 12
18 华东南北部 双瑞大丰 双瑞大丰1 GW110.5 2 11
19 华东南北部 双瑞大丰 双瑞大丰2 GW110.5 2 11
20 华东南北部 双瑞大丰 双瑞大丰3 GW93 1 1
21 华东南北部 双瑞东营 双瑞东营1 GWBD-A2 10 12
22 华东南北部 双瑞东营 双瑞东营2 GWBD-A2 10 12
23 华东南北部 双瑞东营 双瑞东营3 GWBD-A2 10 12
24 华东南北部 双瑞东营 双瑞东营4 GWBD-A2 10 12
25 华东南北部 天顺濮阳 天顺濮阳1 GW99A 8 12
26 华东南北部 天顺濮阳 天顺濮阳2 GW99A 8 12
27 华东南北部 天顺沙洋 天顺沙洋1 GW93 2 2
28 华东南北部 天顺沙洋 天顺沙洋2 GW93 5 5
29 华东南北部 天顺沙洋 天顺沙洋3 GW93 11 11
30 华东南北部 天顺沙洋 天顺沙洋4 GW99 10 11
31 华东南北部 天顺沙洋 天顺沙洋5 GW99A 5 12
32 华东南北部 天顺沙洋 天顺沙洋6 GW99A 5 12
33 东北 中材白城 中材白城1 GWBD-A3 8 8
34 华东南北部 中材阜宁 中材阜宁1 GW110.5 4 11
35 华东南北部 中材阜宁 中材阜宁2 GW110.5 4 11
36 华东南北部 中材阜宁 中材阜宁3 GW110.5 4 11
37 华东南北部 中材阜宁 中材阜宁4 GW83.4 1 11
38 华东南北部 中材阜宁 中材阜宁5 GW93 6 8
39 华东南北部 中材阜宁 中材阜宁6 GW99A 1 7
40 华东南北部 中材阜宁 中材阜宁7 GW99A 1 7
41 华东南北部 中材阜宁 中材阜宁8 SI90.2 1 12
42 华东南北部 中材阜宁 中材阜宁9 SI90.2 1 12
43 华东南北部 中材阜宁 中材阜宁10 SI90.2 3 12
44 华东南北部 中材阜宁 中材阜宁11 SI90.2 3 12
45 华东南北部 中材阜宁 中材阜宁12 SI90.2 3 12
46 华东南北部 中材阜宁 中材阜宁13 SI90.2 3 12
47 西北西部 中材哈密 中材哈密1 GWBD-A3 7 11
48 西北西部 中材哈密 中材哈密2 GWBD-A3 7 11
49 华北 中材邯郸 中材邯郸1 GW99A 1 12
50 华北 中材邯郸 中材邯郸2 GW99A 1 12
51 华北 中材邯郸 中材邯郸3 GWBD-A2 4 12
52 华北 中材邯郸 中材邯郸4 GWBD-A2 4 12
53 西北东部 中材酒泉 中材酒泉1 GW99 1 12
54 西北东部 中材酒泉 中材酒泉2 GW99 1 12
55 西北东部 中材酒泉 中材酒泉3 GWBD-A2 2 12
56 西北东部 中材酒泉 中材酒泉4 GWBD-A2 2 12
57 西北东部 中材酒泉 中材酒泉5 GWBD-A2 2 12
58 西北东部 中材酒泉 中材酒泉6 GWBD-A2 2 12
59 西北东部 中材酒泉 中材酒泉7 SI90.2 1 1
60 西北东部 中材酒泉 中材酒泉8 SI90.2 3 4
61 西北东部 中材酒泉 中材酒泉9 SI90.2 3 4
62 西北东部 中材酒泉 中材酒泉10 SI90.2 9 9
63 西北东部 中材酒泉 中材酒泉11 SI90.2 4 12
64 西北东部 中材酒泉 中材酒泉12 SI90.2 4 12
65 华东南北部 中材连云港 中材连云港1 GW93 4 4
66 华东南北部 中材连云港 中材连云港2 GW93 1 12
67 华东南北部 中材连云港 中材连云港3 GW93 1 12
68 华东南南部 中材萍乡 中材萍乡1 GW83.4 2 3
69 华东南南部 中材萍乡 中材萍乡2 GW93 1 10
70 华东南南部 中材萍乡 中材萍乡3 GW93 1 10
71 华东南南部 中材萍乡 中材萍乡4 GWBD-A3 2 12
72 华东南南部 中材萍乡 中材萍乡5 GWBD-A3 2 12
73 东北 中材锡林 中材锡林1 GW99 1 12
74 东北 中材锡林 中材锡林2 GW99 1 12
75 东北 中材锡林 中材锡林3 GWBD-A2 2 12
76 东北 中材锡林 中材锡林4 GWBD-A2 2 12
77 东北 中材锡林 中材锡林5 GWBD-A2 2 12
78 东北 中材锡林 中材锡林6 SI90.2 1 1
79 东北 中材锡林 中材锡林7 SI90.2 1 1
80 东北 中材兴安盟 中材兴安盟1 GW93 1 9
81 东北 中材兴安盟 中材兴安盟2 GW93 1 9
82 华南 中材阳江 中材阳江1 GW130 11 12
83 华南 中材阳江 中材阳江2 GW130 11 12
84 华南 中材阳江 中材阳江3 SI122 1 12
85 华南 中材阳江 中材阳江4 SI122 1 12
86 西北西部 中材伊吾 中材伊吾1 GWBD-A2 3 12
87 西北西部 中材伊吾 中材伊吾2 GWBD-A2 3 12
88 西北西部 中材伊吾 中材伊吾3 GWBD-A3 7 9
89 华南 中材玉溪 中材玉溪1 GW93 3 3
90 西北西部 重通昌吉 重通昌吉1 GW99 11 11
91 西北西部 重通昌吉 重通昌吉2 GW99A 2 10
92 西北西部 重通昌吉 重通昌吉3 GWBD-A2 1 12
93 西北西部 重通昌吉 重通昌吉4 GWBD-A2 1 12
94 西北西部 重通昌吉 重通昌吉5 GWBD-A2 1 12
95 东北 重通大安 重通大安1 GWBD-A2 3 12
96 东北 重通大安 重通大安2 GWBD-A2 4 12
97 华东南北部 重通如东 重通如东1 GW110.5 6 10
98 华东南北部 重通如东 重通如东2 GW110.5 6 10
99 华东南北部 重通如东 重通如东3 GW76 1 6
100 华东南北部 重通如东 重通如东4 GW76 1 6
101 华东南北部 重通如东 重通如东5 GW76 11 12
102 华东南北部 重通如东 重通如东6 GW76 11 12
103 华东南北部 重通如东 重通如东7 GW81 1 12
104 华东南北部 重通如东 重通如东8 GW81 1 12
105 华东南北部 重通如东 重通如东9 GW86 10 12
106 华东南北部 重通如东 重通如东10 GWBD-D 10 10
107 华东南北部 重通如东 重通如东11 GW83.3 7 9
108 西北东部 重通武威 重通武威1 GW83.4 1 1
109 西北东部 重通武威 重通武威2 GW99A 1 1
110 西北东部 重通武威 重通武威3 GWBD-A2 1 12
111 西北东部 重通武威 重通武威4 GWBD-A2 1 12
112 西北东部 重通武威 重通武威5 GWBD-A3 4 12
113 西北东部 重通武威 重通武威6 GWBD-A3 4 12

View File

@ -0,0 +1,106 @@
区域名,工厂名,是否新工厂,产线ID,生产型号,开始月份,结束月份
西北东部,艾郎玉门,否,艾郎玉门1,GWBD-A2,1,12
西北东部,艾郎玉门,否,艾郎玉门2,GWBD-A2,1,12
华北,艾郎张北,否,艾郎张北1,GWBD-A2,1,12
华北,艾郎张北,否,艾郎张北2,GWBD-A2,1,12
西北西部,时代巴里坤,是,时代巴里坤1,GWBD-A2,5,12
西北西部,时代巴里坤,是,时代巴里坤2,GWBD-A2,5,12
西北西部,时代巴里坤,是,时代巴里坤3,GW99A,3,9
华南,时代百色,是,时代百色1,GWBD-A3,5,12
华南,时代百色,是,时代百色2,GWBD-A3,5,12
华东南北部,时代射阳,是,时代射阳1,GW130,9,12
华东南北部,时代射阳,是,时代射阳2,GW130,9,12
东北,时代松原,是,时代松原1,GWBD-A3,5,12
东北,时代松原,是,时代松原2,GWBD-A3,5,12
华东南南部,时代株洲,否,时代株洲1,GW99A,4,12
华东南南部,时代株洲,否,时代株洲2,GW99A,4,12
华东南北部,双瑞大丰,否,双瑞大丰1,GW110.5,2,11
华东南北部,双瑞大丰,否,双瑞大丰2,GW110.5,2,11
华东南北部,双瑞大丰,否,双瑞大丰3,GW93,1,1
华东南北部,双瑞东营,是,双瑞东营1,GWBD-A2,9,12
华东南北部,双瑞东营,是,双瑞东营2,GWBD-A2,9,12
华东南北部,双瑞东营,是,双瑞东营3,GWBD-A2,9,12
华东南北部,双瑞东营,是,双瑞东营4,GWBD-A2,9,12
华东南北部,天顺濮阳,是,天顺濮阳1,GW99A,8,12
华东南北部,天顺濮阳,是,天顺濮阳2,GW99A,8,12
华东南北部,天顺沙洋,否,天顺沙洋1,GW93,2,11
华东南北部,天顺沙洋,否,天顺沙洋2,GW99,10,11
华东南北部,天顺沙洋,是,天顺沙洋3,GW99A,5,12
华东南北部,天顺沙洋,是,天顺沙洋4,GW99A,5,12
东北,中材白城,是,中材白城1,GWBD-A3,8,8
华东南北部,中材阜宁,否,中材阜宁1,GW110.5,4,12
华东南北部,中材阜宁,是,中材阜宁2,GW110.5,4,12
华东南北部,中材阜宁,是,中材阜宁3,GW110.5,4,12
华东南北部,中材阜宁,否,中材阜宁4,GW83.4,1,11
华东南北部,中材阜宁,否,中材阜宁5,GW93,1,8
华东南北部,中材阜宁,否,中材阜宁6,GW99A,1,7
华东南北部,中材阜宁,否,中材阜宁7,GW99A,1,7
华东南北部,中材阜宁,否,中材阜宁8,SI90.2,1,12
华东南北部,中材阜宁,否,中材阜宁9,SI90.2,1,12
华东南北部,中材阜宁,否,中材阜宁10,SI90.2,1,12
华东南北部,中材阜宁,否,中材阜宁11,SI90.2,1,12
华东南北部,中材阜宁,是,中材阜宁12,SI90.2,3,12
华东南北部,中材阜宁,是,中材阜宁13,SI90.2,3,12
西北西部,中材哈密,是,中材哈密1,GWBD-A3,7,12
西北西部,中材哈密,是,中材哈密2,GWBD-A3,7,12
华北,中材邯郸,否,中材邯郸1,GW99A,1,12
华北,中材邯郸,否,中材邯郸2,GW99A,1,12
华北,中材邯郸,是,中材邯郸3,GWBD-A2,4,12
华北,中材邯郸,是,中材邯郸4,GWBD-A2,4,12
西北东部,中材酒泉,否,中材酒泉1,GW99,1,12
西北东部,中材酒泉,否,中材酒泉2,GW99,1,12
西北东部,中材酒泉,否,中材酒泉3,GWBD-A2,1,12
西北东部,中材酒泉,否,中材酒泉4,GWBD-A2,1,12
西北东部,中材酒泉,否,中材酒泉5,GWBD-A2,1,12
西北东部,中材酒泉,是,中材酒泉6,GWBD-A2,2,12
西北东部,中材酒泉,否,中材酒泉7,SI90.2,1,12
西北东部,中材酒泉,否,中材酒泉8,SI90.2,1,12
西北东部,中材酒泉,否,中材酒泉9,SI90.2,4,12
西北东部,中材酒泉,否,中材酒泉10,SI90.2,4,12
华东南北部,中材连云港,否,中材连云港1,GW93,4,4
华东南北部,中材连云港,否,中材连云港2,GW93,1,12
华东南北部,中材连云港,否,中材连云港3,GW93,1,12
华东南南部,中材萍乡,否,中材萍乡1,GW83.4,2,6
华东南南部,中材萍乡,否,中材萍乡2,GW93,1,10
华东南南部,中材萍乡,否,中材萍乡3,GW93,1,10
华东南南部,中材萍乡,否,中材萍乡4,GWBD-A3,2,12
华东南南部,中材萍乡,否,中材萍乡5,GWBD-A3,2,12
东北,中材锡林,否,中材锡林1,GW99,1,12
东北,中材锡林,否,中材锡林2,GW99,1,12
东北,中材锡林,否,中材锡林3,GWBD-A2,1,12
东北,中材锡林,否,中材锡林4,GWBD-A2,1,12
东北,中材锡林,是,中材锡林5,GWBD-A2,4,12
东北,中材锡林,否,中材锡林6,SI90.2,1,1
东北,中材锡林,否,中材锡林7,SI90.2,1,1
东北,中材兴安盟,否,中材兴安盟1,GW93,1,9
东北,中材兴安盟,否,中材兴安盟2,GW93,1,9
华南,中材阳江,是,中材阳江1,GW130,11,12
华南,中材阳江,是,中材阳江2,GW130,11,12
华南,中材阳江,否,中材阳江3,SI122,1,12
华南,中材阳江,否,中材阳江4,SI122,1,12
西北西部,中材伊吾,否,中材伊吾1,GWBD-A2,3,12
西北西部,中材伊吾,否,中材伊吾2,GWBD-A2,3,12
西北西部,中材伊吾,是,中材伊吾3,GWBD-A3,7,9
华南,中材玉溪,否,中复玉溪1,GW93,3,3
西北西部,重通昌吉,否,重通昌吉1,GW99,11,11
西北西部,重通昌吉,否,重通昌吉2,GW99A,2,10
西北西部,重通昌吉,否,重通昌吉3,GWBD-A2,1,12
西北西部,重通昌吉,否,重通昌吉4,GWBD-A2,1,12
西北西部,重通昌吉,是,重通昌吉5,GWBD-A2,11,12
东北,重通大安,是,重通大安1,GWBD-A2,3,12
东北,重通大安,是,重通大安2,GWBD-A2,4,12
华东南北部,重通如东,是,重通如东1,GW110.5,6,10
华东南北部,重通如东,是,重通如东2,GW110.5,6,10
华东南北部,重通如东,否,重通如东3,GW76,1,12
华东南北部,重通如东,否,重通如东4,GW76,1,12
华东南北部,重通如东,否,重通如东5,GW81,1,12
华东南北部,重通如东,否,重通如东6,GW81,1,12
华东南北部,重通如东,否,重通如东7,GW86,3,12
华东南北部,重通如东,是,重通如东8,GWBD-D,6,11
华东南北部,重通如东,否,重通如东9,GW83.3,7,9
西北东部,重通武威,否,重通武威1,GW83.4,1,1
西北东部,重通武威,否,重通武威2,GW99A,1,1
西北东部,重通武威,否,重通武威3,GWBD-A2,1,12
西北东部,重通武威,否,重通武威4,GWBD-A2,1,12
西北东部,重通武威,否,重通武威5,GWBD-A3,4,12
西北东部,重通武威,否,重通武威6,GWBD-A3,4,12
1 区域名 工厂名 是否新工厂 产线ID 生产型号 开始月份 结束月份
2 西北东部 艾郎玉门 艾郎玉门1 GWBD-A2 1 12
3 西北东部 艾郎玉门 艾郎玉门2 GWBD-A2 1 12
4 华北 艾郎张北 艾郎张北1 GWBD-A2 1 12
5 华北 艾郎张北 艾郎张北2 GWBD-A2 1 12
6 西北西部 时代巴里坤 时代巴里坤1 GWBD-A2 5 12
7 西北西部 时代巴里坤 时代巴里坤2 GWBD-A2 5 12
8 西北西部 时代巴里坤 时代巴里坤3 GW99A 3 9
9 华南 时代百色 时代百色1 GWBD-A3 5 12
10 华南 时代百色 时代百色2 GWBD-A3 5 12
11 华东南北部 时代射阳 时代射阳1 GW130 9 12
12 华东南北部 时代射阳 时代射阳2 GW130 9 12
13 东北 时代松原 时代松原1 GWBD-A3 5 12
14 东北 时代松原 时代松原2 GWBD-A3 5 12
15 华东南南部 时代株洲 时代株洲1 GW99A 4 12
16 华东南南部 时代株洲 时代株洲2 GW99A 4 12
17 华东南北部 双瑞大丰 双瑞大丰1 GW110.5 2 11
18 华东南北部 双瑞大丰 双瑞大丰2 GW110.5 2 11
19 华东南北部 双瑞大丰 双瑞大丰3 GW93 1 1
20 华东南北部 双瑞东营 双瑞东营1 GWBD-A2 9 12
21 华东南北部 双瑞东营 双瑞东营2 GWBD-A2 9 12
22 华东南北部 双瑞东营 双瑞东营3 GWBD-A2 9 12
23 华东南北部 双瑞东营 双瑞东营4 GWBD-A2 9 12
24 华东南北部 天顺濮阳 天顺濮阳1 GW99A 8 12
25 华东南北部 天顺濮阳 天顺濮阳2 GW99A 8 12
26 华东南北部 天顺沙洋 天顺沙洋1 GW93 2 11
27 华东南北部 天顺沙洋 天顺沙洋2 GW99 10 11
28 华东南北部 天顺沙洋 天顺沙洋3 GW99A 5 12
29 华东南北部 天顺沙洋 天顺沙洋4 GW99A 5 12
30 东北 中材白城 中材白城1 GWBD-A3 8 8
31 华东南北部 中材阜宁 中材阜宁1 GW110.5 4 12
32 华东南北部 中材阜宁 中材阜宁2 GW110.5 4 12
33 华东南北部 中材阜宁 中材阜宁3 GW110.5 4 12
34 华东南北部 中材阜宁 中材阜宁4 GW83.4 1 11
35 华东南北部 中材阜宁 中材阜宁5 GW93 1 8
36 华东南北部 中材阜宁 中材阜宁6 GW99A 1 7
37 华东南北部 中材阜宁 中材阜宁7 GW99A 1 7
38 华东南北部 中材阜宁 中材阜宁8 SI90.2 1 12
39 华东南北部 中材阜宁 中材阜宁9 SI90.2 1 12
40 华东南北部 中材阜宁 中材阜宁10 SI90.2 1 12
41 华东南北部 中材阜宁 中材阜宁11 SI90.2 1 12
42 华东南北部 中材阜宁 中材阜宁12 SI90.2 3 12
43 华东南北部 中材阜宁 中材阜宁13 SI90.2 3 12
44 西北西部 中材哈密 中材哈密1 GWBD-A3 7 12
45 西北西部 中材哈密 中材哈密2 GWBD-A3 7 12
46 华北 中材邯郸 中材邯郸1 GW99A 1 12
47 华北 中材邯郸 中材邯郸2 GW99A 1 12
48 华北 中材邯郸 中材邯郸3 GWBD-A2 4 12
49 华北 中材邯郸 中材邯郸4 GWBD-A2 4 12
50 西北东部 中材酒泉 中材酒泉1 GW99 1 12
51 西北东部 中材酒泉 中材酒泉2 GW99 1 12
52 西北东部 中材酒泉 中材酒泉3 GWBD-A2 1 12
53 西北东部 中材酒泉 中材酒泉4 GWBD-A2 1 12
54 西北东部 中材酒泉 中材酒泉5 GWBD-A2 1 12
55 西北东部 中材酒泉 中材酒泉6 GWBD-A2 2 12
56 西北东部 中材酒泉 中材酒泉7 SI90.2 1 12
57 西北东部 中材酒泉 中材酒泉8 SI90.2 1 12
58 西北东部 中材酒泉 中材酒泉9 SI90.2 4 12
59 西北东部 中材酒泉 中材酒泉10 SI90.2 4 12
60 华东南北部 中材连云港 中材连云港1 GW93 4 4
61 华东南北部 中材连云港 中材连云港2 GW93 1 12
62 华东南北部 中材连云港 中材连云港3 GW93 1 12
63 华东南南部 中材萍乡 中材萍乡1 GW83.4 2 6
64 华东南南部 中材萍乡 中材萍乡2 GW93 1 10
65 华东南南部 中材萍乡 中材萍乡3 GW93 1 10
66 华东南南部 中材萍乡 中材萍乡4 GWBD-A3 2 12
67 华东南南部 中材萍乡 中材萍乡5 GWBD-A3 2 12
68 东北 中材锡林 中材锡林1 GW99 1 12
69 东北 中材锡林 中材锡林2 GW99 1 12
70 东北 中材锡林 中材锡林3 GWBD-A2 1 12
71 东北 中材锡林 中材锡林4 GWBD-A2 1 12
72 东北 中材锡林 中材锡林5 GWBD-A2 4 12
73 东北 中材锡林 中材锡林6 SI90.2 1 1
74 东北 中材锡林 中材锡林7 SI90.2 1 1
75 东北 中材兴安盟 中材兴安盟1 GW93 1 9
76 东北 中材兴安盟 中材兴安盟2 GW93 1 9
77 华南 中材阳江 中材阳江1 GW130 11 12
78 华南 中材阳江 中材阳江2 GW130 11 12
79 华南 中材阳江 中材阳江3 SI122 1 12
80 华南 中材阳江 中材阳江4 SI122 1 12
81 西北西部 中材伊吾 中材伊吾1 GWBD-A2 3 12
82 西北西部 中材伊吾 中材伊吾2 GWBD-A2 3 12
83 西北西部 中材伊吾 中材伊吾3 GWBD-A3 7 9
84 华南 中材玉溪 中复玉溪1 GW93 3 3
85 西北西部 重通昌吉 重通昌吉1 GW99 11 11
86 西北西部 重通昌吉 重通昌吉2 GW99A 2 10
87 西北西部 重通昌吉 重通昌吉3 GWBD-A2 1 12
88 西北西部 重通昌吉 重通昌吉4 GWBD-A2 1 12
89 西北西部 重通昌吉 重通昌吉5 GWBD-A2 11 12
90 东北 重通大安 重通大安1 GWBD-A2 3 12
91 东北 重通大安 重通大安2 GWBD-A2 4 12
92 华东南北部 重通如东 重通如东1 GW110.5 6 10
93 华东南北部 重通如东 重通如东2 GW110.5 6 10
94 华东南北部 重通如东 重通如东3 GW76 1 12
95 华东南北部 重通如东 重通如东4 GW76 1 12
96 华东南北部 重通如东 重通如东5 GW81 1 12
97 华东南北部 重通如东 重通如东6 GW81 1 12
98 华东南北部 重通如东 重通如东7 GW86 3 12
99 华东南北部 重通如东 重通如东8 GWBD-D 6 11
100 华东南北部 重通如东 重通如东9 GW83.3 7 9
101 西北东部 重通武威 重通武威1 GW83.4 1 1
102 西北东部 重通武威 重通武威2 GW99A 1 1
103 西北东部 重通武威 重通武威3 GWBD-A2 1 12
104 西北东部 重通武威 重通武威4 GWBD-A2 1 12
105 西北东部 重通武威 重通武威5 GWBD-A3 4 12
106 西北东部 重通武威 重通武威6 GWBD-A3 4 12

28
data/benchmark.csv Normal file
View File

@ -0,0 +1,28 @@
工厂,1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月,全年
艾郎玉门,2,6,12,13,12,12,9,14,12,12,12,12,128
艾郎张北,3,6,12,14,12,12,12,12,12,12,12,12,131
时代巴里坤,0,0,2,4,5,9,6,16,14,13,12,12,93
时代百色,0,0,0,0,5,9,12,12,12,12,12,12,86
时代射阳,0,0,0,0,0,0,0,0,1,2,4,6,13
时代松原,0,0,0,0,0,5,6,10,15,16,12,12,76
时代株洲,0,0,0,7,9,14,14,14,14,14,14,14,114
双瑞大丰,1,2,3,6,7,10,8,10,10,10,7,7,81
双瑞东营,0,0,0,0,0,0,0,0,0,15,15,16,46
天顺濮阳,2,0,0,0,0,0,0,12,11,9,10,11,55
天顺沙洋,1,4,0,0,9,13,13,13,13,17,19,11,113
中材白城,0,0,0,0,0,0,0,3,0,0,0,0,3
中材阜宁,34,18,31,50,42,45,52,48,46,43,49,31,489
中材哈密,0,0,0,0,0,0,8,9,9,6,7,0,39
中材邯郸,12,6,3,17,18,27,18,21,23,19,20,14,198
中材酒泉,11,20,52,56,43,45,50,53,59,52,52,40,533
中材连云港,6,9,13,16,13,12,5,5,5,0,0,7,91
中材萍乡,2,17,21,19,24,27,29,28,17,13,14,5,216
中材锡林,28,6,17,25,36,32,27,36,27,30,32,21,317
中材兴安盟,2,8,10,18,14,18,12,11,14,0,0,0,107
中材阳江,4,1,5,5,5,5,5,5,5,5,7,7,59
中材伊吾,0,0,10,14,5,4,8,16,16,8,15,10,106
中材玉溪,0,0,3,0,0,0,0,0,0,0,0,0,3
重通昌吉,13,9,19,21,22,23,23,28,27,18,23,19,245
重通大安,0,0,2,9,6,12,11,10,11,11,13,12,97
重通如东,24,7,24,19,23,26,27,24,30,33,34,35,306
重通武威,22,7,14,27,31,29,29,28,30,28,29,29,303
1 工厂 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 全年
2 艾郎玉门 2 6 12 13 12 12 9 14 12 12 12 12 128
3 艾郎张北 3 6 12 14 12 12 12 12 12 12 12 12 131
4 时代巴里坤 0 0 2 4 5 9 6 16 14 13 12 12 93
5 时代百色 0 0 0 0 5 9 12 12 12 12 12 12 86
6 时代射阳 0 0 0 0 0 0 0 0 1 2 4 6 13
7 时代松原 0 0 0 0 0 5 6 10 15 16 12 12 76
8 时代株洲 0 0 0 7 9 14 14 14 14 14 14 14 114
9 双瑞大丰 1 2 3 6 7 10 8 10 10 10 7 7 81
10 双瑞东营 0 0 0 0 0 0 0 0 0 15 15 16 46
11 天顺濮阳 2 0 0 0 0 0 0 12 11 9 10 11 55
12 天顺沙洋 1 4 0 0 9 13 13 13 13 17 19 11 113
13 中材白城 0 0 0 0 0 0 0 3 0 0 0 0 3
14 中材阜宁 34 18 31 50 42 45 52 48 46 43 49 31 489
15 中材哈密 0 0 0 0 0 0 8 9 9 6 7 0 39
16 中材邯郸 12 6 3 17 18 27 18 21 23 19 20 14 198
17 中材酒泉 11 20 52 56 43 45 50 53 59 52 52 40 533
18 中材连云港 6 9 13 16 13 12 5 5 5 0 0 7 91
19 中材萍乡 2 17 21 19 24 27 29 28 17 13 14 5 216
20 中材锡林 28 6 17 25 36 32 27 36 27 30 32 21 317
21 中材兴安盟 2 8 10 18 14 18 12 11 14 0 0 0 107
22 中材阳江 4 1 5 5 5 5 5 5 5 5 7 7 59
23 中材伊吾 0 0 10 14 5 4 8 16 16 8 15 10 106
24 中材玉溪 0 0 3 0 0 0 0 0 0 0 0 0 3
25 重通昌吉 13 9 19 21 22 23 23 28 27 18 23 19 245
26 重通大安 0 0 2 9 6 12 11 10 11 11 13 12 97
27 重通如东 24 7 24 19 23 26 27 24 30 33 34 35 306
28 重通武威 22 7 14 27 31 29 29 28 30 28 29 29 303

View File

@ -0,0 +1,28 @@
工厂,1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月,全年
艾郎玉门,2,6,12,13,12,12,9,14,12,12,12,12,128
艾郎张北,3,6,12,14,12,12,12,12,12,12,12,12,131
时代巴里坤,0,0,7,2,2,9,6,16,14,13,12,12,93
时代百色,0,0,0,0,5,9,12,8,15,13,12,12,86
时代射阳,0,0,0,0,0,0,0,0,1,0,6,6,13
时代松原,0,0,0,0,0,6,5,10,15,16,12,12,76
时代株洲,0,0,0,7,9,14,14,14,14,14,14,14,114
双瑞大丰,1,2,11,6,7,10,8,10,10,10,6,0,81
双瑞东营,0,0,0,0,0,0,0,0,3,15,14,14,46
天顺濮阳,2,0,0,0,0,0,0,12,11,9,10,11,55
天顺沙洋,1,4,0,0,9,13,13,13,13,17,19,11,113
中材白城,0,0,0,0,0,0,0,3,0,0,0,0,3
中材阜宁,34,18,31,50,42,45,52,48,46,43,49,31,489
中材哈密,0,0,0,0,0,0,8,9,9,6,7,0,39
中材邯郸,12,6,3,17,18,27,18,21,23,19,20,14,198
中材酒泉,11,20,52,56,43,45,50,53,59,52,52,40,533
中材连云港,6,9,13,16,13,12,5,5,5,0,0,7,91
中材萍乡,2,17,21,19,24,27,29,28,17,13,14,5,216
中材锡林,28,6,17,25,36,32,27,36,27,30,32,21,317
中材兴安盟,2,8,10,18,14,18,12,11,14,0,0,0,107
中材阳江,4,1,5,5,5,5,5,5,5,5,7,7,59
中材伊吾,0,0,10,14,5,4,8,16,16,8,15,10,106
中材玉溪,0,0,3,0,0,0,0,0,0,0,0,0,3
重通昌吉,13,9,19,21,22,23,23,28,27,18,23,19,245
重通大安,0,0,2,9,6,12,11,10,11,11,13,12,97
重通如东,24,7,24,19,23,26,27,24,30,33,34,35,306
重通武威,22,7,14,27,31,29,29,28,30,28,29,29,303
1 工厂 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 全年
2 艾郎玉门 2 6 12 13 12 12 9 14 12 12 12 12 128
3 艾郎张北 3 6 12 14 12 12 12 12 12 12 12 12 131
4 时代巴里坤 0 0 7 2 2 9 6 16 14 13 12 12 93
5 时代百色 0 0 0 0 5 9 12 8 15 13 12 12 86
6 时代射阳 0 0 0 0 0 0 0 0 1 0 6 6 13
7 时代松原 0 0 0 0 0 6 5 10 15 16 12 12 76
8 时代株洲 0 0 0 7 9 14 14 14 14 14 14 14 114
9 双瑞大丰 1 2 11 6 7 10 8 10 10 10 6 0 81
10 双瑞东营 0 0 0 0 0 0 0 0 3 15 14 14 46
11 天顺濮阳 2 0 0 0 0 0 0 12 11 9 10 11 55
12 天顺沙洋 1 4 0 0 9 13 13 13 13 17 19 11 113
13 中材白城 0 0 0 0 0 0 0 3 0 0 0 0 3
14 中材阜宁 34 18 31 50 42 45 52 48 46 43 49 31 489
15 中材哈密 0 0 0 0 0 0 8 9 9 6 7 0 39
16 中材邯郸 12 6 3 17 18 27 18 21 23 19 20 14 198
17 中材酒泉 11 20 52 56 43 45 50 53 59 52 52 40 533
18 中材连云港 6 9 13 16 13 12 5 5 5 0 0 7 91
19 中材萍乡 2 17 21 19 24 27 29 28 17 13 14 5 216
20 中材锡林 28 6 17 25 36 32 27 36 27 30 32 21 317
21 中材兴安盟 2 8 10 18 14 18 12 11 14 0 0 0 107
22 中材阳江 4 1 5 5 5 5 5 5 5 5 7 7 59
23 中材伊吾 0 0 10 14 5 4 8 16 16 8 15 10 106
24 中材玉溪 0 0 3 0 0 0 0 0 0 0 0 0 3
25 重通昌吉 13 9 19 21 22 23 23 28 27 18 23 19 245
26 重通大安 0 0 2 9 6 12 11 10 11 11 13 12 97
27 重通如东 24 7 24 19 23 26 27 24 30 33 34 35 306
28 重通武威 22 7 14 27 31 29 29 28 30 28 29 29 303

350
data/demand.csv Normal file
View File

@ -0,0 +1,350 @@
生产型号,省份,市,需求区域,1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月,总量
GW83.4,辽宁,葫芦岛市,东北,,,,,,,,,,1,,,1
GW83.4,广西,桂林市,华南,3,,3,,,2,,,,,,,8
GW93,广西,桂林市,华南,,2,2,,,,,,,,,,4
GW93,广西,桂林市,华南,,,3,,,,,,,,,,3
GW93,广西,桂林市,华南,1,3,3,,,,,,,,,,7
GW99A,广西,玉林市,华南,1,,,,,,,,,,,,1
GW130,江苏,盐城市,华东南北部,,,1,,,,,,,,,,1
GW110.5,江苏,盐城市,华东南北部,,,1,2,13,12,9,20,20,17,6,,100
GW93,江苏,盐城市,华东南北部,,,,,4,4,5,,,,,,13
GW93,辽宁,沈阳市,东北,1,3,7,8,,,,,,,,,19
GW93,新疆,昌吉回族自治州,西北西部,,1,12,8,10,,,,,,,,31
SI122,广东,阳江市,华南,,,,,1,5,15,,,,,,21
SI122,广东,阳江市,华南,,,,,,,1,,,,,,1
SI122,广东,阳江市,华南,,,,,,5,13,4,,,,,22
GW110.5,上海,上海市,华东,,,,4,16,8,8,,,,,,36
GW110.5,江苏,盐城市,华东南北部,,,,,,,,,10,8,6,,24
GW110.5,江苏,盐城市,华东南北部,,,,,8,10,2,4,,,,,24
GW110.5,江苏,盐城市,华东南北部,,,,,,1,1,4,8,9,,,23
GW93,广西,钦州市,华南,2,,1,,,,,,,,,,3
GW93,广西,钦州市,华南,,1,1,1,,,,,,,,,3
GW93,广西,钦州市,华南,2,,3,1,,,,,,,,,6
GW93,广西,钦州市,华南,2,2,7,2,,,,,,,,,13
GW99A,陕西,渭南市,华北,,,3,3,3,,,,,,,,9
GW93,山西,太原市,华北,1,3,5,,,,,,,,,,9
GW93,河南,新乡市,华东南北部,1,,,,,,,,,,,,1
GW93,湖北,天门市,华东南北部,,,1,,,,,,,,,,1
GW81,国际,国际,国际,1,,,,,,,,,,,,1
GW76,国际,国际,国际,,,,,,,,,,,7,8,15
SI90.2,国际,国际,国际,,,,,,,,4,5,4,4,,17
SI90.2,新疆,乌鲁木齐市,西北西部,,,,,1,2,,,,,,,3
GW93,新疆,乌鲁木齐市,西北西部,,,,3,3,2,2,3,,,,,13
GW93,新疆,乌鲁木齐市,西北西部,,,,1,3,2,2,,,,,,8
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,,,,,,5,2,9,,16
GW99A,内蒙古,鄂尔多斯市,华北,,,,,,,,,,,5,6,11
GW93,河北,承德市,华北,6,5,1,,,,,,,,,,12
GWBD-A2,河北,承德市,华北,1,,,2,,,1,1,,,5,3,13
GWBD-A2,河北,张家口市,华北,1,,,2,2,1,5,2,,,,1,14
GWBD-A2,河北,张家口市,华北,,,,,,,,,,,,3,3
GWBD-A2,新疆,哈密市,西北西部,,,,,,,,,,,1,,1
GWBD-A2,新疆,哈密市,西北西部,,,,2,6,2,4,5,2,4,9,21,55
GW93,广西,钦州市,华南,,,1,1,1,1,1,,,,,,5
GW93,广西,钦州市,华南,2,1,4,2,2,4,1,,,,,,16
GW93,辽宁,朝阳市,东北,,,3,3,2,4,2,5,5,5,8,5,42
GW93,辽宁,朝阳市,东北,,,,2,1,1,,,1,2,4,3,14
GW93,贵州,黔东南苗族侗族自治州,华南,1,,3,3,4,3,2,,,,,,16
GW99A,湖北,荆门市,华东南北部,,,,,,,,,,2,6,8,16
GW99A,湖北,荆门市,华东南北部,,,,,,2,4,4,6,3,8,,27
GWBD-A3,辽宁,朝阳市,东北,,,,,1,,,,,,,,1
GW93,辽宁,朝阳市,东北,,,2,5,2,9,2,3,2,,,,25
SI90.2,国际,国际,国际,,7,,9,,,,,,,,,16
GW93,内蒙古,通辽市,华北,,,,,,,,,,,,3,3
GW93,黑龙江,哈尔滨市,东北,1,,,,,,,,,,,,1
GW99A,辽宁,鞍山市,东北,1,,3,,2,1,1,1,1,,,,10
GW93,重庆,重庆市,华南,,,,2,,,,,,,,,2
GW93,重庆,重庆市,华南,,,1,4,,,,,,,,,5
GW99A,天津,天津市,华北,1,2,,,,,,,,,,,3
GW93,天津,天津市,华北,,2,1,,,,,,,,,,3
GW99A,河北,秦皇岛市,华北,,,1,1,1,5,,,,,,,8
GW93,河北,秦皇岛市,华北,,,,1,1,,,,,,,,2
GW93,贵州,黔西南布依族苗族自治州,华南,,,4,3,,,1,,,,1,1,10
GW93,贵州,黔南布依族苗族自治州,华南,1,,,,,,,,,,,,1
GW99A,河南,济源市,华东南北部,,,,2,1,,,,3,,,1,7
GW83.4,国际,国际,国际,4,,6,4,,,,,,,,,14
GW99A,甘肃,定西市,西北东部,,,2,2,1,,,,,1,4,3,13
GW99,黑龙江,七台河市,东北,4,4,1,,,,,,,,,,9
GWBD-A3,湖北,黄冈市,华东南北部,,,,,,,,,,,,2,2
GW99A,黑龙江,绥化市,东北,,,,2,2,5,2,,,,,,11
GW99,天津,天津市,华北,,,,,,,,,,,,1,1
GWBD-A3,天津,天津市,华北,,,,,,,,,,,,1,1
GWBD-A3,天津,天津市,华北,,,,,,,,,,,,1,1
GW81,国际,国际,国际,,,,,,,8,8,4,,4,8,32
GW99A,河南,南阳市,华东南北部,,,2,1,,,,,,,,,3
GW99,河南,南阳市,华东南北部,2,,1,2,1,,,,,,,,6
GW99A,安徽,阜阳市,华东南北部,,,,,,,,,2,2,2,2,8
GW93,贵州,毕节市,华南,,,,,2,,,,,,,,2
GW99,贵州,毕节市,华南,,,2,3,1,2,,,,,,,8
GW83.4,黑龙江,哈尔滨市,东北,2,,2,5,1,,,,,,,,10
GW99A,河南,开封市,华东南北部,2,,,,,,,,,,,,2
GW99A,广西,玉林市,华南,,,,,,,,,1,,,,1
GW99,广西,玉林市,华南,,,,,,,,,,1,2,1,4
GW99A,甘肃,定西市,西北东部,,,1,1,6,3,1,5,1,,,,18
GW99,河南,商丘市,华东南北部,,,,,,,,2,3,4,5,1,15
GW99A,河南,三门峡市,华东南北部,6,,,,,,,,,,,,6
GWBD-A2,新疆,哈密市,西北西部,,3,7,6,,6,6,5,3,3,9,,48
GWBD-A2,新疆,塔城地区,西北西部,,,,,,,4,12,10,19,,,45
GW93,新疆,塔城地区,西北西部,,,,,,4,14,2,1,,,,21
GWBD-A2,新疆,塔城地区,西北西部,,,,,,4,8,8,4,,,,24
GWBD-A2,新疆,哈密市,西北西部,,,,,,,,,,,,1,1
GWBD-A2,新疆,哈密市,西北西部,,,,,,,,,,,,1,1
GWBD-A2,新疆,哈密市,西北西部,,,,,,,,,,,,5,5
GW83.4,辽宁,鞍山市,东北,,,,1,,,,,,,,,1
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,5,8,3,,,,,,,,16
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,2,3,,,,,,,,5
GW93,内蒙古,呼和浩特市,华北,,,,,,4,,,1,,,,5
GW99A,广西,钦州市,华南,7,6,1,2,2,,,,,,,,18
GW99A,黑龙江,七台河市,东北,,,,,1,4,8,10,9,,,,32
GWBD-A2,河北,张家口市,华北,,,,,,,,,,1,4,,5
GWBD-A2,河北,张家口市,华北,,,,,,,,,,,4,3,7
GW99,河南,安阳市,华东南北部,1,1,3,3,2,3,3,1,,,,,17
GW99A,河南,安阳市,华东南北部,,1,,2,3,3,1,1,1,,,,12
GWBD-A2,甘肃,酒泉市,西北东部,,,5,4,4,6,5,6,,,,,30
GWBD-A2,甘肃,酒泉市,西北东部,,,,,,,3,3,,,,,6
GWBD-A2,新疆,哈密市,西北西部,,,,5,13,37,11,24,,,,,90
GW99A,贵州,黔西南布依族苗族自治州,华南,,,,1,1,,,1,,,,3,6
GWBD-A2,吉林,松原市,东北,,1,2,1,1,1,2,,,,,,8
GWBD-A2,吉林,松原市,东北,3,6,7,10,20,5,5,,,,,,56
GWBD-A2,河北,承德市,华北,2,,,,,,,,,,,,2
GW83.4,辽宁,鞍山市,东北,,,,,1,,,,,,,,1
GW99A,江西,赣州市,华东南南部,1,,3,3,9,,,,,,,,16
GWBD-A3,广西,钦州市,华南,,,,,,,,,,,,4,4
GW99A,湖北,恩施土家族苗族自治州,华东南北部,,1,3,3,1,,,,,,,,8
GW99A,湖南,永州市,华东南南部,,,,1,,1,1,,1,1,2,2,9
GW99A,河北,邢台市,华北,,,,,1,4,7,5,5,7,11,9,49
GWBD-A2,河北,邢台市,华北,,,,,,,,,,,2,,2
GW99A,重庆,重庆市,华南,,,,,,,,2,,2,1,,5
GW99A,河南,新乡市,华东南北部,,,,2,5,2,2,2,2,,1,,16
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,3,9,1,5,2,,,,,20
GW99,新疆,昌吉回族自治州,西北西部,,,,3,2,4,9,2,6,1,,,27
GWBD-A2,河北,张家口市,华北,,,,4,1,,,,,,,,5
GWBD-A2,河北,张家口市,华北,,,,,1,,,,,,,,1
GW99,广西,来宾市,华南,,,4,8,9,15,2,,,,,,38
GWBD-A3,黑龙江,鹤岗市,东北,,,,,3,9,7,8,3,,,,30
GWBD-A2,新疆,哈密市,西北西部,,,8,,15,15,10,5,32,15,,,100
SI90.2,国际,国际,国际,,,9,,11,,5,6,8,8,11,,58
GW81,国际,国际,国际,3,,10,10,9,,,,,,,,32
GW81,国际,国际,国际,,8,,,,9,,,,,,,17
SI90.2,国际,国际,国际,,,5,,,,,,,,,,5
GW83.4,国际,国际,国际,,,,,,5,8,8,,8,4,,33
GWBD-A2,吉林,通化市,东北,,,,,3,1,,,,,,,4
GW99,吉林,通化市,东北,,,,,1,,,,,,,,1
GWBD-A2,河北,秦皇岛市,华北,,,,,,,1,,,,3,4,8
GW99A,甘肃,白银市,西北东部,4,,2,7,,,,,,,,,13
GW99A,甘肃,白银市,西北东部,,,,12,4,,,,,,,,16
GW81,国际,国际,国际,,,4,,,,,,,,,,4
GWBD-A3,天津,天津市,华北,,,,,,,,,5,1,,,6
GW93,天津,天津市,华北,,,,,,,1,1,,,,,2
GW99,河北,承德市,华北,1,1,,,1,,,,,,,,3
GW99,河北,承德市,华北,2,,2,2,7,,,,,,,,13
SI122,福建,莆田市,华东南南部,,,,,,3,7,2,,,,,12
GW130,广东,阳江市,华南,,,,,,,,,,3,3,1,7
GW93,河北,承德市,华北,,,,,,2,1,,,,,,3
SI90.2,河北,承德市,华北,1,,4,2,,10,3,,1,,,,21
GW93,河北,承德市,华北,,,2,1,3,,,,,,,,6
SI90.2,河北,承德市,华北,3,,3,,8,,,,,,,,14
GW81,国际,国际,国际,,,,,,,2,,,,,,2
GWBD-A3,河南,洛阳市,华东南北部,,1,2,,,,,,,,,,3
GW99A,山西,晋中市,华北,,,,,,,,,,,2,1,3
GW99,山西,晋中市,华北,,,,,,,,,,,2,3,5
GWBD-A2,黑龙江,佳木斯市,东北,6,3,3,,,6,5,5,,1,3,4,36
GWBD-A2,宁夏,吴忠市,西北东部,1,,,,,,,,,,,,1
SI90.2,国际,国际,国际,,,,,,,,,8,10,8,,26
SI90.2,国际,国际,国际,10,,,,,,,,,,,,10
GW81,国际,国际,国际,,,,,,,7,,,,,,7
GW83.3,国际,国际,国际,,,,,,,,,5,,,,5
GW93,山西,运城市,华北,,,,,,,,,,,,4,4
GWBD-A2,山西,朔州市,华北,,,,,,,,,,2,8,3,13
GWBD-A2,新疆,哈密市,西北西部,,,,,,1,4,8,3,8,,,24
GW99,新疆,伊犁哈萨克自治州,西北西部,,,12,5,8,6,6,,11,7,10,,65
GWBD-A2,云南,昆明市,华南,,,,,,,,,,,2,2,4
GW93,陕西,渭南市,华北,1,2,2,,,,,,,,,,5
GWBD-A2,山西,忻州市,华北,,,,,,,,,1,3,6,3,13
GWBD-A2,山西,大同市,华北,,,,1,,2,,2,1,3,3,,12
GW76,国际,国际,国际,2,,,,,,,,,,,,2
GW99,内蒙古,鄂尔多斯市,华北,,,,,,3,5,2,1,4,10,5,30
GW76,国际,国际,国际,1,,,,,,,,,,,,1
GWBD-A2,新疆,乌鲁木齐市,西北西部,,,,6,7,,,,,,,,13
GW99,青海,海南藏族自治州,西北东部,,,,,,,,2,3,,,,5
GW76,国际,国际,国际,7,,,,,,,,,,,,7
GWBD-A3,贵州,毕节市,华南,,,,2,1,2,,1,,,,,6
GWBD-A2,甘肃,庆阳市,西北东部,,,,,2,,,,,,,,2
SI90.2,新疆,吐鲁番地区,西北西部,5,,,,,,,,,,,,5
GW93,辽宁,沈阳市,东北,,,1,,,,,,,,,,1
GWBD-A2,内蒙古,兴安盟,东北,,,,,1,3,2,2,3,4,5,,20
GWBD-A2,内蒙古,兴安盟,东北,,,,,,,,,3,,1,,4
GWBD-A2,内蒙古,兴安盟,东北,,,,1,8,6,1,3,,,,,19
GWBD-A2,内蒙古,兴安盟,东北,,,,,,4,,,,,,,4
GWBD-A2,辽宁,锦州市,东北,,,,,,1,,,,,,,1
GW76,国际,国际,国际,,,,4,,,,,,,,,4
GW86,国际,国际,国际,,8,,,,,,,,,,,8
GW76,国际,国际,国际,3,,,,,,,,,,,,3
GW81,国际,国际,国际,,,,5,,,,,,,,,5
GW76,国际,国际,国际,7,,,,,,,,,,,,7
GW76,国际,国际,国际,,,,7,,,,,,,,,7
SI90.2,国际,国际,国际,,,,7,10,,10,5,,,,,32
SI90.2,国际,国际,国际,,7,16,10,,,,15,12,,,,60
GW83.4,国际,国际,国际,14,7,,,,7,6,,,,,,34
GW76,国际,国际,国际,,,,,,4,,,,,,,4
GW81,国际,国际,国际,,,,,,,1,,,,,,1
GW130,广东,阳江市,华南,,,,,,,,,,5,10,10,25
GW81,国际,国际,国际,,,,,,10,,5,,10,,,25
GWBD-A2,新疆,哈密市,西北西部,,,,,,,8,7,2,6,5,15,43
SI90.2,新疆,吐鲁番地区,西北西部,,,,,1,4,7,12,3,15,14,,56
GW99A,甘肃,酒泉市,西北东部,,,,,,,,,,3,9,3,15
GWBD-A2,内蒙古,通辽市,华北,2,2,5,4,4,,,,,,,,17
GW99A,河北,邢台市,华北,,,,1,3,2,3,5,1,1,,,16
GW99,重庆,重庆市,华南,,,,,,,,,,3,,2,5
GWBD-A2,重庆,重庆市,华南,,,,,,,,,1,4,2,,7
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,,,,2,5,2,5,4,,18
GWBD-A2,内蒙古,锡林郭勒盟,华北,,,4,4,,,,,,,,,8
GWBD-A3,山东,聊城市,华东南北部,,,,,,,1,2,4,5,8,,20
GWBD-A2,新疆,巴音郭楞蒙古自治州,西北西部,1,,,,,,,,,,,,1
GWBD-A2,新疆,塔城地区,西北西部,,,,,,3,8,12,7,7,13,,50
GW93,天津,天津市,华北,,,1,7,2,,,,,,,,10
GWBD-A3,广西,梧州市,华南,,,,1,3,6,2,8,8,,,,28
SI90.2,国际,国际,国际,,,,,9,,,,9,,,7,25
GWBD-A2,新疆,乌鲁木齐市,西北西部,,,,,,,2,3,6,6,3,4,24
SI90.2,国际,国际,国际,,,,,,,,,,,2,,2
GW93,吉林,白城市,东北,,,,,,,,,,,,2,2
GW110.5,江苏,盐城市,华东南北部,,,,,1,,6,6,,,,,13
SI122,江苏,盐城市,华东南北部,,,,,,,1,,,,,,1
GWBD-A2,内蒙古,乌兰察布市,华北,,2,3,5,6,2,8,,,,,,26
GWBD-A2,新疆,哈密市,西北西部,,,2,16,11,6,12,8,30,25,,,110
GW99,广西,河池市,华南,,,,,,,,,2,1,,,3
GW99A,广西,河池市,华南,,,,,,,,,2,3,,1,6
GWBD-A3,宁夏,吴忠市,西北东部,,,,,,,,1,3,,2,,6
GWBD-A3,新疆,昌吉回族自治州,西北西部,,,5,7,11,10,10,2,7,7,1,,60
GW99,内蒙古,锡林郭勒盟,华北,,,,,,,,7,,,,,7
GW99,内蒙古,锡林郭勒盟,华北,,,,,,,3,,,,,,3
GW99,内蒙古,锡林郭勒盟,华北,,,,,,,,5,12,,,,17
GW99,内蒙古,锡林郭勒盟,华北,,,,,,,,,3,10,3,1,17
GWBD-A2,山东,济南市,华东南北部,,,,,,,1,,,,,,1
GWBD-A3,山东,济南市,华东南北部,,,2,5,3,2,2,6,7,1,4,,32
GWBD-A2,山东,济南市,华东南北部,,,,,,,5,3,,,,,8
GWBD-A2,山东,济南市,华东南北部,,,,1,2,,,,,,,,3
GWBD-A3,山东,济南市,华东南北部,,,2,3,1,,,,,,,,6
GWBD-A2,内蒙古,锡林郭勒盟,华北,,,,1,2,1,1,,,,,,5
GW99,云南,昆明市,华南,,,,,,,,,,,1,2,3
GWBD-A2,新疆,新疆生产建设兵团第十师,西北西部,,,,,1,7,1,1,,,,,10
GWBD-A2,新疆,阿勒泰地区,西北西部,,,5,16,21,,,1,2,,,,45
GWBD-A3,广西,百色市,华南,,,,,,,,,,,6,6,12
GW99,新疆,昌吉回族自治州,西北西部,,,10,12,,,,,,,,,22
GWBD-A3,新疆,昌吉回族自治州,西北西部,,,,2,,,,,,,,,2
GWBD-A2,内蒙古,兴安盟,东北,,,,,,,,,,,3,4,7
GWBD-A2,内蒙古,兴安盟,东北,,,,,,,,,,,3,3,6
GWBD-A3,新疆,昌吉回族自治州,西北西部,,,,,2,8,9,13,14,20,9,,75
GW99,河北,张家口市,华北,,,,,,,,,,,5,3,8
GWBD-A3,湖北,荆州市,华东南北部,,,,,,,,,,,,2,2
GW99A,河北,衡水市,华北,,,,,,,,,2,3,3,2,10
GWBD-A3,河北,邢台市,华北,,,,,,,,,1,4,4,3,12
GW99A,陕西,延安市,华北,,,,2,2,,,,,,,,4
GW81,国际,国际,国际,,,,,,9,11,9,11,,11,,51
SI90.2,国际,国际,国际,,,,,,,,,9,,,9,18
GWBD-A2,内蒙古,锡林郭勒盟,华北,,,,,,,,,1,3,8,,12
SI90.2,新疆,塔城地区,西北西部,,,,,,,,,4,,,,4
GW99A,湖北,荆门市,华东南北部,,,,,,2,4,4,4,3,1,,18
GWBD-A2,内蒙古,锡林郭勒盟,华北,,,,,,,1,5,12,9,3,,30
GWBD-A2,内蒙古,通辽市,华北,,,,,,3,1,1,,,1,,6
GWBD-A2,内蒙古,通辽市,华北,,,,,,,7,1,,,,,8
GWBD-A3,山西,朔州市,华北,,,3,,,,,,,,,,3
GWBD-A2,宁夏,中卫市,西北东部,,,,,,1,5,7,5,,,,18
GWBD-A3,宁夏,中卫市,西北东部,,,,,,,4,4,7,,,,15
GWBD-A2,宁夏,中卫市,西北东部,,,,,,,,2,3,,,,5
GWBD-A3,宁夏,中卫市,西北东部,,,,,,,,1,2,,,,3
GWBD-A2,新疆,哈密市,西北西部,,,,,,,,,,,4,,4
GW99A,河北,秦皇岛市,华北,,,,,,,,1,4,2,3,,10
GW93,辽宁,沈阳市,东北,,,,,1,,,,,,,,1
GW81,国际,国际,国际,,,,,,,3,,,,,,3
SI90.2,国际,国际,国际,,,,,,,6,5,3,3,,,17
SI90.2,国际,国际,国际,,,,1,,,,,,,,,1
GWBD-A2,新疆,塔城地区,西北西部,,,,4,8,8,13,8,13,13,,,67
GW93,陕西,榆林市,华北,,,2,,,,,,,,,,2
SI90.2,国际,国际,国际,,,,,,,,,9,,,,9
GWBD-A3,河北,邯郸市,华北,,,,1,1,2,,,,,,,4
GWBD-A2,河北,邯郸市,华北,,,,1,1,,1,,,,,,3
SI90.2,国际,国际,国际,,,,,,6,,6,6,4,,,22
GWBD-A3,宁夏,吴忠市,西北东部,,,,,,,,,2,1,2,,5
GWBD-A3,宁夏,吴忠市,西北东部,,,,,,,,,,2,,,2
GW99A,河北,沧州市,华北,,,,,1,3,1,2,1,,,,8
GW99A,天津,天津市,华北,,,,1,4,,,,,,,,5
GWBD-A3,宁夏,中卫市,西北东部,,,,,,,,,,,6,4,10
GW83.4,国际,国际,国际,,,,7,,,,,,,,,7
GW76,国际,国际,国际,,,,,,,10,,,,,,10
SI90.2,国际,国际,国际,,,,,,,,,,,1,,1
GWBD-A3,河北,邢台市,华北,,,,,,,,,4,4,4,,12
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,,,,1,6,10,4,21,,42
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,,,,,3,11,11,20,,45
GWBD-A2,内蒙古,通辽市,华北,,,,,,,,,,2,11,3,16
GWBD-A2,内蒙古,通辽市,华北,,,,,,,,,,,2,2,4
GWBD-A2,内蒙古,通辽市,华北,,,,,,,,,2,2,1,,5
GWBD-A2,内蒙古,通辽市,华北,,,,,,,,,1,,,,1
GWBD-A2,内蒙古,通辽市,华北,,,,,,,,,4,5,6,5,20
GWBD-A2,内蒙古,通辽市,华北,,,,,,,,,,,2,2,4
GW99,新疆,乌鲁木齐市,西北西部,,,,2,,,,,,,,,2
GW99,新疆,乌鲁木齐市,西北西部,,,,3,,,,,,,,,3
GWBD-A3,河北,衡水市,华北,,,,1,2,3,2,,,,,,8
GWBD-A2,新疆,塔城地区,西北西部,,,,,,,10,8,16,11,5,,50
GWBD-A2,黑龙江,绥化市,东北,,,,,,,,,,,3,2,5
GW93,天津,天津市,华北,,,,,4,,,,,,,,4
GWBD-A2,内蒙古,兴安盟,东北,,,,,,,,,,1,13,11,25
GWBD-A2,新疆,乌鲁木齐市,西北西部,,,,,,,,,,,2,3,5
GWBD-A3,山西,大同市,华北,,,,,,,,3,6,10,5,,24
GWBD-D,辽宁,朝阳市,东北,,,,,,,,,,,1,,1
GW99A,辽宁,辽阳市,东北,,,,,,,,,,,,2,2
GWBD-A2,辽宁,锦州市,东北,,,,,,,,,,,1,,1
GW99,河北,张家口市,华北,,,,,,,,,,,1,,1
GWBD-A3,河北,张家口市,华北,,,,,,,,,,,1,,1
GW83.4,国际,国际,国际,,,,,,3,,,,,,,3
GW93,内蒙古,锡林郭勒盟,华北,,,,2,,,,,,,,,2
GWBD-A3,山东,德州市,华东南北部,,,,,,,,,,,,4,4
GWBD-A3,河北,邢台市,华北,,,,,,1,,,,5,5,5,16
GWBD-A3,河北,邢台市,华北,,,,,,,,,,,4,4,8
GWBD-A3,河北,邢台市,华北,,,,,,,,,,,2,3,5
GWBD-A3,河北,邢台市,华北,,,,,,,,,,,,1,1
GWBD-D,陕西,渭南市,华北,,,,,,,,1,2,,1,,4
GW83.4,江苏,镇江市,华东南北部,,,,,,,,,1,,,,1
GW99A,湖北,恩施土家族苗族自治州,华东南北部,,,,,,,,1,4,3,3,2,13
GW99A,山东,聊城市,华东南北部,,,,,,,,,,,5,5,10
GW81,国际,国际,国际,,,,,,,1,,,,,,1
GWBD-A3,河北,衡水市,华北,,,,,,,,,2,3,6,8,19
GWBD-A3,河北,衡水市,华北,,,,,,,4,3,4,3,2,,16
GWBD-A2,新疆,乌鲁木齐市,西北西部,,,,,6,,,,,,,,6
GW99A,天津,天津市,华北,,,,,,,,,4,2,,,6
GW99,天津,天津市,华北,,,,,,,,,,1,,,1
GW93,内蒙古,兴安盟,东北,,,,,,,4,3,3,,,,10
GW99A,河北,沧州市,华北,,,,,,,,,,,,7,7
GWBD-D,河北,张家口市,华北,,,,,,,,,,2,,,2
SI90.2,国际,国际,国际,,,,,,,,,,,,10,10
GWBD-A3,河北,沧州市,华北,,,,,1,2,5,,,,,,8
GWBD-A3,河北,邢台市,华北,,,,,,,,,,,2,4,6
GWBD-A2,新疆,哈密市,西北西部,,,,,,,,,,,2,4,6
GW81,国际,国际,国际,,,,,,,,,1,,,,1
GW83.4,国际,国际,国际,,,,,,,,,,,1,,1
GW99,新疆,乌鲁木齐市,西北西部,,,,,,,,,4,4,3,,11
GWBD-A2,新疆,阿勒泰地区,西北西部,,,,,,,,1,,6,18,,25
GWBD-A2,新疆,阿勒泰地区,西北西部,,,,,,,,1,,7,24,8,40
SI90.2,国际,国际,国际,,,,,,,,,,,1,,1
GWBD-A2,内蒙古,鄂尔多斯市,华北,,,,,,,,,,,1,,1
GW99A,河北,张家口市,华北,,,,,,,,,1,1,,,2
GWBD-D,辽宁,本溪市,东北,,,,,,,,,,1,,,1
GW99,云南,曲靖市,华南,,,,,,,,,,,6,10,16
GW93,新疆,巴音郭楞蒙古自治州,西北西部,,,,,,,,,,,,1,1
GW99,甘肃,酒泉市,西北东部,,,,,,,,,,,1,,1
GW93,山东,济宁市,华东南北部,,,,,,,,,,,,2,2
GW99,新疆,巴音郭楞蒙古自治州,西北西部,,,,,1,,,,,,,,1
GWBD-A3,甘肃,庆阳市,西北东部,,,,,,,,,,,,2,2
GW93,天津,天津市,华北,,,,,,,,,,,,1,1
GWBD-A2,黑龙江,哈尔滨市,东北,,,,,,,,,,,,2,2
GW83.4,国际,国际,国际,,,,,,,,,,,1,,1
GW99A,贵州,铜仁市,华南,,,,,,,,,,,2,2,4
GWBD-A2,河北,张家口市,华北,,,,,,,,,,,,2,2
GWBD-A2,河北,张家口市,华北,,,,,,,,,,,,10,10
GWBD-A2,辽宁,朝阳市,东北,,,,,,,,,,,1,,1
SI90.2,新疆,昌吉回族自治州,西北西部,,,,,,,,,,,1,,1
GWBD-A2,新疆,昌吉回族自治州,西北西部,,,,,,,,,1,,,,1
GW83.3,新疆,昌吉回族自治州,西北西部,,,,,,,,,1,,,,1
GWBD-A2,青海,海西蒙古族藏族自治州,西北东部,,,,,,,,,,,,4,4
GWBD-A2,山东,烟台市,华东南北部,,,,,,,,,,,,1,1
GW99,内蒙古,通辽市,华北,,,,,,,,,,,,1,1
GW99,内蒙古,锡林郭勒盟,华北,,,,,,,,,,,,1,1
1 生产型号 省份 需求区域 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 总量
2 GW83.4 辽宁 葫芦岛市 东北 1 1
3 GW83.4 广西 桂林市 华南 3 3 2 8
4 GW93 广西 桂林市 华南 2 2 4
5 GW93 广西 桂林市 华南 3 3
6 GW93 广西 桂林市 华南 1 3 3 7
7 GW99A 广西 玉林市 华南 1 1
8 GW130 江苏 盐城市 华东南北部 1 1
9 GW110.5 江苏 盐城市 华东南北部 1 2 13 12 9 20 20 17 6 100
10 GW93 江苏 盐城市 华东南北部 4 4 5 13
11 GW93 辽宁 沈阳市 东北 1 3 7 8 19
12 GW93 新疆 昌吉回族自治州 西北西部 1 12 8 10 31
13 SI122 广东 阳江市 华南 1 5 15 21
14 SI122 广东 阳江市 华南 1 1
15 SI122 广东 阳江市 华南 5 13 4 22
16 GW110.5 上海 上海市 华东 4 16 8 8 36
17 GW110.5 江苏 盐城市 华东南北部 10 8 6 24
18 GW110.5 江苏 盐城市 华东南北部 8 10 2 4 24
19 GW110.5 江苏 盐城市 华东南北部 1 1 4 8 9 23
20 GW93 广西 钦州市 华南 2 1 3
21 GW93 广西 钦州市 华南 1 1 1 3
22 GW93 广西 钦州市 华南 2 3 1 6
23 GW93 广西 钦州市 华南 2 2 7 2 13
24 GW99A 陕西 渭南市 华北 3 3 3 9
25 GW93 山西 太原市 华北 1 3 5 9
26 GW93 河南 新乡市 华东南北部 1 1
27 GW93 湖北 天门市 华东南北部 1 1
28 GW81 国际 国际 国际 1 1
29 GW76 国际 国际 国际 7 8 15
30 SI90.2 国际 国际 国际 4 5 4 4 17
31 SI90.2 新疆 乌鲁木齐市 西北西部 1 2 3
32 GW93 新疆 乌鲁木齐市 西北西部 3 3 2 2 3 13
33 GW93 新疆 乌鲁木齐市 西北西部 1 3 2 2 8
34 GWBD-A2 新疆 昌吉回族自治州 西北西部 5 2 9 16
35 GW99A 内蒙古 鄂尔多斯市 华北 5 6 11
36 GW93 河北 承德市 华北 6 5 1 12
37 GWBD-A2 河北 承德市 华北 1 2 1 1 5 3 13
38 GWBD-A2 河北 张家口市 华北 1 2 2 1 5 2 1 14
39 GWBD-A2 河北 张家口市 华北 3 3
40 GWBD-A2 新疆 哈密市 西北西部 1 1
41 GWBD-A2 新疆 哈密市 西北西部 2 6 2 4 5 2 4 9 21 55
42 GW93 广西 钦州市 华南 1 1 1 1 1 5
43 GW93 广西 钦州市 华南 2 1 4 2 2 4 1 16
44 GW93 辽宁 朝阳市 东北 3 3 2 4 2 5 5 5 8 5 42
45 GW93 辽宁 朝阳市 东北 2 1 1 1 2 4 3 14
46 GW93 贵州 黔东南苗族侗族自治州 华南 1 3 3 4 3 2 16
47 GW99A 湖北 荆门市 华东南北部 2 6 8 16
48 GW99A 湖北 荆门市 华东南北部 2 4 4 6 3 8 27
49 GWBD-A3 辽宁 朝阳市 东北 1 1
50 GW93 辽宁 朝阳市 东北 2 5 2 9 2 3 2 25
51 SI90.2 国际 国际 国际 7 9 16
52 GW93 内蒙古 通辽市 华北 3 3
53 GW93 黑龙江 哈尔滨市 东北 1 1
54 GW99A 辽宁 鞍山市 东北 1 3 2 1 1 1 1 10
55 GW93 重庆 重庆市 华南 2 2
56 GW93 重庆 重庆市 华南 1 4 5
57 GW99A 天津 天津市 华北 1 2 3
58 GW93 天津 天津市 华北 2 1 3
59 GW99A 河北 秦皇岛市 华北 1 1 1 5 8
60 GW93 河北 秦皇岛市 华北 1 1 2
61 GW93 贵州 黔西南布依族苗族自治州 华南 4 3 1 1 1 10
62 GW93 贵州 黔南布依族苗族自治州 华南 1 1
63 GW99A 河南 济源市 华东南北部 2 1 3 1 7
64 GW83.4 国际 国际 国际 4 6 4 14
65 GW99A 甘肃 定西市 西北东部 2 2 1 1 4 3 13
66 GW99 黑龙江 七台河市 东北 4 4 1 9
67 GWBD-A3 湖北 黄冈市 华东南北部 2 2
68 GW99A 黑龙江 绥化市 东北 2 2 5 2 11
69 GW99 天津 天津市 华北 1 1
70 GWBD-A3 天津 天津市 华北 1 1
71 GWBD-A3 天津 天津市 华北 1 1
72 GW81 国际 国际 国际 8 8 4 4 8 32
73 GW99A 河南 南阳市 华东南北部 2 1 3
74 GW99 河南 南阳市 华东南北部 2 1 2 1 6
75 GW99A 安徽 阜阳市 华东南北部 2 2 2 2 8
76 GW93 贵州 毕节市 华南 2 2
77 GW99 贵州 毕节市 华南 2 3 1 2 8
78 GW83.4 黑龙江 哈尔滨市 东北 2 2 5 1 10
79 GW99A 河南 开封市 华东南北部 2 2
80 GW99A 广西 玉林市 华南 1 1
81 GW99 广西 玉林市 华南 1 2 1 4
82 GW99A 甘肃 定西市 西北东部 1 1 6 3 1 5 1 18
83 GW99 河南 商丘市 华东南北部 2 3 4 5 1 15
84 GW99A 河南 三门峡市 华东南北部 6 6
85 GWBD-A2 新疆 哈密市 西北西部 3 7 6 6 6 5 3 3 9 48
86 GWBD-A2 新疆 塔城地区 西北西部 4 12 10 19 45
87 GW93 新疆 塔城地区 西北西部 4 14 2 1 21
88 GWBD-A2 新疆 塔城地区 西北西部 4 8 8 4 24
89 GWBD-A2 新疆 哈密市 西北西部 1 1
90 GWBD-A2 新疆 哈密市 西北西部 1 1
91 GWBD-A2 新疆 哈密市 西北西部 5 5
92 GW83.4 辽宁 鞍山市 东北 1 1
93 GWBD-A2 新疆 昌吉回族自治州 西北西部 5 8 3 16
94 GWBD-A2 新疆 昌吉回族自治州 西北西部 2 3 5
95 GW93 内蒙古 呼和浩特市 华北 4 1 5
96 GW99A 广西 钦州市 华南 7 6 1 2 2 18
97 GW99A 黑龙江 七台河市 东北 1 4 8 10 9 32
98 GWBD-A2 河北 张家口市 华北 1 4 5
99 GWBD-A2 河北 张家口市 华北 4 3 7
100 GW99 河南 安阳市 华东南北部 1 1 3 3 2 3 3 1 17
101 GW99A 河南 安阳市 华东南北部 1 2 3 3 1 1 1 12
102 GWBD-A2 甘肃 酒泉市 西北东部 5 4 4 6 5 6 30
103 GWBD-A2 甘肃 酒泉市 西北东部 3 3 6
104 GWBD-A2 新疆 哈密市 西北西部 5 13 37 11 24 90
105 GW99A 贵州 黔西南布依族苗族自治州 华南 1 1 1 3 6
106 GWBD-A2 吉林 松原市 东北 1 2 1 1 1 2 8
107 GWBD-A2 吉林 松原市 东北 3 6 7 10 20 5 5 56
108 GWBD-A2 河北 承德市 华北 2 2
109 GW83.4 辽宁 鞍山市 东北 1 1
110 GW99A 江西 赣州市 华东南南部 1 3 3 9 16
111 GWBD-A3 广西 钦州市 华南 4 4
112 GW99A 湖北 恩施土家族苗族自治州 华东南北部 1 3 3 1 8
113 GW99A 湖南 永州市 华东南南部 1 1 1 1 1 2 2 9
114 GW99A 河北 邢台市 华北 1 4 7 5 5 7 11 9 49
115 GWBD-A2 河北 邢台市 华北 2 2
116 GW99A 重庆 重庆市 华南 2 2 1 5
117 GW99A 河南 新乡市 华东南北部 2 5 2 2 2 2 1 16
118 GWBD-A2 新疆 昌吉回族自治州 西北西部 3 9 1 5 2 20
119 GW99 新疆 昌吉回族自治州 西北西部 3 2 4 9 2 6 1 27
120 GWBD-A2 河北 张家口市 华北 4 1 5
121 GWBD-A2 河北 张家口市 华北 1 1
122 GW99 广西 来宾市 华南 4 8 9 15 2 38
123 GWBD-A3 黑龙江 鹤岗市 东北 3 9 7 8 3 30
124 GWBD-A2 新疆 哈密市 西北西部 8 15 15 10 5 32 15 100
125 SI90.2 国际 国际 国际 9 11 5 6 8 8 11 58
126 GW81 国际 国际 国际 3 10 10 9 32
127 GW81 国际 国际 国际 8 9 17
128 SI90.2 国际 国际 国际 5 5
129 GW83.4 国际 国际 国际 5 8 8 8 4 33
130 GWBD-A2 吉林 通化市 东北 3 1 4
131 GW99 吉林 通化市 东北 1 1
132 GWBD-A2 河北 秦皇岛市 华北 1 3 4 8
133 GW99A 甘肃 白银市 西北东部 4 2 7 13
134 GW99A 甘肃 白银市 西北东部 12 4 16
135 GW81 国际 国际 国际 4 4
136 GWBD-A3 天津 天津市 华北 5 1 6
137 GW93 天津 天津市 华北 1 1 2
138 GW99 河北 承德市 华北 1 1 1 3
139 GW99 河北 承德市 华北 2 2 2 7 13
140 SI122 福建 莆田市 华东南南部 3 7 2 12
141 GW130 广东 阳江市 华南 3 3 1 7
142 GW93 河北 承德市 华北 2 1 3
143 SI90.2 河北 承德市 华北 1 4 2 10 3 1 21
144 GW93 河北 承德市 华北 2 1 3 6
145 SI90.2 河北 承德市 华北 3 3 8 14
146 GW81 国际 国际 国际 2 2
147 GWBD-A3 河南 洛阳市 华东南北部 1 2 3
148 GW99A 山西 晋中市 华北 2 1 3
149 GW99 山西 晋中市 华北 2 3 5
150 GWBD-A2 黑龙江 佳木斯市 东北 6 3 3 6 5 5 1 3 4 36
151 GWBD-A2 宁夏 吴忠市 西北东部 1 1
152 SI90.2 国际 国际 国际 8 10 8 26
153 SI90.2 国际 国际 国际 10 10
154 GW81 国际 国际 国际 7 7
155 GW83.3 国际 国际 国际 5 5
156 GW93 山西 运城市 华北 4 4
157 GWBD-A2 山西 朔州市 华北 2 8 3 13
158 GWBD-A2 新疆 哈密市 西北西部 1 4 8 3 8 24
159 GW99 新疆 伊犁哈萨克自治州 西北西部 12 5 8 6 6 11 7 10 65
160 GWBD-A2 云南 昆明市 华南 2 2 4
161 GW93 陕西 渭南市 华北 1 2 2 5
162 GWBD-A2 山西 忻州市 华北 1 3 6 3 13
163 GWBD-A2 山西 大同市 华北 1 2 2 1 3 3 12
164 GW76 国际 国际 国际 2 2
165 GW99 内蒙古 鄂尔多斯市 华北 3 5 2 1 4 10 5 30
166 GW76 国际 国际 国际 1 1
167 GWBD-A2 新疆 乌鲁木齐市 西北西部 6 7 13
168 GW99 青海 海南藏族自治州 西北东部 2 3 5
169 GW76 国际 国际 国际 7 7
170 GWBD-A3 贵州 毕节市 华南 2 1 2 1 6
171 GWBD-A2 甘肃 庆阳市 西北东部 2 2
172 SI90.2 新疆 吐鲁番地区 西北西部 5 5
173 GW93 辽宁 沈阳市 东北 1 1
174 GWBD-A2 内蒙古 兴安盟 东北 1 3 2 2 3 4 5 20
175 GWBD-A2 内蒙古 兴安盟 东北 3 1 4
176 GWBD-A2 内蒙古 兴安盟 东北 1 8 6 1 3 19
177 GWBD-A2 内蒙古 兴安盟 东北 4 4
178 GWBD-A2 辽宁 锦州市 东北 1 1
179 GW76 国际 国际 国际 4 4
180 GW86 国际 国际 国际 8 8
181 GW76 国际 国际 国际 3 3
182 GW81 国际 国际 国际 5 5
183 GW76 国际 国际 国际 7 7
184 GW76 国际 国际 国际 7 7
185 SI90.2 国际 国际 国际 7 10 10 5 32
186 SI90.2 国际 国际 国际 7 16 10 15 12 60
187 GW83.4 国际 国际 国际 14 7 7 6 34
188 GW76 国际 国际 国际 4 4
189 GW81 国际 国际 国际 1 1
190 GW130 广东 阳江市 华南 5 10 10 25
191 GW81 国际 国际 国际 10 5 10 25
192 GWBD-A2 新疆 哈密市 西北西部 8 7 2 6 5 15 43
193 SI90.2 新疆 吐鲁番地区 西北西部 1 4 7 12 3 15 14 56
194 GW99A 甘肃 酒泉市 西北东部 3 9 3 15
195 GWBD-A2 内蒙古 通辽市 华北 2 2 5 4 4 17
196 GW99A 河北 邢台市 华北 1 3 2 3 5 1 1 16
197 GW99 重庆 重庆市 华南 3 2 5
198 GWBD-A2 重庆 重庆市 华南 1 4 2 7
199 GWBD-A2 新疆 昌吉回族自治州 西北西部 2 5 2 5 4 18
200 GWBD-A2 内蒙古 锡林郭勒盟 华北 4 4 8
201 GWBD-A3 山东 聊城市 华东南北部 1 2 4 5 8 20
202 GWBD-A2 新疆 巴音郭楞蒙古自治州 西北西部 1 1
203 GWBD-A2 新疆 塔城地区 西北西部 3 8 12 7 7 13 50
204 GW93 天津 天津市 华北 1 7 2 10
205 GWBD-A3 广西 梧州市 华南 1 3 6 2 8 8 28
206 SI90.2 国际 国际 国际 9 9 7 25
207 GWBD-A2 新疆 乌鲁木齐市 西北西部 2 3 6 6 3 4 24
208 SI90.2 国际 国际 国际 2 2
209 GW93 吉林 白城市 东北 2 2
210 GW110.5 江苏 盐城市 华东南北部 1 6 6 13
211 SI122 江苏 盐城市 华东南北部 1 1
212 GWBD-A2 内蒙古 乌兰察布市 华北 2 3 5 6 2 8 26
213 GWBD-A2 新疆 哈密市 西北西部 2 16 11 6 12 8 30 25 110
214 GW99 广西 河池市 华南 2 1 3
215 GW99A 广西 河池市 华南 2 3 1 6
216 GWBD-A3 宁夏 吴忠市 西北东部 1 3 2 6
217 GWBD-A3 新疆 昌吉回族自治州 西北西部 5 7 11 10 10 2 7 7 1 60
218 GW99 内蒙古 锡林郭勒盟 华北 7 7
219 GW99 内蒙古 锡林郭勒盟 华北 3 3
220 GW99 内蒙古 锡林郭勒盟 华北 5 12 17
221 GW99 内蒙古 锡林郭勒盟 华北 3 10 3 1 17
222 GWBD-A2 山东 济南市 华东南北部 1 1
223 GWBD-A3 山东 济南市 华东南北部 2 5 3 2 2 6 7 1 4 32
224 GWBD-A2 山东 济南市 华东南北部 5 3 8
225 GWBD-A2 山东 济南市 华东南北部 1 2 3
226 GWBD-A3 山东 济南市 华东南北部 2 3 1 6
227 GWBD-A2 内蒙古 锡林郭勒盟 华北 1 2 1 1 5
228 GW99 云南 昆明市 华南 1 2 3
229 GWBD-A2 新疆 新疆生产建设兵团第十师 西北西部 1 7 1 1 10
230 GWBD-A2 新疆 阿勒泰地区 西北西部 5 16 21 1 2 45
231 GWBD-A3 广西 百色市 华南 6 6 12
232 GW99 新疆 昌吉回族自治州 西北西部 10 12 22
233 GWBD-A3 新疆 昌吉回族自治州 西北西部 2 2
234 GWBD-A2 内蒙古 兴安盟 东北 3 4 7
235 GWBD-A2 内蒙古 兴安盟 东北 3 3 6
236 GWBD-A3 新疆 昌吉回族自治州 西北西部 2 8 9 13 14 20 9 75
237 GW99 河北 张家口市 华北 5 3 8
238 GWBD-A3 湖北 荆州市 华东南北部 2 2
239 GW99A 河北 衡水市 华北 2 3 3 2 10
240 GWBD-A3 河北 邢台市 华北 1 4 4 3 12
241 GW99A 陕西 延安市 华北 2 2 4
242 GW81 国际 国际 国际 9 11 9 11 11 51
243 SI90.2 国际 国际 国际 9 9 18
244 GWBD-A2 内蒙古 锡林郭勒盟 华北 1 3 8 12
245 SI90.2 新疆 塔城地区 西北西部 4 4
246 GW99A 湖北 荆门市 华东南北部 2 4 4 4 3 1 18
247 GWBD-A2 内蒙古 锡林郭勒盟 华北 1 5 12 9 3 30
248 GWBD-A2 内蒙古 通辽市 华北 3 1 1 1 6
249 GWBD-A2 内蒙古 通辽市 华北 7 1 8
250 GWBD-A3 山西 朔州市 华北 3 3
251 GWBD-A2 宁夏 中卫市 西北东部 1 5 7 5 18
252 GWBD-A3 宁夏 中卫市 西北东部 4 4 7 15
253 GWBD-A2 宁夏 中卫市 西北东部 2 3 5
254 GWBD-A3 宁夏 中卫市 西北东部 1 2 3
255 GWBD-A2 新疆 哈密市 西北西部 4 4
256 GW99A 河北 秦皇岛市 华北 1 4 2 3 10
257 GW93 辽宁 沈阳市 东北 1 1
258 GW81 国际 国际 国际 3 3
259 SI90.2 国际 国际 国际 6 5 3 3 17
260 SI90.2 国际 国际 国际 1 1
261 GWBD-A2 新疆 塔城地区 西北西部 4 8 8 13 8 13 13 67
262 GW93 陕西 榆林市 华北 2 2
263 SI90.2 国际 国际 国际 9 9
264 GWBD-A3 河北 邯郸市 华北 1 1 2 4
265 GWBD-A2 河北 邯郸市 华北 1 1 1 3
266 SI90.2 国际 国际 国际 6 6 6 4 22
267 GWBD-A3 宁夏 吴忠市 西北东部 2 1 2 5
268 GWBD-A3 宁夏 吴忠市 西北东部 2 2
269 GW99A 河北 沧州市 华北 1 3 1 2 1 8
270 GW99A 天津 天津市 华北 1 4 5
271 GWBD-A3 宁夏 中卫市 西北东部 6 4 10
272 GW83.4 国际 国际 国际 7 7
273 GW76 国际 国际 国际 10 10
274 SI90.2 国际 国际 国际 1 1
275 GWBD-A3 河北 邢台市 华北 4 4 4 12
276 GWBD-A2 新疆 昌吉回族自治州 西北西部 1 6 10 4 21 42
277 GWBD-A2 新疆 昌吉回族自治州 西北西部 3 11 11 20 45
278 GWBD-A2 内蒙古 通辽市 华北 2 11 3 16
279 GWBD-A2 内蒙古 通辽市 华北 2 2 4
280 GWBD-A2 内蒙古 通辽市 华北 2 2 1 5
281 GWBD-A2 内蒙古 通辽市 华北 1 1
282 GWBD-A2 内蒙古 通辽市 华北 4 5 6 5 20
283 GWBD-A2 内蒙古 通辽市 华北 2 2 4
284 GW99 新疆 乌鲁木齐市 西北西部 2 2
285 GW99 新疆 乌鲁木齐市 西北西部 3 3
286 GWBD-A3 河北 衡水市 华北 1 2 3 2 8
287 GWBD-A2 新疆 塔城地区 西北西部 10 8 16 11 5 50
288 GWBD-A2 黑龙江 绥化市 东北 3 2 5
289 GW93 天津 天津市 华北 4 4
290 GWBD-A2 内蒙古 兴安盟 东北 1 13 11 25
291 GWBD-A2 新疆 乌鲁木齐市 西北西部 2 3 5
292 GWBD-A3 山西 大同市 华北 3 6 10 5 24
293 GWBD-D 辽宁 朝阳市 东北 1 1
294 GW99A 辽宁 辽阳市 东北 2 2
295 GWBD-A2 辽宁 锦州市 东北 1 1
296 GW99 河北 张家口市 华北 1 1
297 GWBD-A3 河北 张家口市 华北 1 1
298 GW83.4 国际 国际 国际 3 3
299 GW93 内蒙古 锡林郭勒盟 华北 2 2
300 GWBD-A3 山东 德州市 华东南北部 4 4
301 GWBD-A3 河北 邢台市 华北 1 5 5 5 16
302 GWBD-A3 河北 邢台市 华北 4 4 8
303 GWBD-A3 河北 邢台市 华北 2 3 5
304 GWBD-A3 河北 邢台市 华北 1 1
305 GWBD-D 陕西 渭南市 华北 1 2 1 4
306 GW83.4 江苏 镇江市 华东南北部 1 1
307 GW99A 湖北 恩施土家族苗族自治州 华东南北部 1 4 3 3 2 13
308 GW99A 山东 聊城市 华东南北部 5 5 10
309 GW81 国际 国际 国际 1 1
310 GWBD-A3 河北 衡水市 华北 2 3 6 8 19
311 GWBD-A3 河北 衡水市 华北 4 3 4 3 2 16
312 GWBD-A2 新疆 乌鲁木齐市 西北西部 6 6
313 GW99A 天津 天津市 华北 4 2 6
314 GW99 天津 天津市 华北 1 1
315 GW93 内蒙古 兴安盟 东北 4 3 3 10
316 GW99A 河北 沧州市 华北 7 7
317 GWBD-D 河北 张家口市 华北 2 2
318 SI90.2 国际 国际 国际 10 10
319 GWBD-A3 河北 沧州市 华北 1 2 5 8
320 GWBD-A3 河北 邢台市 华北 2 4 6
321 GWBD-A2 新疆 哈密市 西北西部 2 4 6
322 GW81 国际 国际 国际 1 1
323 GW83.4 国际 国际 国际 1 1
324 GW99 新疆 乌鲁木齐市 西北西部 4 4 3 11
325 GWBD-A2 新疆 阿勒泰地区 西北西部 1 6 18 25
326 GWBD-A2 新疆 阿勒泰地区 西北西部 1 7 24 8 40
327 SI90.2 国际 国际 国际 1 1
328 GWBD-A2 内蒙古 鄂尔多斯市 华北 1 1
329 GW99A 河北 张家口市 华北 1 1 2
330 GWBD-D 辽宁 本溪市 东北 1 1
331 GW99 云南 曲靖市 华南 6 10 16
332 GW93 新疆 巴音郭楞蒙古自治州 西北西部 1 1
333 GW99 甘肃 酒泉市 西北东部 1 1
334 GW93 山东 济宁市 华东南北部 2 2
335 GW99 新疆 巴音郭楞蒙古自治州 西北西部 1 1
336 GWBD-A3 甘肃 庆阳市 西北东部 2 2
337 GW93 天津 天津市 华北 1 1
338 GWBD-A2 黑龙江 哈尔滨市 东北 2 2
339 GW83.4 国际 国际 国际 1 1
340 GW99A 贵州 铜仁市 华南 2 2 4
341 GWBD-A2 河北 张家口市 华北 2 2
342 GWBD-A2 河北 张家口市 华北 10 10
343 GWBD-A2 辽宁 朝阳市 东北 1 1
344 SI90.2 新疆 昌吉回族自治州 西北西部 1 1
345 GWBD-A2 新疆 昌吉回族自治州 西北西部 1 1
346 GW83.3 新疆 昌吉回族自治州 西北西部 1 1
347 GWBD-A2 青海 海西蒙古族藏族自治州 西北东部 4 4
348 GWBD-A2 山东 烟台市 华东南北部 1 1
349 GW99 内蒙古 通辽市 华北 1 1
350 GW99 内蒙古 锡林郭勒盟 华北 1 1

2620
data/distance_matrix.csv Normal file

File diff suppressed because it is too large Load Diff

29
data/factory_mapping.json Normal file
View File

@ -0,0 +1,29 @@
{
"艾郎玉门": "AilangYumen",
"艾郎张北": "AilangZhangbei",
"时代巴里坤": "ShidaiBalikun",
"时代百色": "ShidaiBaise",
"时代射阳": "ShidaiSheyang",
"时代松原": "ShidaiSongyuan",
"时代株洲": "ShidaiZhuzhou",
"双瑞大丰": "ShuangruiDafeng",
"双瑞东营": "ShuangruiDongying",
"天顺濮阳": "TianshunPuyang",
"天顺沙洋": "TianshunShayang",
"中材白城": "ZhongcaiBaicheng",
"中材阜宁": "ZhongcaiFuning",
"中材哈密": "ZhongcaiHami",
"中材邯郸": "ZhongcaiHandan",
"中材酒泉": "ZhongcaiJiuquan",
"中材连云港": "ZhongcaiLianyungang",
"中材萍乡": "ZhongcaiPingxiang",
"中材锡林": "ZhongcaiXilin",
"中材兴安盟": "ZhongcaiXinganmeng",
"中材阳江": "ZhongcaiYangjiang",
"中材伊吾": "ZhongcaiYiwu",
"中材玉溪": "ZhongcaiYuxi",
"重通昌吉": "ChongtongChangji",
"重通大安": "ChongtongDaan",
"重通如东": "ChongtongRudong",
"重通武威": "ChongtongWuwei"
}

34
data/ga_best_params.json Normal file
View File

@ -0,0 +1,34 @@
{
"best_score": 0.013780913115116374,
"month1": 235.2024236560018,
"month2": 80.13430957369465,
"month3": 40.81815120444523,
"month4": 35.573307322844045,
"factor_AilangYumen": 1.1209670325377996,
"factor_AilangZhangbei": 1.0869751796074336,
"factor_ShidaiBalikun": 1.064344356385733,
"factor_ShidaiBaise": 0.925644739081089,
"factor_ShidaiSheyang": 2.2354053357800834,
"factor_ShidaiSongyuan": 0.8850280359740502,
"factor_ShidaiZhuzhou": 0.8,
"factor_ShuangruiDafeng": 1.3485391587995974,
"factor_ShuangruiDongying": 1.4720254802974653,
"factor_TianshunPuyang": 1.1166692701637255,
"factor_TianshunShayang": 1.060367420503057,
"factor_ZhongcaiBaicheng": 1.8461095046937892,
"factor_ZhongcaiFuning": 1.3124938381864457,
"factor_ZhongcaiHami": 1.4843503931169255,
"factor_ZhongcaiHandan": 1.210604184057787,
"factor_ZhongcaiJiuquan": 0.9798174978126551,
"factor_ZhongcaiLianyungang": 1.6036280376162886,
"factor_ZhongcaiPingxiang": 1.132040522281658,
"factor_ZhongcaiXilin": 1.0297971770720127,
"factor_ZhongcaiXinganmeng": 0.9769716839603864,
"factor_ZhongcaiYangjiang": 2.386768108574698,
"factor_ZhongcaiYiwu": 1.2417395146436796,
"factor_ZhongcaiYuxi": 1.7093165019081604,
"factor_ChongtongChangji": 1.0895870479908367,
"factor_ChongtongDaan": 1.0187316107483142,
"factor_ChongtongRudong": 1.0270541553649646,
"factor_ChongtongWuwei": 0.8811374580269447
}

View File

@ -0,0 +1,5 @@
{
"best_score": 0.013780913115116374,
"factor_ZhongcaiBaicheng": 1.8461095046937892,
"factor_ZhongcaiHami": 1.4843503931169255
}

62
data/model_params.json Normal file
View File

@ -0,0 +1,62 @@
{
"holiday_days_1": 5,
"holiday_days_2": 12,
"holiday_days_3": 2,
"holiday_days_4": 2,
"holiday_days_5": 2,
"holiday_days_6": 2,
"holiday_days_7": 2,
"holiday_days_8": 2,
"holiday_days_9": 2,
"holiday_days_10": 7,
"holiday_days_11": 2,
"holiday_days_12": 2,
"month1": 235.2024236560018,
"month2": 80.13430957369465,
"month3": 40.81815120444523,
"month4": 35.573307322844045,
"factor_AilangYumen": 1.1209670325377996,
"factor_AilangZhangbei": 1.0869751796074336,
"factor_ShidaiBalikun": 1.064344356385733,
"factor_ShidaiBaise": 0.925644739081089,
"factor_ShidaiSheyang": 2.2354053357800834,
"factor_ShidaiSongyuan": 0.8850280359740502,
"factor_ShidaiZhuzhou": 0.8,
"factor_ShuangruiDafeng": 1.3485391587995974,
"factor_ShuangruiDongying": 1.4720254802974653,
"factor_TianshunPuyang": 1.1166692701637255,
"factor_TianshunShayang": 1.060367420503057,
"factor_ZhongcaiBaicheng": 1.8461095046937892,
"factor_ZhongcaiFuning": 1.3124938381864457,
"factor_ZhongcaiHami": 1.4843503931169255,
"factor_ZhongcaiHandan": 1.210604184057787,
"factor_ZhongcaiJiuquan": 0.9798174978126551,
"factor_ZhongcaiLianyungang": 1.6036280376162886,
"factor_ZhongcaiPingxiang": 1.132040522281658,
"factor_ZhongcaiXilin": 1.0297971770720127,
"factor_ZhongcaiXinganmeng": 0.9769716839603864,
"factor_ZhongcaiYangjiang": 2.386768108574698,
"factor_ZhongcaiYiwu": 1.2417395146436796,
"factor_ZhongcaiYuxi": 1.7093165019081604,
"factor_ChongtongChangji": 1.0895870479908367,
"factor_ChongtongDaan": 1.0187316107483142,
"factor_ChongtongRudong": 1.0270541553649646,
"factor_ChongtongWuwei": 0.8811374580269447,
"product_set": [
"GWBD-A2",
"GWBD-A3",
"SI90.2",
"GW99A",
"GW110.5",
"GW93",
"GW130",
"GW76",
"GW99",
"GW81",
"GW86",
"GWBD-D",
"SI122",
"GW83.3",
"GW83.4"
]
}

14
data/month_hours.json Normal file
View File

@ -0,0 +1,14 @@
{
"1": 31,
"2": 28,
"3": 31,
"4": 30,
"5": 31,
"6": 30,
"7": 31,
"8": 31,
"9": 30,
"10": 31,
"11": 30,
"12": 31
}

23
data/product.csv Normal file
View File

@ -0,0 +1,23 @@
平台,标准机型,叶片型号
GWH V20,GWH266-16.2,GW130
4S,155/4500,GW76
5S,165/5200,GW81
GWH V15,GWH170-7.2,GW83.3
GWH V11,171/5300,GW83.4
GWH V15,175/7800,GW86
GWH V12,204/6250H,GW99
GWH V12,204/6250H,GW99A
GWH V12,204/5600H,GW99A
GWH V17,GWH221-7,GWBD-A2
GWH V17,GWH221-8,GWBD-A2
GWH V17,GWH221-8.34,GWBD-A2
GWH V17,GWH221-11.1,GWBD-A2
GWH V17,GWH221-6,GWBD-A3
GWH V17,GWH221-6.7,GWBD-A3
GWH V19,GWH221-6,GWBD-A3
GWH V12,GWH204-5.0,GWBD-D
GWH V20,252/13600,SI122
GWH V12,182/7200H,SI90.2
GWH V12,191/4550H,GW93
GWH V12,191/6700H,GW93
GW110.5,GW110.5,GW110.5
1 平台 标准机型 叶片型号
2 GWH V20 GWH266-16.2 GW130
3 4S 155/4500 GW76
4 5S 165/5200 GW81
5 GWH V15 GWH170-7.2 GW83.3
6 GWH V11 171/5300 GW83.4
7 GWH V15 175/7800 GW86
8 GWH V12 204/6250H GW99
9 GWH V12 204/6250H GW99A
10 GWH V12 204/5600H GW99A
11 GWH V17 GWH221-7 GWBD-A2
12 GWH V17 GWH221-8 GWBD-A2
13 GWH V17 GWH221-8.34 GWBD-A2
14 GWH V17 GWH221-11.1 GWBD-A2
15 GWH V17 GWH221-6 GWBD-A3
16 GWH V17 GWH221-6.7 GWBD-A3
17 GWH V19 GWH221-6 GWBD-A3
18 GWH V12 GWH204-5.0 GWBD-D
19 GWH V20 252/13600 SI122
20 GWH V12 182/7200H SI90.2
21 GWH V12 191/4550H GW93
22 GWH V12 191/6700H GW93
23 GW110.5 GW110.5 GW110.5

View File

@ -0,0 +1,24 @@
产品型号,里程区间[公里], 平均单价[元/(公里*片)] , 平均整车价[元/片]
others,0-99,," 12,859.46 "
others,100-199,," 14,946.73 "
others,200-299,," 18,662.46 "
others,300-599, 52.83 ,
others,600-899, 38.36 ,
others,900-1199, 32.89 ,
others,1200-1499, 30.69 ,
others,1500-1999, 28.49 ,
others,2000-2499, 27.76 ,
others,2500-3499, 22.87 ,
others,3500-10000000, 21.02 ,
"GWBD-A2, GWBD-A3, GWBD-B",0-99,," 15,802.31 "
"GWBD-A2, GWBD-A3, GWBD-B",100-199,," 18,445.12 "
"GWBD-A2, GWBD-A3, GWBD-B",200-299,," 22,391.35 "
"GWBD-A2, GWBD-A3, GWBD-B",300-599, 62.29 ,
"GWBD-A2, GWBD-A3, GWBD-B",600-899, 44.75 ,
"GWBD-A2, GWBD-A3, GWBD-B",900-1199, 38.23 ,
"GWBD-A2, GWBD-A3, GWBD-B",1200-1499, 36.08 ,
"GWBD-A2, GWBD-A3, GWBD-B",1500-1999, 33.44 ,
"GWBD-A2, GWBD-A3, GWBD-B",2000-2499, 32.76 ,
"GWBD-A2, GWBD-A3, GWBD-B",2500-3499, 26.68 ,
"GWBD-A2, GWBD-A3, GWBD-B",3500-10000000, 24.27 ,
,,,
1 产品型号 里程区间[公里] 平均单价[元/(公里*片)] 平均整车价[元/片]
2 others 0-99 12,859.46
3 others 100-199 14,946.73
4 others 200-299 18,662.46
5 others 300-599 52.83
6 others 600-899 38.36
7 others 900-1199 32.89
8 others 1200-1499 30.69
9 others 1500-1999 28.49
10 others 2000-2499 27.76
11 others 2500-3499 22.87
12 others 3500-10000000 21.02
13 GWBD-A2, GWBD-A3, GWBD-B 0-99 15,802.31
14 GWBD-A2, GWBD-A3, GWBD-B 100-199 18,445.12
15 GWBD-A2, GWBD-A3, GWBD-B 200-299 22,391.35
16 GWBD-A2, GWBD-A3, GWBD-B 300-599 62.29
17 GWBD-A2, GWBD-A3, GWBD-B 600-899 44.75
18 GWBD-A2, GWBD-A3, GWBD-B 900-1199 38.23
19 GWBD-A2, GWBD-A3, GWBD-B 1200-1499 36.08
20 GWBD-A2, GWBD-A3, GWBD-B 1500-1999 33.44
21 GWBD-A2, GWBD-A3, GWBD-B 2000-2499 32.76
22 GWBD-A2, GWBD-A3, GWBD-B 2500-3499 26.68
23 GWBD-A2, GWBD-A3, GWBD-B 3500-10000000 24.27
24

22
demand_agent.py Normal file
View File

@ -0,0 +1,22 @@
from mesa.agent import Agent
class DemandAgent(Agent):
"""Demand agent holding monthly demand per city and product."""
def __init__(self, model, city, region, product_monthly_demand):
super().__init__(model)
self.city = city
self.region = region
# product_monthly_demand: {product: {month: demand_units}}
self.product_monthly_demand = product_monthly_demand
self.fulfilled = 0.0
self.total_demand = sum(sum(m.values()) for m in product_monthly_demand.values())
def step(self):
month = self.model.current_month
total = 0
for product, monthly in self.product_monthly_demand.items():
total += monthly.get(month, 0)
if total > 0:
self.model.record_demand(self.region, total)

103
environment.yml Normal file
View File

@ -0,0 +1,103 @@
name: gw
channels:
- defaults
- conda-forge
dependencies:
- python=3.13.9
- pip
- pip:
- altair==6.0.0
- anyio==4.11.0
- asttokens==3.0.1
- attrs==25.4.0
- cachetools==6.2.2
- certifi==2025.11.12
- chardet==5.2.0
- charset-normalizer==3.4.4
- click==8.3.1
- colorama==0.4.6
- comm==0.2.3
- contourpy==1.3.3
- cycler==0.12.1
- debugpy==1.8.17
- decorator==5.2.1
- et_xmlfile==2.0.0
- executing==2.2.1
- fastjsonschema==2.21.2
- filelock==3.20.0
- fonttools==4.60.1
- gurobipy==13.0.0
- h11==0.16.0
- humanize==4.14.0
- idna==3.11
- ipykernel==7.1.0
- ipython==9.7.0
- ipython_pygments_lexers==1.1.1
- ipyvue==1.11.3
- ipyvuetify==1.11.3
- ipywidgets==8.1.8
- jedi==0.19.2
- Jinja2==3.1.6
- jsonschema==4.25.1
- jsonschema-specifications==2025.9.1
- jupyter_client==8.6.3
- jupyter_core==5.9.1
- jupyterlab_widgets==3.0.16
- kiwisolver==1.4.9
- Markdown==3.10
- markdown-it-py==4.0.0
- MarkupSafe==3.0.3
- matplotlib==3.10.7
- matplotlib-inline==0.2.1
- mdurl==0.1.2
- Mesa==3.3.1
- narwhals==2.12.0
- nbformat==5.10.4
- nest-asyncio==1.6.0
- networkx==3.5
- numpy==2.3.5
- openpyxl==3.1.5
- packaging==25.0
- pandas==2.3.3
- parso==0.8.5
- pillow==12.0.0
- platformdirs==4.5.0
- prompt_toolkit==3.0.52
- psutil==7.1.3
- PuLP==3.3.0
- pure_eval==0.2.3
- Pygments==2.19.2
- pymdown-extensions==10.17.1
- pyparsing==3.2.5
- python-dateutil==2.9.0.post0
- pytz==2025.2
- PyYAML==6.0.3
- pyzmq==27.1.0
- reacton==1.9.1
- referencing==0.37.0
- requests==2.32.5
- rich==14.2.0
- rich-click==1.9.4
- rpds-py==0.29.0
- scipy==1.16.3
- setuptools==80.9.0
- six==1.17.0
- sniffio==1.3.1
- solara==1.54.0
- solara-server==1.54.0
- solara-ui==1.54.0
- stack-data==0.6.3
- starlette==0.50.0
- tornado==6.5.2
- tqdm==4.67.1
- traitlets==5.14.3
- typing_extensions==4.15.0
- tzdata==2025.2
- urllib3==2.5.0
- uvicorn==0.38.0
- watchdog==6.0.0
- watchfiles==1.1.1
- wcwidth==0.2.14
- websockets==15.0.1
- wheel==0.45.1
- widgetsnbextension==4.0.15

View File

@ -0,0 +1,117 @@
import json
import random
from pathlib import Path
from typing import List, Tuple
from simulation_model import SimulationModel
# Decision variables: two factory factors only
TARGET_FACTORIES = ["ZhongcaiBaicheng", "ZhongcaiHami"]
# Bounds
FACTOR_BOUNDS = (0.8, 3.0)
POP_SIZE = 20
GENERATIONS = 50
MUTATION_RATE = 0.2
MUTATION_STD = 0.05 # for factors
def clip(val: float, bounds: Tuple[float, float]) -> float:
lo, hi = bounds
return max(lo, min(hi, val))
def evaluate(genes: List[float]) -> float:
factory_factors = {fid: val for fid, val in zip(TARGET_FACTORIES, genes)}
model = SimulationModel(factory_factors=factory_factors, output_enabled=False)
while model.running:
model.step()
return model.mean_abs_error
def mutate(genes: List[float]) -> List[float]:
new = genes.copy()
for i in range(len(new)):
if random.random() < MUTATION_RATE:
jitter = random.gauss(0, MUTATION_STD)
new[i] = clip(new[i] + jitter, FACTOR_BOUNDS)
return new
def crossover(p1: List[float], p2: List[float]) -> Tuple[List[float], List[float]]:
point = random.randint(1, len(p1) - 1)
c1 = p1[:point] + p2[point:]
c2 = p2[:point] + p1[point:]
return c1, c2
def init_population() -> List[List[float]]:
pop = []
best_path = Path("data") / "ga_two_best_params.json"
seed_indiv = None
if best_path.exists():
try:
best = json.loads(best_path.read_text(encoding="utf-8"))
seed_indiv = [float(best.get(f"factor_{fid}", random.uniform(*FACTOR_BOUNDS))) for fid in TARGET_FACTORIES]
except Exception:
seed_indiv = None
for idx in range(POP_SIZE):
if seed_indiv is not None and idx == 0:
pop.append(seed_indiv)
continue
indiv = [random.uniform(*FACTOR_BOUNDS) for _ in TARGET_FACTORIES]
pop.append(indiv)
return pop
def main():
best_genes = None
best_score = float("inf")
population = init_population()
for gen in range(GENERATIONS):
scored = []
for indiv in population:
score = evaluate(indiv)
scored.append((score, indiv))
if score < best_score:
best_score = score
best_genes = indiv
scored.sort(key=lambda x: x[0])
next_pop = [scored[0][1], scored[1][1]]
while len(next_pop) < POP_SIZE:
parents = random.sample(scored[:max(3, len(scored))], 2)
c1, c2 = crossover(parents[0][1], parents[1][1])
next_pop.append(mutate(c1))
if len(next_pop) < POP_SIZE:
next_pop.append(mutate(c2))
population = next_pop
print(f"Generation {gen+1}: best={best_score:.4f}")
result = {}
for fid, val in zip(TARGET_FACTORIES, best_genes):
result[f"factor_{fid}"] = val
data_path = Path("data") / "ga_two_best_params.json"
prev_score = float("inf")
if data_path.exists():
try:
prev = json.loads(data_path.read_text(encoding="utf-8"))
prev_score = float(prev.get("best_score", float("inf")))
except Exception:
prev_score = float("inf")
if best_score < prev_score:
data_path.write_text(
json.dumps({"best_score": best_score, **result}, ensure_ascii=False, indent=2),
encoding="utf-8",
)
print(f"New best mean abs error: {best_score:.4f}, saved to {data_path}")
else:
print(f"Best mean abs error: {best_score:.4f} (not better than {prev_score:.4f}, not saved)")
if __name__ == "__main__":
main()

167
genetic_calibration.py Normal file
View File

@ -0,0 +1,167 @@
import json
import random
from pathlib import Path
from typing import List, Tuple
from simulation_model import SimulationModel
# Decision variables:
# - month1, month2, month3, month4 efficiencies (hour/blade)
# - factory-specific new-factory factors (from data/factory_mapping.json)
FACTORY_MAPPING = json.loads(Path("data/factory_mapping.json").read_text(encoding="utf-8"))
FACTORY_IDS = list(FACTORY_MAPPING.values())
# Bounds for genes: (min, max)
MONTH_BOUNDS = (30.0, 250.0)
FACTOR_BOUNDS = (0.8, 3.0)
POP_SIZE = 20
GENERATIONS = 200
MUTATION_RATE = 0.2
MUTATION_STD = 5.0 # hours for months; factors mutate separately
def clip(val: float, bounds: Tuple[float, float]) -> float:
lo, hi = bounds
return max(lo, min(hi, val))
def evaluate(genes: List[float]) -> float:
month1, month2, month3, month4 = genes[:4]
factor_genes = genes[4:]
factory_factors = {fid: val for fid, val in zip(FACTORY_IDS, factor_genes)}
try:
model = SimulationModel(
month1=month1,
month2=month2,
month3=month3,
month4=month4,
factory_factors=factory_factors,
output_enabled=False,
)
while model.running:
model.step()
return model.mean_abs_error
except PermissionError as e:
print(f"文件访问冲突: {e}. 正在重试...")
return float('inf') # 返回高值以惩罚该个体
except Exception as e:
print(f"发生错误: {e}")
return float('inf')
def mutate(genes: List[float]) -> List[float]:
new = genes.copy()
for i in range(len(new)):
if random.random() < MUTATION_RATE:
if i < 4:
new[i] = clip(new[i] + random.gauss(0, MUTATION_STD), MONTH_BOUNDS)
else:
jitter = random.gauss(0, 0.05)
new[i] = clip(new[i] + jitter, FACTOR_BOUNDS)
return new
def crossover(p1: List[float], p2: List[float]) -> Tuple[List[float], List[float]]:
point = random.randint(1, len(p1) - 1)
c1 = p1[:point] + p2[point:]
c2 = p2[:point] + p1[point:]
return c1, c2
def init_population() -> List[List[float]]:
pop = []
# Warm start from best params if available
best_path = Path("data") / "ga_best_params.json"
seed_indiv = None
if best_path.exists():
try:
best = json.loads(best_path.read_text(encoding="utf-8"))
seed_indiv = [
float(best.get("month1", random.uniform(*MONTH_BOUNDS))),
float(best.get("month2", random.uniform(*MONTH_BOUNDS))),
float(best.get("month3", random.uniform(*MONTH_BOUNDS))),
float(best.get("month4", random.uniform(*MONTH_BOUNDS))),
]
for fid in FACTORY_IDS:
seed_indiv.append(float(best.get(f"factor_{fid}", random.uniform(*FACTOR_BOUNDS))))
except Exception:
seed_indiv = None
for _ in range(POP_SIZE):
if seed_indiv is not None and _ == 0:
indiv = seed_indiv
else:
indiv = [
random.uniform(*MONTH_BOUNDS),
random.uniform(*MONTH_BOUNDS),
random.uniform(*MONTH_BOUNDS),
random.uniform(*MONTH_BOUNDS),
]
indiv += [random.uniform(*FACTOR_BOUNDS) for _ in FACTORY_IDS]
pop.append(indiv)
return pop
def main():
best_genes = None
best_score = float("inf")
population = init_population()
for gen in range(GENERATIONS):
scored = []
for indiv in population:
score = evaluate(indiv)
scored.append((score, indiv))
if score < best_score:
best_score = score
best_genes = indiv
scored.sort(key=lambda x: x[0])
# Elitism: keep top 2
next_pop = [scored[0][1], scored[1][1]]
# Fill rest via crossover + mutation
while len(next_pop) < POP_SIZE:
parents = random.sample(scored[:10], 2)
c1, c2 = crossover(parents[0][1], parents[1][1])
next_pop.append(mutate(c1))
if len(next_pop) < POP_SIZE:
next_pop.append(mutate(c2))
population = next_pop
print(f"Generation {gen+1}: best={best_score:.4f}")
# Save best parameters
result = {
"month1": best_genes[0],
"month2": best_genes[1],
"month3": best_genes[2],
"month4": best_genes[3],
}
for fid, val in zip(FACTORY_IDS, best_genes[4:]):
result[f"factor_{fid}"] = val
out_path = Path("output") / "ga_best_params.json"
data_path = Path("data") / "ga_best_params.json"
data_path.parent.mkdir(exist_ok=True)
# Only overwrite if better
if data_path.exists():
try:
prev = json.loads(data_path.read_text(encoding="utf-8"))
prev_score = float(prev.get("best_score", float("inf")))
except Exception:
prev_score = float("inf")
else:
prev_score = float("inf")
if best_score < prev_score:
data_path.write_text(
json.dumps({"best_score": best_score, **result}, ensure_ascii=False, indent=2),
encoding="utf-8",
)
print(f"New best mean abs error: {best_score:.4f}, saved to {data_path}")
else:
print(f"Best mean abs error: {best_score:.4f} (not better than {prev_score:.4f}, not saved)")
if __name__ == "__main__":
main()

64
production_line.py Normal file
View File

@ -0,0 +1,64 @@
from mesa.agent import Agent
class ProductionLineAgent(Agent):
"""A production line agent with basic production scheduling."""
def __init__(self, model, line_id, region, factory, is_new_factory, schedule, ramp_ranges):
super().__init__(model)
self.line_id = line_id
self.region = region
self.factory = factory
self.is_new_factory = is_new_factory
# List of dicts: {"product": str, "start_month": int, "end_month": int}
self.schedule = schedule
# ramp_ranges: {1: value, 2: value, 3: value, 4: value}
self.ramp_ranges = ramp_ranges
self.blade_stock = {} # 临时叶片库存 {product: blades not yet assembled}
self.unit_stock = {} # 叶片机组库存 {product: assembled units}
def _sample_cycle_hours(self, product, month_index):
idx = min(max(month_index, 1), 4)
base = self.ramp_ranges[idx]
factor = self.model.get_factory_factor(self.factory)
return base * factor
def step(self):
month = self.model.current_month
available_hours = self.model.get_available_hours(month)
active = [
entry for entry in self.schedule if entry["start_month"] <= month <= entry["end_month"]
]
if not active:
return
# If multiple entries overlap, take the first one in the list.
task = active[0]
product = task["product"]
if not self.is_new_factory:
cycle_hours = self._sample_cycle_hours(product, 4)
else:
if task["start_month"] == 1:
month_index = 4
else:
month_index = month - task["start_month"] + 1
cycle_hours = self._sample_cycle_hours(product, month_index)
produced_blades = available_hours / cycle_hours
# Update blade and unit inventories
current_blades = self.blade_stock.get(product, 0) + produced_blades
units_to_add = int(current_blades // 3)
remaining_blades = current_blades - units_to_add * 3
if units_to_add > 0:
self.unit_stock[product] = self.unit_stock.get(product, 0) + units_to_add
self.blade_stock[product] = remaining_blades
self.model.record_production(
line_id=self.line_id,
factory=self.factory,
region=self.region,
month=month,
product=product,
units=units_to_add,
)

173
schedule_pulp.py Normal file
View File

@ -0,0 +1,173 @@
# -*- coding: utf-8 -*-
import pandas as pd
import pulp
from math import radians, sin, cos, sqrt, atan2
# 1. 读取数据
inventory_df = pd.read_excel('可调拨库存表.xlsx')
factory_loc_df = pd.read_excel('工厂位置.xlsx')
demand_df = pd.read_excel('需求表.xlsx') # 型号、市、需求
city_loc_df = pd.read_excel('地名经纬度.xlsx') # 市、经度、纬度
# 2. 数据合并
inventory_df['可调拨库存'] = pd.to_numeric(inventory_df['可调拨库存'], errors='coerce').fillna(0)
demand_df['需求'] = pd.to_numeric(demand_df['需求'], errors='coerce').fillna(0)
# 工厂库存合并
factory_capacity = {}
for _, row in inventory_df.groupby(['工厂', '型号'])['可调拨库存'].sum().reset_index().iterrows():
f, p, cap = row['工厂'], row['型号'], int(row['可调拨库存'])
if cap > 0:
factory_capacity.setdefault(f, {})[p] = cap
# 城市需求合并
city_demand = {}
for _, row in demand_df.iterrows():
city, p, dem = row[''], row['型号'], int(row['需求'])
if dem > 0:
city_demand.setdefault(city, {})
city_demand[city][p] = city_demand[city].get(p, 0) + dem
factory_lonlat = dict(zip(factory_loc_df['工厂'], zip(factory_loc_df['经度'], factory_loc_df['纬度'])))
city_lonlat = dict(zip(city_loc_df[''], zip(city_loc_df['经度'], city_loc_df['纬度'])))
# missing = set(city_demand) - set(city_lonlat)
# if missing:
# raise ValueError(f"缺少经纬度:{missing}")
# 3. 距离
dist = {}
for f in factory_capacity:
for c in city_demand:
lon1, lat1 = factory_lonlat[f]
lon2, lat2 = city_lonlat[c]
dlon = radians(lon2-lon1)
dlat = radians(lat2-lat1)
a = sin(dlat/2)**2 + cos(radians(lat1))*cos(radians(lat2))*sin(dlon/2)**2
dist[(f,c)] = 6371 * 2 * atan2(sqrt(a), sqrt(1-a))
# 4. 单位运费函数
def get_real_unit_cost(distance_km, product):
d = distance_km
p = str(product).strip()
if p in ['GWBD-A2', 'GWBD-A3', 'GWBD-B']:
if distance_km <= 100:
return 15802.31
elif distance_km <= 200:
return 18445.12
elif distance_km <= 300:
return 22391.35
elif distance_km <= 600:
return 62.29 * d
elif distance_km <= 900:
return 44.75 * d
elif distance_km <= 1200:
return 38.23 * d
elif distance_km <= 1500:
return 36.08 * d
elif distance_km <= 2000:
return 33.44 * d
elif distance_km <= 2500:
return 32.76 * d
elif distance_km <= 3500:
return 26.68 * d
else:
return 24.27
# 其他型号用第二套
else:
if distance_km <= 100:
return 12859.46
elif distance_km <= 200:
return 14946.73
elif distance_km <= 300:
return 18662.46
elif distance_km <= 600:
return 52.83 * d
elif distance_km <= 900:
return 38.36 * d
elif distance_km <= 1200:
return 32.89 * d
elif distance_km <= 1500:
return 30.69 * d
elif distance_km <= 2000:
return 28.49 * d
elif distance_km <= 2500:
return 27.76 * d
elif distance_km <= 3500:
return 22.87 * d
else:
return 21.02 * d
# 5. 规划模型
prob = pulp.LpProblem("最小化运费", pulp.LpMinimize)
x = {}
for f in factory_capacity:
for p in factory_capacity[f]:
for city in city_demand:
if city_demand[city].get(p, 0) > 0:
x[(f,city,p)] = pulp.LpVariable(f"ship_{f}_{city}_{p}", lowBound=0, cat="Integer")
# 缺货惩罚
shortage = {(city,p): pulp.LpVariable(f"short_{city}_{p}", lowBound=0, cat="Continuous")
for city in city_demand for p in city_demand[city]}
BIG_M = 1e10
prob += pulp.lpSum(
x[k] * get_real_unit_cost(dist[(k[0],k[1])], k[2]) # 真实单位运费
for k in x
) + pulp.lpSum(BIG_M * s for s in shortage.values())
# 库存硬约束
for f in factory_capacity:
for p in factory_capacity[f]:
prob += pulp.lpSum(x.get((f,c,p), 0) for c in city_demand) <= factory_capacity[f][p]
# 需求软约束
for city in city_demand:
for p, dem in city_demand[city].items():
prob += pulp.lpSum(x.get((f,city,p), 0) for f in factory_capacity) + shortage[(city,p)] >= dem
# 6. 求解
status = prob.solve(pulp.PULP_CBC_CMD(msg=True, timeLimit=600))
print(f"\n求解状态: {pulp.LpStatus[status]}")
if status != 1:
print("无解(请检查总库存)")
else:
print("有解")
# real_cost = pulp.value(prob.objective)
# print(f"实际运输总费用: {real_cost:,.2f} 元")
# ====================== 7. 输出 ======================
result = []
for (f,city,p), var in x.items():
q = int(pulp.value(var) or 0)
if q >= 1:
d = dist[(f,city)]
# unit = get_real_unit_cost(d, p)
result.append({
"工厂": f,
"型号": p,
"需求方": city,
"调拨数量": q,
# "距离_km": round(d, 1),
# "真实单位运费": round(unit, 3),
# "总运费": round(q * unit, 2)
})
df = pd.DataFrame(result)
if not df.empty:
df = df.sort_values(["工厂", "型号"]) # 按单位运费排序
df[["工厂","型号","需求方","调拨数量"]].to_excel("调拨方案.xlsx", index=False)
# print("\n调拨方案已保存真实单位运费最优优先满足单价更低的城市")
# print(df[["工厂","型号","需求方","调拨数量"]].to_string(index=False))
else:
print("\n无调拨记录")
# 校验报告
# print("\n各城市需求满足情况")
# for city in city_demand:
# for p, dem in city_demand[city].items():
# sup = sum(r["调拨数量"] for r in result if r["需求方"]==city and r["型号"]==p)
# print(f" {city} | {p}: 需求 {dem} → 调拨 {sup} → {'完美' if sup==dem else '异常'}")

1054
simulation_model.py Normal file

File diff suppressed because it is too large Load Diff