commit e4c411bbe2be6558b6163cc38fb7027318c6b83f Author: Zyy554 Date: Sun Nov 30 00:44:13 2025 +0800 first diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b0bf4c7 --- /dev/null +++ b/.gitignore @@ -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 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..b09cd78 --- /dev/null +++ b/LICENSE @@ -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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f625fe0 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# gw + diff --git a/app.py b/app.py new file mode 100644 index 0000000..0ed1711 --- /dev/null +++ b/app.py @@ -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() diff --git a/build_distance_matrix.py b/build_distance_matrix.py new file mode 100644 index 0000000..6b629ee --- /dev/null +++ b/build_distance_matrix.py @@ -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() diff --git a/data/DemandLocation.csv b/data/DemandLocation.csv new file mode 100644 index 0000000..c2f48c4 --- /dev/null +++ b/data/DemandLocation.csv @@ -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 \ No newline at end of file diff --git a/data/FactoryLocation.csv b/data/FactoryLocation.csv new file mode 100644 index 0000000..2946f2d --- /dev/null +++ b/data/FactoryLocation.csv @@ -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 diff --git a/data/ProductionLine.csv b/data/ProductionLine.csv new file mode 100644 index 0000000..7cfb596 --- /dev/null +++ b/data/ProductionLine.csv @@ -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 diff --git a/data/ProductionLine未修改.csv b/data/ProductionLine未修改.csv new file mode 100644 index 0000000..e8071c1 --- /dev/null +++ b/data/ProductionLine未修改.csv @@ -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 diff --git a/data/benchmark.csv b/data/benchmark.csv new file mode 100644 index 0000000..d63a91c --- /dev/null +++ b/data/benchmark.csv @@ -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 diff --git a/data/benchmark未修改.csv b/data/benchmark未修改.csv new file mode 100644 index 0000000..fd87df1 --- /dev/null +++ b/data/benchmark未修改.csv @@ -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 diff --git a/data/demand.csv b/data/demand.csv new file mode 100644 index 0000000..a632441 --- /dev/null +++ b/data/demand.csv @@ -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,ɽ,ij,ϱ,,,,,,,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,ɽ,ij,ϱ,,,,,,,,,,,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 diff --git a/data/distance_matrix.csv b/data/distance_matrix.csv new file mode 100644 index 0000000..f6ec1ce --- /dev/null +++ b/data/distance_matrix.csv @@ -0,0 +1,2620 @@ +demand_city,factory,distance_km +三门峡市,艾郎玉门,1442.890593116979 +三门峡市,艾郎张北,765.2622514657135 +三门峡市,时代巴里坤,1881.7548862366577 +三门峡市,时代百色,1248.8488342913306 +三门峡市,时代射阳,748.8522991316296 +三门峡市,时代松原,1487.018837789981 +三门峡市,时代株洲,765.9534531618256 +三门峡市,双瑞大丰,833.2479872535723 +三门峡市,双瑞东营,625.7219813670014 +三门峡市,天顺濮阳,343.6114400301472 +三门峡市,天顺沙洋,375.3780831437368 +三门峡市,中材白城,1600.1865045881289 +三门峡市,中材阜宁,760.7308490372347 +三门峡市,中材哈密,1881.7548862366577 +三门峡市,中材邯郸,220.5912321462811 +三门峡市,中材酒泉,1442.890593116979 +三门峡市,中材连云港,692.216729348848 +三门峡市,中材萍乡,801.4682063057426 +三门峡市,中材锡林,1145.346029370268 +三门峡市,中材兴安盟,1540.3945101501079 +三门峡市,中材阳江,1513.2705461697892 +三门峡市,中材伊吾,1881.7548862366577 +三门峡市,中材玉溪,1621.6763373533258 +三门峡市,重通昌吉,2117.3850654103912 +三门峡市,重通大安,1600.1865045881289 +三门峡市,重通如东,865.3038056796896 +三门峡市,重通武威,842.0025228356114 +中卫市,艾郎玉门,723.7569819333735 +中卫市,艾郎张北,955.8766172827887 +中卫市,时代巴里坤,1179.305858728395 +中卫市,时代百色,1446.7234880232695 +中卫市,时代射阳,1452.6349279067822 +中卫市,时代松原,1781.4325193265076 +中卫市,时代株洲,1347.6592770411316 +中卫市,双瑞大丰,1536.3852778712549 +中卫市,双瑞东营,1223.475259353332 +中卫市,天顺濮阳,976.2087146517671 +中卫市,天顺沙洋,1016.8401597897979 +中卫市,中材白城,1855.4136564749424 +中卫市,中材阜宁,1453.7710558921597 +中卫市,中材哈密,1179.305858728395 +中卫市,中材邯郸,811.9655475790059 +中卫市,中材酒泉,723.7569819333735 +中卫市,中材连云港,1374.7695737916365 +中卫市,中材萍乡,1406.4028325619681 +中卫市,中材锡林,1185.773231047536 +中卫市,中材兴安盟,1745.781433719702 +中卫市,中材阳江,1972.2991291023745 +中卫市,中材伊吾,1179.305858728395 +中卫市,中材玉溪,1611.5697456987018 +中卫市,重通昌吉,1411.6903530790141 +中卫市,重通大安,1855.4136564749424 +中卫市,重通如东,1581.2728045240863 +中卫市,重通武威,188.35708944837768 +乌兰察布市,艾郎玉门,1293.0778186223836 +乌兰察布市,艾郎张北,169.9938524084618 +乌兰察布市,时代巴里坤,1585.3863763235483 +乌兰察布市,时代百色,2026.7014713659946 +乌兰察布市,时代射阳,1130.7873474420112 +乌兰察布市,时代松原,929.1822937802242 +乌兰察布市,时代株洲,1560.1763797824697 +乌兰察布市,双瑞大丰,1192.8797477361338 +乌兰察布市,双瑞东营,755.9560340856113 +乌兰察布市,天顺濮阳,709.7764616929738 +乌兰察布市,天顺沙洋,1171.4146181952945 +乌兰察布市,中材白城,995.513876975385 +乌兰察布市,中材阜宁,1096.6874949704081 +乌兰察布市,中材哈密,1585.3863763235483 +乌兰察布市,中材邯郸,651.9875681720987 +乌兰察布市,中材酒泉,1293.0778186223836 +乌兰察布市,中材连云港,1010.9145763650425 +乌兰察布市,中材萍乡,1583.3228307272257 +乌兰察布市,中材锡林,353.5704952340723 +乌兰察布市,中材兴安盟,884.7357064301412 +乌兰察布市,中材阳江,2321.3078450564135 +乌兰察布市,中材伊吾,1585.3863763235483 +乌兰察布市,中材玉溪,2330.8084826730405 +乌兰察布市,重通昌吉,1807.8325773989175 +乌兰察布市,重通大安,995.513876975385 +乌兰察布市,重通如东,1285.9999897334785 +乌兰察布市,重通武威,790.3313340568461 +乌鲁木齐市,艾郎玉门,783.7139435938645 +乌鲁木齐市,艾郎张北,2146.7239511677026 +乌鲁木齐市,时代巴里坤,399.62532397691643 +乌鲁木齐市,时代百色,2650.768981188978 +乌鲁木齐市,时代射阳,2923.3440908123625 +乌鲁木齐市,时代松原,2798.486413568736 +乌鲁木齐市,时代株洲,2818.072717167557 +乌鲁木齐市,双瑞大丰,3004.265765738287 +乌鲁木齐市,双瑞东营,2629.5827680718357 +乌鲁木齐市,天顺濮阳,2430.7123920960917 +乌鲁木齐市,天顺沙洋,2517.8510883355125 +乌鲁木齐市,中材白城,2805.763302282923 +乌鲁木齐市,中材阜宁,2914.3427817153424 +乌鲁木齐市,中材哈密,399.62532397691643 +乌鲁木齐市,中材邯郸,2275.412371230699 +乌鲁木齐市,中材酒泉,783.7139435938645 +乌鲁木齐市,中材连云港,2829.5249895052307 +乌鲁木齐市,中材萍乡,2883.5852686470894 +乌鲁木齐市,中材锡林,2110.4062709215273 +乌鲁木齐市,中材兴安盟,2659.923484614757 +乌鲁木齐市,中材阳江,3324.2352308013883 +乌鲁木齐市,中材伊吾,399.62532397691643 +乌鲁木齐市,中材玉溪,2544.2530918590937 +乌鲁木齐市,重通昌吉,223.34671625449246 +乌鲁木齐市,重通大安,2805.763302282923 +乌鲁木齐市,重通如东,3063.109180697877 +乌鲁木齐市,重通武威,1390.3481064155308 +佳木斯市,艾郎玉门,2895.3414333192513 +佳木斯市,艾郎张北,1587.6932138926886 +佳木斯市,时代巴里坤,3051.2533770632745 +佳木斯市,时代百色,3432.100933188979 +佳木斯市,时代射阳,1868.8641683190242 +佳木斯市,时代松原,760.1085909321877 +佳木斯市,时代株洲,2712.7874231029305 +佳木斯市,双瑞大丰,1845.8280367931854 +佳木斯市,双瑞东营,1661.1900043203898 +佳木斯市,天顺濮阳,1907.3159862097027 +佳木斯市,天顺沙洋,2430.951373256423 +佳木斯市,中材白城,684.9871218834866 +佳木斯市,中材阜宁,1810.7961461090206 +佳木斯市,中材哈密,3051.2533770632745 +佳木斯市,中材邯郸,2004.4226380071661 +佳木斯市,中材酒泉,2895.3414333192513 +佳木斯市,中材连云港,1793.2937898672412 +佳木斯市,中材萍乡,2689.822132719369 +佳木斯市,中材锡林,1398.303345358941 +佳木斯市,中材兴安盟,810.9384324428005 +佳木斯市,中材阳江,3427.247708629352 +佳木斯市,中材伊吾,3051.2533770632745 +佳木斯市,中材玉溪,3843.7288819092573 +佳木斯市,重通昌吉,3227.8206982111165 +佳木斯市,重通大安,684.9871218834866 +佳木斯市,重通如东,1942.1761129665813 +佳木斯市,重通武威,2466.697043794504 +兴安盟,艾郎玉门,2086.3610724372484 +兴安盟,艾郎张北,819.9360738883307 +兴安盟,时代巴里坤,2265.2880365777305 +兴安盟,时代百色,2786.9768635535925 +兴安盟,时代射阳,1418.6839198750342 +兴安盟,时代松原,211.95651523489383 +兴安盟,时代株洲,2159.0520136920927 +兴安盟,双瑞大丰,1431.5591144813127 +兴安盟,双瑞东营,1094.5144374506842 +兴安盟,天顺濮阳,1271.741002672959 +兴安盟,天顺沙洋,1817.6888216409718 +兴安盟,中材白城,148.4919462157313 +兴安盟,中材阜宁,1361.7589889285973 +兴安盟,中材哈密,2265.2880365777305 +兴安盟,中材邯郸,1324.9478237445999 +兴安盟,中材酒泉,2086.3610724372484 +兴安盟,中材连云港,1309.683027967939 +兴安盟,中材萍乡,2154.951593514069 +兴安盟,中材锡林,587.3759263493329 +兴安盟,中材兴安盟,0.0 +兴安盟,中材阳江,2920.0479212736914 +兴安盟,中材伊吾,2265.2880365777305 +兴安盟,中材玉溪,3151.3761903501445 +兴安盟,重通昌吉,2454.4241586282587 +兴安盟,重通大安,148.4919462157313 +兴安盟,重通如东,1541.3023269799423 +兴安盟,重通武威,1662.7554426761665 +南阳市,艾郎玉门,1683.3741360067652 +南阳市,艾郎张北,967.1712338554739 +南阳市,时代巴里坤,2132.168586454411 +南阳市,时代百色,1124.0185764277812 +南阳市,时代射阳,621.1444995357762 +南阳市,时代松原,1601.5524272672078 +南阳市,时代株洲,517.6568883145402 +南阳市,双瑞大丰,700.2496280739196 +南阳市,双瑞东营,649.415353020688 +南阳市,天顺濮阳,413.64036774242396 +南阳市,天顺沙洋,134.39389593612972 +南阳市,中材白城,1724.7832256833894 +南阳市,中材阜宁,651.9837077527758 +南阳市,中材哈密,2132.168586454411 +南阳市,中材邯郸,393.6156551106594 +南阳市,中材酒泉,1683.3741360067652 +南阳市,中材连云港,607.9739997996558 +南阳市,中材萍乡,544.1142322975455 +南阳市,中材锡林,1354.8202832694155 +南阳市,中材兴安盟,1684.9231238821578 +南阳市,中材阳江,1282.2535187935227 +南阳市,中材伊吾,2132.168586454411 +南阳市,中材玉溪,1552.9674861930737 +南阳市,重通昌吉,2366.755263136153 +南阳市,重通大安,1724.7832256833894 +南阳市,重通如东,700.9556175733859 +南阳市,重通武威,1094.1518548130305 +吐鲁番地区,艾郎玉门,772.4949907372046 +吐鲁番地区,艾郎张北,2157.0531010746067 +吐鲁番地区,时代巴里坤,421.14635887547763 +吐鲁番地区,时代百色,2610.9453317060475 +吐鲁番地区,时代射阳,2918.1664006332544 +吐鲁番地区,时代松原,2821.37369622463 +吐鲁番地区,时代株洲,2794.219346708521 +吐鲁番地区,双瑞大丰,2999.5925897636916 +吐鲁番地区,双瑞东营,2630.233250691597 +吐鲁番地区,天顺濮阳,2426.3665070005686 +吐鲁番地区,天顺沙洋,2499.7885427534266 +吐鲁番地区,中材白城,2831.503619062989 +吐鲁番地区,中材阜宁,2910.449587035743 +吐鲁番地区,中材哈密,421.14635887547763 +吐鲁番地区,中材邯郸,2269.6400217575533 +吐鲁番地区,中材酒泉,772.4949907372046 +吐鲁番地区,中材连云港,2826.148912093711 +吐鲁番地区,中材萍乡,2860.4932836089997 +吐鲁番地区,中材锡林,2131.8199750692024 +吐鲁番地区,中材兴安盟,2686.2895682314897 +吐鲁番地区,中材阳江,3289.456939786736 +吐鲁番地区,中材伊吾,421.14635887547763 +吐鲁番地区,中材玉溪,2495.831672799881 +吐鲁番地区,重通昌吉,271.9509306379727 +吐鲁番地区,重通大安,2831.503619062989 +吐鲁番地区,重通如东,3056.4480090340044 +吐鲁番地区,重通武威,1382.6335569788741 +吴忠市,艾郎玉门,829.9696884005183 +吴忠市,艾郎张北,805.5757099440992 +吴忠市,时代巴里坤,1265.9933319229121 +吴忠市,时代百色,1482.910138111833 +吴忠市,时代射阳,1323.1262678522492 +吴忠市,时代松原,1632.7515710855557 +吴忠市,时代株洲,1295.1003977497267 +吴忠市,双瑞大丰,1406.1079220692402 +吴忠市,双瑞东营,1077.835099225897 +吴忠市,天顺濮阳,839.0091522430324 +吴忠市,天顺沙洋,940.9511872353916 +吴忠市,中材白城,1709.6517923892836 +吴忠市,中材阜宁,1320.825032641388 +吴忠市,中材哈密,1265.9933319229121 +吴忠市,中材邯郸,676.4993483688461 +吴忠市,中材酒泉,829.9696884005183 +吴忠市,中材连云港,1239.798835832909 +吴忠市,中材萍乡,1348.4724620970842 +吴忠市,中材锡林,1052.7483178472537 +吴忠市,中材兴安盟,1603.2175817172708 +吴忠市,中材阳江,1959.3414758049619 +吴忠市,中材伊吾,1265.9933319229121 +吴忠市,中材玉溪,1691.224963633658 +吴忠市,重通昌吉,1501.3937641404161 +吴忠市,重通大安,1709.6517923892836 +吴忠市,重通如东,1456.7678106162339 +吴忠市,重通武威,226.5113924363631 +哈密市,艾郎玉门,473.8542775808841 +哈密市,艾郎张北,1751.0960395892953 +哈密市,时代巴里坤,0.0 +哈密市,时代百色,2451.1707573197123 +哈密市,时代射阳,2555.315223982395 +哈密市,时代松原,2400.5633196971235 +哈密市,时代株洲,2520.3427334851413 +哈密市,双瑞大丰,2634.7225720141496 +哈密市,双瑞东营,2248.3422348080126 +哈密市,天顺濮阳,2061.8511140405 +哈密市,天顺沙洋,2195.785062369379 +哈密市,中材白城,2410.396061568036 +哈密市,中材阜宁,2542.9913119873663 +哈密市,中材哈密,0.0 +哈密市,中材邯郸,1911.1081435115389 +哈密市,中材酒泉,473.8542775808841 +哈密市,中材连云港,2457.062416624724 +哈密市,中材萍乡,2581.790497757839 +哈密市,中材锡林,1711.5725740673845 +哈密市,中材兴安盟,2265.2880365777305 +哈密市,中材阳江,3084.2318557276553 +哈密市,中材伊吾,0.0 +哈密市,中材玉溪,2419.3095323582647 +哈密市,重通昌吉,236.29125721418396 +哈密市,重通大安,2410.396061568036 +哈密市,重通如东,2698.8183135492827 +哈密市,重通武威,1039.7816221736266 +哈尔滨市,艾郎玉门,2556.276689115607 +哈尔滨市,艾郎张北,1228.1885820864668 +哈尔滨市,时代巴里坤,2736.228170962236 +哈尔滨市,时代百色,3092.7037813490224 +哈尔滨市,时代射阳,1569.1986308930193 +哈尔滨市,时代松原,400.43203629851365 +哈尔滨市,时代株洲,2393.50123950999 +哈尔滨市,双瑞大丰,1556.2668731306605 +哈尔滨市,双瑞东营,1328.2263008078821 +哈尔滨市,天顺濮阳,1563.1447438532368 +哈尔滨市,天顺沙洋,2095.1113475456536 +哈尔滨市,中材白城,334.2248378766438 +哈尔滨市,中材阜宁,1510.36210014572 +哈尔滨市,中材哈密,2736.228170962236 +哈尔滨市,中材邯郸,1653.1978089715478 +哈尔滨市,中材酒泉,2556.276689115607 +哈尔滨市,中材连云港,1482.9554464730923 +哈尔滨市,中材萍乡,2375.5233321425453 +哈尔滨市,中材锡林,1054.3728456888982 +哈尔滨市,中材兴安盟,472.535280352757 +哈尔滨市,中材阳江,3125.0330102312564 +哈尔滨市,中材伊吾,2736.228170962236 +哈尔滨市,中材玉溪,3494.859037842051 +哈尔滨市,重通昌吉,2922.3783099740103 +哈尔滨市,重通大安,334.2248378766438 +哈尔滨市,重通如东,1658.5533136074944 +哈尔滨市,重通武威,2111.828424650487 +商丘市,艾郎玉门,1736.4337940171545 +商丘市,艾郎张北,750.7736429174705 +商丘市,时代巴里坤,2156.4227777167343 +商丘市,时代百色,1417.678082106511 +商丘市,时代射阳,422.0332692260962 +商丘市,时代松原,1314.5873954733966 +商丘市,时代株洲,754.1031424823578 +商丘市,双瑞大丰,506.3973281326667 +商丘市,双瑞东营,355.33184742971883 +商丘市,天顺濮阳,154.1429208766472 +商丘市,天顺沙洋,417.89769357611743 +商丘市,中材白城,1440.3784534057872 +商丘市,中材阜宁,431.01410820631855 +商丘市,中材哈密,2156.4227777167343 +商丘市,中材邯郸,250.25149387133382 +商丘市,中材酒泉,1736.4337940171545 +商丘市,中材连云港,363.0666120818565 +商丘市,中材萍乡,758.6309723827819 +商丘市,中材锡林,1133.894024849994 +商丘市,中材兴安盟,1408.7835742270936 +商丘市,中材阳江,1522.373243459257 +商丘市,中材伊吾,2156.4227777167343 +商丘市,中材玉溪,1844.8199341732793 +商丘市,重通昌吉,2392.6958047529124 +商丘市,重通大安,1440.3784534057872 +商丘市,重通如东,549.3074554516527 +商丘市,重通武威,1125.9352334284392 +国际,艾郎玉门,404.3321804624293 +国际,艾郎张北,1159.5458905161288 +国际,时代巴里坤,868.4336379875789 +国际,时代百色,1654.0919394284292 +国际,时代射阳,1764.203388579069 +国际,时代松原,1958.5427489770389 +国际,时代株洲,1651.9097145162734 +国际,双瑞大丰,1847.336476323899 +国际,双瑞东营,1512.71423320764 +国际,天顺濮阳,1280.1419006756387 +国际,天顺沙洋,1333.8966802128807 +国际,中材白城,2015.1236886962172 +国际,中材阜宁,1762.2539419574641 +国际,中材哈密,868.4336379875789 +国际,中材邯郸,1117.9168950747699 +国际,中材酒泉,404.3321804624293 +国际,中材连云港,1681.124394488488 +国际,中材萍乡,1713.5756370725423 +国际,中材锡林,1307.7140385009225 +国际,中材兴安盟,1891.5140223505682 +国际,中材阳江,2237.7534302971176 +国际,中材伊吾,868.4336379875789 +国际,中材玉溪,1734.3726887111159 +国际,重通昌吉,1097.5301309101476 +国际,重通大安,2015.1236886962172 +国际,重通如东,1896.3788744908836 +国际,重通武威,251.15523381186023 +塔城地区,艾郎玉门,1180.1301678885043 +塔城地区,艾郎张北,2415.4609964452297 +塔城地区,时代巴里坤,719.036191355024 +塔城地区,时代百色,3101.9071024935156 +塔城地区,时代射阳,3263.9958820556803 +塔城地区,时代松原,2978.0110818399535 +塔城地区,时代株洲,3232.1263200618023 +塔城地区,双瑞大丰,3342.050790185214 +塔城地区,双瑞东营,2944.252705220397 +塔城地区,天顺濮阳,2771.206648548699 +塔城地区,天顺沙洋,2913.6794954930697 +塔城地区,中材白城,2964.609733037027 +塔城地区,中材阜宁,3249.0190639674715 +塔城地区,中材哈密,719.036191355024 +塔城地区,中材邯郸,2623.7599087886115 +塔城地区,中材酒泉,1180.1301678885043 +塔城地区,中材连云港,3162.3244799833105 +塔城地区,中材萍乡,3295.039224209801 +塔城地区,中材锡林,2311.284012950125 +塔城地区,中材兴安盟,2816.191953518504 +塔城地区,中材阳江,3766.2004554347095 +塔城地区,中材伊吾,719.036191355024 +塔城地区,中材玉溪,3000.5242264909375 +塔城地区,重通昌吉,485.1692767883812 +塔城地区,重通大安,2964.609733037027 +塔城地区,重通如东,3409.758871593785 +塔城地区,重通武威,1758.5794976013508 +大同市,艾郎玉门,1470.7806740613123 +大同市,艾郎张北,183.56940782666845 +大同市,时代巴里坤,1815.6387204309337 +大同市,时代百色,1844.021310004673 +大同市,时代射阳,825.7793881517044 +大同市,时代松原,928.6256906595239 +大同市,时代株洲,1297.999773675331 +大同市,双瑞大丰,890.0439420915225 +大同市,双瑞东营,457.52233331800534 +大同市,天顺濮阳,414.47852031017175 +大同市,天顺沙洋,919.5127446557477 +大同市,中材白城,1028.7850916810412 +大同市,中材阜宁,793.625943195954 +大同市,中材哈密,1815.6387204309337 +大同市,中材邯郸,395.2723960919934 +大同市,中材酒泉,1470.7806740613123 +大同市,中材连云港,707.0768516410761 +大同市,中材萍乡,1313.3671894164854 +大同市,中材锡林,570.8214923028227 +大同市,中材兴安盟,954.1935276114314 +大同市,中材阳江,2066.730142100514 +大同市,中材伊吾,1815.6387204309337 +大同市,中材玉溪,2197.188798067697 +大同市,重通昌吉,2045.5488165314641 +大同市,重通大安,1028.7850916810412 +大同市,重通如东,980.9909148043818 +大同市,重通武威,896.8070245697506 +天津市,艾郎玉门,1713.8246183474057 +天津市,艾郎张北,283.0468723300195 +天津市,时代巴里坤,2032.62393453357 +天津市,时代百色,2034.8370886073637 +天津市,时代射阳,772.9349678059647 +天津市,时代松原,692.0146093367587 +天津市,时代株洲,1412.917434470278 +天津市,双瑞大丰,816.9894097679515 +天津市,双瑞东营,393.05703728073206 +天津市,天顺濮阳,516.9470826446501 +天津市,天顺沙洋,1062.5339031555175 +天津市,中材白城,805.4138060168159 +天津市,中材阜宁,726.3062041545622 +天津市,中材哈密,2032.62393453357 +天津市,中材邯郸,575.9017959226869 +天津市,中材酒泉,1713.8246183474057 +天津市,中材连云港,650.3977818296264 +天津市,中材萍乡,1414.7780966213688 +天津市,中材锡林,547.6728196216051 +天津市,中材兴安盟,755.7881316778478 +天津市,中材阳江,2180.028701322404 +天津市,中材伊吾,2032.62393453357 +天津市,中材玉溪,2416.4623066219 +天津市,重通昌吉,2257.488985378578 +天津市,重通大安,805.4138060168159 +天津市,重通如东,921.8364461404487 +天津市,重通武威,1155.7387300347402 +定西市,艾郎玉门,949.7800773453989 +定西市,艾郎张北,1163.1316217046078 +定西市,时代巴里坤,1423.274810789608 +定西市,时代百色,1109.811047560714 +定西市,时代射阳,1417.4544031460512 +定西市,时代松原,1985.9851107361148 +定西市,时代株洲,1115.078906457872 +定西市,双瑞大丰,1501.4338508826522 +定西市,双瑞东营,1274.4254631270235 +定西市,天顺濮阳,997.4825095786408 +定西市,天顺沙洋,849.2039876176146 +定西市,中材白城,2075.288072008846 +定西市,中材阜宁,1432.4836676138523 +定西市,中材哈密,1423.274810789608 +定西市,中材邯郸,840.2508596194252 +定西市,中材酒泉,949.7800773453989 +定西市,中材连云港,1365.0471114300829 +定西市,中材萍乡,1182.0914167053172 +定西市,中材锡林,1452.6917068242747 +定西市,中材兴安盟,1980.1560768824488 +定西市,中材阳江,1670.6677450196185 +定西市,中材伊吾,1423.274810789608 +定西市,中材玉溪,1277.7364312030295 +定西市,重通昌吉,1644.6574337353547 +定西市,重通大安,2075.288072008846 +定西市,重通如东,1523.024898403467 +定西市,重通武威,527.2082608792182 +巴音郭楞蒙古自治州,艾郎玉门,815.1453440785997 +巴音郭楞蒙古自治州,艾郎张北,2259.2297831040723 +巴音郭楞蒙古自治州,时代巴里坤,698.4287817713099 +巴音郭楞蒙古自治州,时代百色,2360.198093100376 +巴音郭楞蒙古自治州,时代射阳,2906.212000402411 +巴音郭楞蒙古自治州,时代松原,2993.663310704278 +巴音郭楞蒙古自治州,时代株洲,2655.7627065902693 +巴音郭楞蒙古自治州,双瑞大丰,2990.0270332404866 +巴音郭楞蒙古自治州,双瑞东营,2661.1126681345004 +巴音郭楞蒙古自治州,天顺濮阳,2427.3315454209046 +巴音郭楞蒙古自治州,天顺沙洋,2405.9974692069422 +巴音郭楞蒙古自治州,中材白城,3021.730391530053 +巴音郭楞蒙古自治州,中材阜宁,2907.2079206048 +巴音郭楞蒙古自治州,中材哈密,698.4287817713099 +巴音郭楞蒙古自治州,中材邯郸,2264.0134357160696 +巴音郭楞蒙古自治州,中材酒泉,815.1453440785997 +巴音郭楞蒙古自治州,中材连云港,2827.4612171922404 +巴音郭楞蒙古自治州,中材萍乡,2726.5467945076152 +巴音郭楞蒙古自治州,中材锡林,2304.2697202183663 +巴音郭楞蒙古自治州,中材兴安盟,2881.9573779450816 +巴音郭楞蒙古自治州,中材阳江,3068.933113021624 +巴音郭楞蒙古自治州,中材伊吾,698.4287817713099 +巴音郭楞蒙古自治州,中材玉溪,2182.235844961745 +巴音郭楞蒙古自治州,重通昌吉,657.0178172801644 +巴音郭楞蒙古自治州,重通大安,3021.730391530053 +巴音郭楞蒙古自治州,重通如东,3032.846715523989 +巴音郭楞蒙古自治州,重通武威,1392.8057494314992 +庆阳市,艾郎玉门,955.9008051729016 +庆阳市,艾郎张北,856.93927315357 +庆阳市,时代巴里坤,1407.7764313976604 +庆阳市,时代百色,1322.010553194483 +庆阳市,时代射阳,1230.8721248336615 +庆阳市,时代松原,1681.937991405725 +庆阳市,时代株洲,1131.7869745460462 +庆阳市,双瑞大丰,1315.0657306496475 +庆阳市,双瑞东营,1027.3576167187064 +庆阳市,天顺濮阳,766.12841498689 +庆阳市,天顺沙洋,788.5324258327796 +庆阳市,中材白城,1769.260820231092 +庆阳市,中材阜宁,1235.313827114647 +庆阳市,中材哈密,1407.7764313976604 +庆阳市,中材邯郸,601.6064214569628 +庆阳市,中材酒泉,955.9008051729016 +庆阳市,中材连云港,1158.9132392580514 +庆阳市,中材萍乡,1187.3334865984011 +庆阳市,中材锡林,1148.8171728328275 +庆阳市,中材兴安盟,1673.0633251990437 +庆阳市,中材阳江,1789.1283701917084 +庆阳市,中材伊吾,1407.7764313976604 +庆阳市,中材玉溪,1554.6091487922156 +庆阳市,重通昌吉,1641.288964985629 +庆阳市,重通大安,1769.260820231092 +庆阳市,重通如东,1355.4652406096434 +庆阳市,重通武威,380.76677525297464 +延安市,艾郎玉门,1010.6185862983951 +延安市,艾郎张北,738.5999303678686 +延安市,时代巴里坤,1447.1947224258738 +延安市,时代百色,1394.0457218153642 +延安市,时代射阳,1148.1358366309241 +延安市,时代松原,1562.5848755846644 +延安市,时代株洲,1132.0822912545118 +延安市,双瑞大丰,1231.664873964563 +延安市,双瑞东营,922.7505547430433 +延安市,天顺濮阳,670.7583778210203 +延安市,天顺沙洋,767.591520598749 +延安市,中材白城,1650.8036690579515 +延安市,中材阜宁,1148.369779435095 +延安市,中材哈密,1447.1947224258738 +延安市,中材邯郸,506.37027983433296 +延安市,中材酒泉,1010.6185862983951 +延安市,中材连云港,1069.1253475039755 +延安市,中材萍乡,1182.057859127416 +延安市,中材锡林,1039.746020269287 +延安市,中材兴安盟,1556.1324573815268 +延安市,中材阳江,1820.6745998829797 +延安市,中材伊吾,1447.1947224258738 +延安市,中材玉溪,1652.0041879315986 +延安市,重通昌吉,1682.7386763881861 +延安市,重通大安,1650.8036690579515 +延安市,重通如东,1279.0694801458653 +延安市,重通武威,407.4166087184272 +张家口市,艾郎玉门,1444.5456293902525 +张家口市,艾郎张北,0.0 +张家口市,时代巴里坤,1751.0960395892953 +张家口市,时代百色,2007.3985530956963 +张家口市,时代射阳,981.4185275779058 +张家口市,时代松原,828.2495761067469 +张家口市,时代株洲,1480.7419410529033 +张家口市,双瑞大丰,1039.2662947315864 +张家口市,双瑞东营,600.359910783661 +张家口市,天顺濮阳,596.7304628087252 +张家口市,天顺沙洋,1100.2005275938286 +张家口市,中材白城,912.321582824782 +张家口市,中材阜宁,943.7945112322442 +张家口市,中材哈密,1751.0960395892953 +张家口市,中材邯郸,574.5004790271732 +张家口市,中材酒泉,1444.5456293902525 +张家口市,中材连云港,859.7022928667503 +张家口市,中材萍乡,1496.7765014917527 +张家口市,中材锡林,387.8944641758237 +张家口市,中材兴安盟,819.9360738883307 +张家口市,中材阳江,2248.902320800186 +张家口市,中材伊吾,1751.0960395892953 +张家口市,中材玉溪,2342.8191590639913 +张家口市,重通昌吉,1975.0579075480164 +张家口市,重通大安,912.321582824782 +张家口市,重通如东,1136.0725314900508 +张家口市,重通武威,911.7685612669939 +德州市,艾郎玉门,1732.8529440767622 +德州市,艾郎张北,478.6283027222326 +德州市,时代巴里坤,2106.631149464292 +德州市,时代百色,1746.3267493112946 +德州市,时代射阳,504.8710650514229 +德州市,时代松原,975.7455812628356 +德州市,时代株洲,1094.2165515379927 +德州市,双瑞大丰,567.834775812382 +德州市,双瑞东营,141.84983311826042 +德州市,天顺濮阳,216.10796797954964 +德州市,天顺沙洋,755.7673314917797 +德州市,中材白城,1099.6375877203948 +德州市,中材阜宁,471.4302781560471 +德州市,中材哈密,2106.631149464292 +德州市,中材邯郸,334.0358912401485 +德州市,中材酒泉,1732.8529440767622 +德州市,中材连云港,385.09008816448267 +德州市,中材萍乡,1094.2782016678225 +德州市,中材锡林,835.1987234187843 +德州市,中材兴安盟,1066.4081957361389 +德州市,中材阳江,1859.8231694669087 +德州市,中材伊吾,2106.631149464292 +德州市,中材玉溪,2153.331883355307 +德州市,重通昌吉,2339.655350508001 +德州市,重通大安,1099.6375877203948 +德州市,重通如东,660.0491768505003 +德州市,重通武威,1132.3528079744083 +忻州市,艾郎玉门,1227.1984571802793 +忻州市,艾郎张北,357.6536001950574 +忻州市,时代巴里坤,1601.5690349625836 +忻州市,时代百色,1680.828639874562 +忻州市,时代射阳,965.3588106368036 +忻州市,时代松原,1178.3424050037518 +忻州市,时代株洲,1241.8839001081553 +忻州市,双瑞大丰,1041.1200140764145 +忻州市,双瑞东营,648.3327178287217 +忻州市,天顺濮阳,480.18596639345816 +忻州市,天顺沙洋,850.2201231905532 +忻州市,中材白城,1268.04405578593 +忻州市,中材阜宁,947.028239347929 +忻州市,中材哈密,1601.5690349625836 +忻州市,中材邯郸,363.4950508513254 +忻州市,中材酒泉,1227.1984571802793 +忻州市,中材连云港,859.9356654298202 +忻州市,中材萍乡,1272.2703371351777 +忻州市,中材锡林,695.8740513519404 +忻州市,中材兴安盟,1177.5703131942532 +忻州市,中材阳江,1992.754632892101 +忻州市,中材伊吾,1601.5690349625836 +忻州市,中材玉溪,1993.8916568891366 +忻州市,重通昌吉,1835.5948546224922 +忻州市,重通大安,1268.04405578593 +忻州市,重通如东,1115.4333285470761 +忻州市,重通武威,635.6135255940685 +恩施土家族苗族自治州,艾郎玉门,1556.0110287829314 +恩施土家族苗族自治州,艾郎张北,1287.147446055253 +恩施土家族苗族自治州,时代巴里坤,2028.2773751870266 +恩施土家族苗族自治州,时代百色,720.6258399505218 +恩施土家族苗族自治州,时代射阳,1064.372199030331 +恩施土家族苗族自治州,时代松原,2011.1607935723168 +恩施土家族苗族自治州,时代株洲,513.8830724010758 +恩施土家族苗族自治州,双瑞大丰,1138.5569599128103 +恩施土家族苗族自治州,双瑞东营,1094.5366384415877 +恩施土家族苗族自治州,天顺濮阳,832.1424489033424 +恩施土家族苗族自治州,天顺沙洋,375.4359481200073 +恩施土家族苗族自治州,中材白城,2126.996951499991 +恩施土家族苗族自治州,中材阜宁,1100.8879169048187 +恩施土家族苗族自治州,中材哈密,2028.2773751870266 +恩施土家族苗族自治州,中材邯郸,746.001468920208 +恩施土家族苗族自治州,中材酒泉,1556.0110287829314 +恩施土家族苗族自治州,中材连云港,1062.8072191307092 +恩施土家族苗族自治州,中材萍乡,584.8874436777477 +恩施土家族苗族自治州,中材锡林,1658.155071187354 +恩施土家族苗族自治州,中材兴安盟,2069.7187247845827 +恩施土家族苗族自治州,中材阳江,1100.6970630944886 +恩施土家族苗族自治州,中材伊吾,2028.2773751870266 +恩施土家族苗族自治州,中材玉溪,1106.2835418296272 +恩施土家族苗族自治州,重通昌吉,2252.0512163776625 +恩施土家族苗族自治州,重通大安,2126.996951499991 +恩施土家族苗族自治州,重通如东,1120.0408120355348 +恩施土家族苗族自治州,重通武威,1056.7464782836248 +承德市,艾郎玉门,1684.2787982743941 +承德市,艾郎张北,257.081639687026 +承德市,时代巴里坤,1964.546974179154 +承德市,时代百色,2194.005899458427 +承德市,时代射阳,966.2752938604384 +承德市,时代松原,576.5646620099665 +承德市,时代株洲,1599.6914880200202 +承德市,双瑞大丰,1006.4969419871977 +承德市,双瑞东营,589.3785469263953 +承德市,天顺濮阳,698.8373139554249 +承德市,天顺沙洋,1239.872885777044 +承德市,中材白城,670.4365198506422 +承德市,中材阜宁,917.8902814341349 +承德市,中材哈密,1964.546974179154 +承德市,中材邯郸,732.8985896678746 +承德市,中材酒泉,1684.2787982743941 +承德市,中材连云港,844.3773543589938 +承德市,中材萍乡,1604.4852948690946 +承德市,中材锡林,367.7762308836895 +承德市,中材兴安盟,595.8228064160762 +承德市,中材阳江,2368.5826142990395 +承德市,中材伊吾,1964.546974179154 +承德市,中材玉溪,2556.013425612636 +承德市,重通昌吉,2182.088956947335 +承德市,重通大安,670.4365198506422 +承德市,重通如东,1112.9883995146733 +承德市,重通武威,1166.9908702628497 +新疆生产建设兵团第十师,艾郎玉门,1051.7629577216246 +新疆生产建设兵团第十师,艾郎张北,2225.4122685568027 +新疆生产建设兵团第十师,时代巴里坤,578.4680108164241 +新疆生产建设兵团第十师,时代百色,3013.5246454830485 +新疆生产建设兵团第十师,时代射阳,3091.2010688839323 +新疆生产建设兵团第十师,时代松原,2774.6754171599378 +新疆生产建设兵团第十师,时代株洲,3097.5262577821395 +新疆生产建设兵团第十师,双瑞大丰,3168.0528553519503 +新疆生产建设兵团第十师,双瑞东营,2763.924188228939 +新疆生产建设兵团第十师,天顺濮阳,2599.8372616350084 +新疆生产建设兵团第十师,天顺沙洋,2767.665811726136 +新疆生产建设兵团第十师,中材白城,2760.064241085299 +新疆生产建设兵团第十师,中材阜宁,3074.17957296424 +新疆生产建设兵团第十师,中材哈密,578.4680108164241 +新疆生产建设兵团第十师,中材邯郸,2455.90135034495 +新疆生产建设兵团第十师,中材酒泉,1051.7629577216246 +新疆生产建设兵团第十师,中材连云港,2987.073660863615 +新疆生产建设兵团第十师,中材萍乡,3158.280791855431 +新疆生产建设兵团第十师,中材锡林,2110.832261200698 +新疆生产建设兵团第十师,中材兴安盟,2611.6162340577034 +新疆生产建设兵团第十师,中材阳江,3659.082978673455 +新疆生产建设兵团第十师,中材伊吾,578.4680108164241 +新疆生产建设兵团第十师,中材玉溪,2945.214888583008 +新疆生产建设兵团第十师,重通昌吉,365.7006290992807 +新疆生产建设兵团第十师,重通大安,2760.064241085299 +新疆生产建设兵团第十师,重通如东,3238.80129044356 +新疆生产建设兵团第十师,重通武威,1604.9868405432296 +昆明市,艾郎玉门,1768.7117764492368 +昆明市,艾郎张北,1987.2307062633868 +昆明市,时代巴里坤,2220.0939910093052 +昆明市,时代百色,294.74209577061345 +昆明市,时代射阳,1775.6796958157497 +昆明市,时代松原,2747.9298611758504 +昆明市,时代株洲,999.4034796793682 +昆明市,双瑞大丰,1841.9137693581813 +昆明市,双瑞东营,1840.9024861043629 +昆明市,天顺濮阳,1578.0238397410778 +昆明市,天顺沙洋,1094.0902450925055 +昆明市,中材白城,2859.5300537316707 +昆明市,中材阜宁,1818.9520882075801 +昆明市,中材哈密,2220.0939910093052 +昆明市,中材邯郸,1481.446607012941 +昆明市,中材酒泉,1768.7117764492368 +昆明市,中材连云港,1791.659151127927 +昆明市,中材萍乡,1067.4841681557875 +昆明市,中材锡林,2334.64181435311 +昆明市,中材兴安盟,2792.8343623586024 +昆明市,中材阳江,1029.7160611757467 +昆明市,中材伊吾,2220.0939910093052 +昆明市,中材玉溪,360.7568925336533 +昆明市,重通昌吉,2406.488900728238 +昆明市,重通大安,2859.5300537316707 +昆明市,重通如东,1802.7174361814907 +昆明市,重通武威,1485.5782842295712 +昌吉回族自治州,艾郎玉门,696.5248113484544 +昌吉回族自治州,艾郎张北,1975.0579075480164 +昌吉回族自治州,时代巴里坤,236.29125721418396 +昌吉回族自治州,时代百色,2647.8432525040466 +昌吉回族自治州,时代射阳,2791.025400309804 +昌吉回族自治州,时代松原,2598.7890560433507 +昌吉回族自治州,时代株洲,2748.31221098501 +昌吉回族自治州,双瑞大丰,2870.23584342377 +昌吉回族自治州,双瑞东营,2481.453953489574 +昌吉回族自治州,天顺濮阳,2297.5929945271696 +昌吉回族自治州,天顺沙洋,2428.5281872108985 +昌吉回族自治州,中材白城,2601.144641879565 +昌吉回族自治州,中材阜宁,2778.274741536735 +昌吉回族自治州,中材哈密,236.29125721418396 +昌吉回族自治州,中材邯郸,2147.2482955532055 +昌吉回族自治州,中材酒泉,696.5248113484544 +昌吉回族自治州,中材连云港,2692.1950374868875 +昌吉回族自治州,中材萍乡,2810.755062910879 +昌吉回族自治州,中材锡林,1914.5558825185487 +昌吉回族自治州,中材兴安盟,2454.4241586282587 +昌吉回族自治州,中材阳江,3296.296079111697 +昌吉回族自治州,中材伊吾,236.29125721418396 +昌吉回族自治州,中材玉溪,2585.1439658109425 +昌吉回族自治州,重通昌吉,0.0 +昌吉回族自治州,重通大安,2601.144641879565 +昌吉回族自治州,重通如东,2934.8372122213264 +昌吉回族自治州,重通武威,1275.3877805159125 +晋中市,艾郎玉门,1492.9774539593786 +晋中市,艾郎张北,392.98349936117046 +晋中市,时代巴里坤,1876.0703315753267 +晋中市,时代百色,1645.683797983973 +晋中市,时代射阳,692.5356343777597 +晋中市,时代松原,1093.6489387822003 +晋中市,时代株洲,1087.7588438680891 +晋中市,双瑞大丰,766.9107969582154 +晋中市,双瑞东营,379.37139197912313 +晋中市,天顺濮阳,223.4825754064184 +晋中市,天顺沙洋,708.7910379507758 +晋中市,中材白城,1203.9518648915573 +晋中市,中材阜宁,672.3174605415954 +晋中市,中材哈密,1876.0703315753267 +晋中市,中材邯郸,186.47321682231697 +晋中市,中材酒泉,1492.9774539593786 +晋中市,中材连云港,585.0297856375481 +晋中市,中材萍乡,1104.4839801513076 +晋中市,中材锡林,780.8654860331549 +晋中市,中材兴安盟,1142.4325175516685 +晋中市,中材阳江,1856.1081083040367 +晋中市,中材伊吾,1876.0703315753267 +晋中市,中材玉溪,2015.7099659429823 +晋中市,重通昌吉,2110.414640437435 +晋中市,重通大安,1203.9518648915573 +晋中市,重通如东,844.3289244372006 +晋中市,重通武威,890.0606614060619 +曲靖市,艾郎玉门,1816.8156233376815 +曲靖市,艾郎张北,1979.0391806132718 +曲靖市,时代巴里坤,2272.2103185635606 +曲靖市,时代百色,219.18997684552497 +曲靖市,时代射阳,1730.5807838267588 +曲靖市,时代松原,2728.5355252559048 +曲靖市,时代株洲,939.0180188043104 +曲靖市,双瑞大丰,1794.965748520492 +曲靖市,双瑞东营,1809.9394968960328 +曲靖市,天顺濮阳,1551.6548166195755 +曲靖市,天顺沙洋,1054.9025930584844 +曲靖市,中材白城,2842.224496606706 +曲靖市,中材阜宁,1775.2422707307426 +曲靖市,中材哈密,2272.2103185635606 +曲靖市,中材邯郸,1461.6475537246968 +曲靖市,中材酒泉,1816.8156233376815 +曲靖市,中材连云港,1750.9755015962562 +曲靖市,中材萍乡,1005.5621887969259 +曲靖市,中材锡林,2332.44819851917 +曲靖市,中材兴安盟,2779.1894391140654 +曲靖市,中材阳江,954.2658207783388 +曲靖市,中材伊吾,2272.2103185635606 +曲靖市,中材玉溪,390.8288015754281 +曲靖市,重通昌吉,2461.9902281330833 +曲靖市,重通大安,2842.224496606706 +曲靖市,重通如东,1752.3812591394615 +曲靖市,重通武威,1511.728599827445 +朔州市,艾郎玉门,1263.6968384191723 +朔州市,艾郎张北,263.63596697883463 +朔州市,时代巴里坤,1618.1017367346415 +朔州市,时代百色,1773.931547946856 +朔州市,时代射阳,975.0790721649307 +朔州市,时代松原,1088.7671508415235 +朔州市,时代株洲,1314.0554328777525 +朔州市,双瑞大丰,1046.9214850746089 +朔州市,双瑞东营,633.7799503008648 +朔州市,天顺濮阳,506.79612937698084 +朔州市,天顺沙洋,923.3138377839272 +朔州市,中材白城,1175.6693030631998 +朔州市,中材阜宁,951.217504765738 +朔州市,中材哈密,1618.1017367346415 +朔州市,中材邯郸,415.662631538044 +朔州市,中材酒泉,1263.6968384191723 +朔州市,中材连云港,863.5560545150387 +朔州市,中材萍乡,1340.8705256909159 +朔州市,中材锡林,601.5360257213357 +朔州市,中材兴安盟,1082.9021893492259 +朔州市,中材阳江,2070.839771736588 +朔州市,中材伊吾,1618.1017367346415 +朔州市,中材玉溪,2090.1843114723897 +朔州市,重通昌吉,1849.9367244020598 +朔州市,重通大安,1175.6693030631998 +朔州市,重通如东,1128.1687856267213 +朔州市,重通武威,689.2688780892536 +朝阳市,艾郎玉门,1983.6935539586898 +朝阳市,艾郎张北,560.0306776548033 +朝阳市,时代巴里坤,2246.9077162707517 +朝阳市,时代百色,2402.4988310294375 +朝阳市,时代射阳,991.5994503514938 +朝阳市,时代松原,317.1102477157205 +朝阳市,时代株洲,1742.4042312566808 +朝阳市,双瑞大丰,1007.3570941164426 +朝阳市,双瑞东营,671.3421507229497 +朝阳市,天顺濮阳,872.7819264502957 +朝阳市,天顺沙洋,1415.279935060797 +朝阳市,中材白城,440.55691107215915 +朝阳市,中材阜宁,935.0759769272353 +朝阳市,中材哈密,2246.9077162707517 +朝阳市,中材邯郸,951.3691548194414 +朝阳市,中材酒泉,1983.6935539586898 +朝阳市,中材连云港,881.8253042734021 +朝阳市,中材萍乡,1734.7952237721588 +朝阳市,中材锡林,564.3639434031525 +朝阳市,中材兴安盟,427.8833968737078 +朝阳市,中材阳江,2498.391674055408 +朝阳市,中材伊吾,2246.9077162707517 +朝阳市,中材玉溪,2793.4447288616007 +朝阳市,重通昌吉,2458.991092921297 +朝阳市,重通大安,440.55691107215915 +朝阳市,重通如东,1117.3830369433736 +朝阳市,重通武威,1471.2232017233441 +来宾市,艾郎玉门,2209.208003020089 +来宾市,艾郎张北,2020.9634127949353 +来宾市,时代巴里坤,2679.752871422796 +来宾市,时代百色,316.7680235326479 +来宾市,时代射阳,1506.060871794016 +来宾市,时代松原,2667.7761676252444 +来宾市,时代株洲,642.5150202522813 +来宾市,双瑞大丰,1551.710185497008 +来宾市,双瑞东营,1694.7127685375872 +来宾市,天顺濮阳,1486.7189358743187 +来宾市,天顺沙洋,940.775844917528 +来宾市,中材白城,2793.976052004137 +来宾市,中材阜宁,1560.0928536895851 +来宾市,中材哈密,2679.752871422796 +来宾市,中材邯郸,1451.4951989454612 +来宾市,中材酒泉,2209.208003020089 +来宾市,中材连云港,1561.9524393400754 +来宾市,中材萍乡,681.0060507103676 +来宾市,中材锡林,2402.8715847279495 +来宾市,中材兴安盟,2758.4599383371606 +来宾市,中材阳江,429.82625952089865 +来宾市,中材伊吾,2679.752871422796 +来宾市,中材玉溪,787.9222117474924 +来宾市,重通昌吉,2886.5754568303546 +来宾市,重通大安,2793.976052004137 +来宾市,重通如东,1481.975731631601 +来宾市,重通武威,1791.3581795016598 +松原市,艾郎玉门,2186.987942129067 +松原市,艾郎张北,828.2495761067469 +松原市,时代巴里坤,2400.5633196971235 +松原市,时代百色,2719.6040879607303 +松原市,时代射阳,1270.209913663611 +松原市,时代松原,0.0 +松原市,时代株洲,2051.7403713220583 +松原市,双瑞大丰,1273.8720900696487 +松原市,双瑞东营,978.3685840303203 +松原市,天顺濮阳,1189.6410699072587 +松原市,天顺沙洋,1731.041684402287 +松原市,中材白城,136.0444111302959 +松原市,中材阜宁,1211.916271949853 +松原市,中材哈密,2400.5633196971235 +松原市,中材邯郸,1266.9530609109574 +松原市,中材酒泉,2186.987942129067 +松原市,中材连云港,1168.9027431779725 +松原市,中材萍乡,2041.0786299564415 +松原市,中材锡林,691.5112998838858 +松原市,中材兴安盟,211.95651523489383 +松原市,中材阳江,2801.803535690175 +松原市,中材伊吾,2400.5633196971235 +松原市,中材玉溪,3108.4281175688193 +松原市,重通昌吉,2598.7890560433507 +松原市,重通大安,136.0444111302959 +松原市,重通如东,1382.1762574181273 +松原市,重通武威,1719.48012339241 +梧州市,艾郎玉门,2266.06441167937 +梧州市,艾郎张北,1939.8745967458794 +梧州市,时代巴里坤,2739.577556478211 +梧州市,时代百色,497.81561928681435 +梧州市,时代射阳,1347.4336037408768 +梧州市,时代松原,2544.4865977685417 +梧州市,时代株洲,494.20039252018273 +梧州市,双瑞大丰,1386.9766442672144 +梧州市,双瑞东营,1566.4603971264912 +梧州市,天顺濮阳,1380.2811566792586 +梧州市,天顺沙洋,841.294816692202 +梧州市,中材白城,2673.5885098021195 +梧州市,中材阜宁,1403.3024183956995 +梧州市,中材哈密,2739.577556478211 +梧州市,中材邯郸,1365.5050361321971 +梧州市,中材酒泉,2266.06441167937 +梧州市,中材连云港,1412.9654389576083 +梧州市,中材萍乡,517.5997487931206 +梧州市,中材锡林,2326.2493448371556 +梧州市,中材兴安盟,2647.1488041107687 +梧州市,中材阳江,349.5842450777955 +梧州市,中材伊吾,2739.577556478211 +梧州市,中材玉溪,986.0246241798982 +梧州市,重通昌吉,2953.9081476854467 +梧州市,重通大安,2673.5885098021195 +梧州市,重通如东,1310.78760756918 +梧州市,重通武威,1805.5280929046257 +榆林市,艾郎玉门,1075.542902722237 +榆林市,艾郎张北,501.48984477621224 +榆林市,时代巴里坤,1467.639341822158 +榆林市,时代百色,1611.0059832338936 +榆林市,时代射阳,1087.8470669762364 +榆林市,时代松原,1329.3725431252926 +榆林市,时代株洲,1253.2650395408007 +榆林市,双瑞大丰,1167.085769217245 +榆林市,双瑞东营,796.8113260986611 +榆林市,天顺濮阳,594.5340361273128 +榆林市,天顺沙洋,866.0806621790334 +榆林市,中材白城,1412.8951267686969 +榆林市,中材阜宁,1075.6403722479913 +榆林市,中材哈密,1467.639341822158 +榆林市,中材邯郸,449.79512798762147 +榆林市,中材酒泉,1075.542902722237 +榆林市,中材连云港,990.1457600213301 +榆林市,中材萍乡,1292.436091750114 +榆林市,中材锡林,796.055748409603 +榆林市,中材兴安盟,1314.5460638802856 +榆林市,中材阳江,1981.6876369153315 +榆林市,中材伊吾,1467.639341822158 +榆林市,中材玉溪,1891.102837458788 +榆林市,重通昌吉,1703.2235547051027 +榆林市,重通大安,1412.8951267686969 +榆林市,重通如东,1232.9048563725044 +榆林市,重通武威,474.62344564966975 +永州市,艾郎玉门,2111.61012493722 +永州市,艾郎张北,1704.4621108208407 +永州市,时代巴里坤,2585.109007422142 +永州市,时代百色,581.0729920267178 +永州市,时代射阳,1128.6670220156861 +永州市,时代松原,2309.1412957606226 +永州市,时代株洲,265.67827352536045 +永州市,双瑞大丰,1174.0149832138964 +永州市,双瑞东营,1331.7845590563452 +永州市,天顺濮阳,1142.6538482295443 +永州市,天顺沙洋,604.7564578191641 +永州市,中材白城,2437.6891314489885 +永州市,中材阜宁,1183.0322042890893 +永州市,中材哈密,2585.109007422142 +永州市,中材邯郸,1129.9616329237194 +永州市,中材酒泉,2111.61012493722 +永州市,中材连云港,1187.1371092666025 +永州市,中材萍乡,304.5077282646633 +永州市,中材锡林,2091.3743752980326 +永州市,中材兴安盟,2409.972389446368 +永州市,中材阳江,557.2458501977103 +永州市,中材伊吾,2585.109007422142 +永州市,中材玉溪,1087.223228085242 +永州市,重通昌吉,2805.731157787976 +永州市,重通大安,2437.6891314489885 +永州市,重通如东,1105.3968423255149 +永州市,重通武威,1618.1367258291828 +沈阳市,艾郎玉门,2177.5053836599564 +沈阳市,艾郎张北,759.5637942912949 +沈阳市,时代巴里坤,2428.709759679188 +沈阳市,时代百色,2559.792039561724 +沈阳市,时代射阳,1071.3052460885888 +沈阳市,时代松原,204.99725147058007 +沈阳市,时代株洲,1869.6764927006477 +沈阳市,双瑞大丰,1071.888811537935 +沈阳市,双瑞东营,798.8174738063874 +沈阳市,天顺濮阳,1030.374185052444 +沈阳市,天顺沙洋,1563.0100413172668 +沈阳市,中材白城,340.20529485198074 +沈阳市,中材阜宁,1012.6982541151026 +沈阳市,中材哈密,2428.709759679188 +沈阳市,中材邯郸,1124.7188506911436 +沈阳市,中材酒泉,2177.5053836599564 +沈阳市,中材连云港,973.65382241256 +沈阳市,中材萍乡,1855.5135872336923 +沈阳市,中材锡林,726.0408853344136 +沈阳市,中材兴安盟,396.59762425845173 +沈阳市,中材阳江,2612.5008485175426 +沈阳市,中材伊吾,2428.709759679188 +沈阳市,中材玉溪,2964.39105193698 +沈阳市,重通昌吉,2636.8720533643664 +沈阳市,重通大安,340.20529485198074 +沈阳市,重通如东,1179.6118610247543 +沈阳市,重通武威,1670.5247089308732 +沧州市,艾郎玉门,1751.7123126596352 +沧州市,艾郎张北,405.9724326235155 +沧州市,时代巴里坤,2104.313702882445 +沧州市,时代百色,1874.603095437773 +沧州市,时代射阳,586.8523462456515 +沧州市,时代松原,845.7277537216776 +沧州市,时代株洲,1225.0555403292446 +沧州市,双瑞大丰,638.1929150599666 +沧州市,双瑞东营,202.32040372423208 +沧州市,天顺濮阳,343.9638090575152 +沧州市,天顺沙洋,886.861156372534 +沧州市,中材白城,968.62016218438 +沧州市,中材阜宁,544.3098928031974 +沧州市,中材哈密,2104.313702882445 +沧州市,中材邯郸,440.5178223291882 +沧州市,中材酒泉,1751.7123126596352 +沧州市,中材连云港,463.8182293319018 +沧州市,中材萍乡,1223.8814833907666 +沧州市,中材锡林,732.3963240086038 +沧州市,中材兴安盟,934.8843652539072 +沧州市,中材阳江,1989.5764678315268 +沧州市,中材伊吾,2104.313702882445 +沧州市,中材玉溪,2275.484335975644 +沧州市,重通昌吉,2334.5412874349518 +沧州市,重通大安,968.62016218438 +沧州市,重通如东,739.1451859379516 +沧州市,重通武威,1164.3798331162093 +河池市,艾郎玉门,1965.147869264188 +河池市,艾郎张北,1920.4453083104631 +河池市,时代巴里坤,2432.2214275222263 +河池市,时代百色,104.23180949961892 +河池市,时代射阳,1542.946830084808 +河池市,时代松原,2623.266050760304 +河池市,时代株洲,707.5959719328596 +河池市,双瑞大丰,1600.2633353675974 +河池市,双瑞东营,1671.6354214520688 +河池市,天顺濮阳,1433.8183863641718 +河池市,天顺沙洋,901.881125326216 +河池市,中材白城,2743.645160477322 +河池市,中材阜宁,1592.0436912516072 +河池市,中材哈密,2432.2214275222263 +河池市,中材邯郸,1369.577040274213 +河池市,中材酒泉,1965.147869264188 +河池市,中材连云港,1578.7129578786155 +河池市,中材萍乡,767.1578427302724 +河池市,中材锡林,2291.639715026824 +河池市,中材兴安盟,2693.955229453147 +河池市,中材阳江,701.2649500728769 +河池市,中材伊吾,2432.2214275222263 +河池市,中材玉溪,604.8692882055874 +河池市,重通昌吉,2634.17500089873 +河池市,重通大安,2743.645160477322 +河池市,重通如东,1546.316127196542 +河池市,重通武威,1584.5583811665128 +济源市,艾郎玉门,1462.37052677061 +济源市,艾郎张北,701.566402613238 +济源市,时代巴里坤,1892.9308799364353 +济源市,时代百色,1318.7197386539283 +济源市,时代射阳,705.8222784933652 +济源市,时代松原,1413.772667227166 +济源市,时代株洲,807.112353205795 +济源市,双瑞大丰,790.1725476510322 +济源市,双瑞东营,557.4892268657723 +济源市,天顺濮阳,275.2844572406265 +济源市,天顺沙洋,415.6777831123434 +济源市,中材白城,1527.4880389913606 +济源市,中材阜宁,713.0675663105727 +济源市,中材哈密,1892.9308799364353 +济源市,中材邯郸,146.96293419094752 +济源市,中材酒泉,1462.37052677061 +济源市,中材连云港,640.4979451215281 +济源市,中材萍乡,837.3058065541026 +济源市,中材锡林,1084.6932135818104 +济源市,中材兴安盟,1469.1276813645716 +济源市,中材阳江,1563.2048134400943 +济源市,中材伊吾,1892.9308799364353 +济源市,中材玉溪,1695.1675909420856 +济源市,重通昌吉,2129.053448888791 +济源市,重通大安,1527.4880389913606 +济源市,重通如东,830.0930026576036 +济源市,重通武威,855.3718612015621 +海南藏族自治州,艾郎玉门,564.1036159776675 +海南藏族自治州,艾郎张北,1390.7758521336882 +海南藏族自治州,时代巴里坤,1026.6095798096392 +海南藏族自治州,时代百色,1425.5559040406897 +海南藏族自治州,时代射阳,1841.4446578752704 +海南藏族自治州,时代松原,2211.576680118966 +海南藏族自治州,时代株洲,1568.064626886398 +海南藏族自治州,双瑞大丰,1925.8836419865713 +海南藏族自治州,双瑞东营,1647.0905511493868 +海南藏族自治州,天顺濮阳,1386.4331928143442 +海南藏族自治州,天顺沙洋,1307.6937056681022 +海南藏族自治州,中材白城,2279.3869778384237 +海南藏族自治州,中材阜宁,1849.798484653581 +海南藏族自治州,中材哈密,1026.6095798096392 +海南藏族自治州,中材邯郸,1222.1219452690161 +海南藏族自治州,中材酒泉,564.1036159776675 +海南藏族自治州,中材连云港,1775.8140854126016 +海南藏族自治州,中材萍乡,1636.8418525814336 +海南藏族自治州,中材锡林,1588.8214983222697 +海南藏族自治州,中材兴安盟,2163.4524158382233 +海南藏族自治州,中材阳江,2066.0777914421087 +海南藏族自治州,中材伊吾,1026.6095798096392 +海南藏族自治州,中材玉溪,1444.7348744308927 +海南藏族自治州,重通昌吉,1231.2016092039778 +海南藏族自治州,重通大安,2279.3869778384237 +海南藏族自治州,重通如东,1957.7756456493714 +海南藏族自治州,重通武威,503.41656312592704 +海西蒙古族藏族自治州,艾郎玉门,416.64114550265333 +海西蒙古族藏族自治州,艾郎张北,1634.308931230138 +海西蒙古族藏族自治州,时代巴里坤,794.8162281324556 +海西蒙古族藏族自治州,时代百色,1689.5231015018906 +海西蒙古族藏族自治州,时代射阳,2167.988120732194 +海西蒙古族藏族自治州,时代松原,2433.04830378738 +海西蒙古族藏族自治州,时代株洲,1901.0245610892962 +海西蒙古族藏族自治州,双瑞大丰,2252.3278352423476 +海西蒙古族藏族自治州,双瑞东营,1953.0539054827343 +海西蒙古族藏族自治州,天顺濮阳,1702.1071262713963 +海西蒙古族藏族自治州,天顺沙洋,1646.3316171670356 +海西蒙古族藏族自治州,中材白城,2486.9918119762588 +海西蒙古族藏族自治州,中材阜宁,2173.532782413346 +海西蒙古族藏族自治州,中材哈密,794.8162281324556 +海西蒙古族藏族自治州,中材邯郸,1537.3884853470183 +海西蒙古族藏族自治州,中材酒泉,416.64114550265333 +海西蒙古族藏族自治州,中材连云港,2097.1494288137965 +海西蒙古族藏族自治州,中材萍乡,1970.7962251868644 +海西蒙古族藏族自治州,中材锡林,1774.5960521529396 +海西蒙古族藏族自治州,中材兴安盟,2360.8075220391925 +海西蒙古族藏族自治州,中材阳江,2363.67268153272 +海西蒙古族藏族自治州,中材伊吾,794.8162281324556 +海西蒙古族藏族自治州,中材玉溪,1624.9549872116518 +海西蒙古族藏族自治州,重通昌吉,966.6026669814205 +海西蒙古族藏族自治州,重通大安,2486.9918119762588 +海西蒙古族藏族自治州,重通如东,2288.3714928465374 +海西蒙古族藏族自治州,重通武威,722.9218419628786 +渭南市,艾郎玉门,1238.0643976042363 +渭南市,艾郎张北,760.5217873371118 +渭南市,时代巴里坤,1680.8782773515923 +渭南市,时代百色,1263.497800064585 +渭南市,时代射阳,946.9381833421608 +渭南市,时代松原,1546.3308514887015 +渭南市,时代株洲,908.5553318094366 +渭南市,双瑞大丰,1031.3332289848256 +渭南市,双瑞东营,776.5671804226594 +渭南市,天顺濮阳,500.90366569463436 +渭南市,天顺沙洋,534.9197451989754 +渭南市,中材白城,1648.9241600938883 +渭南市,中材阜宁,954.4283295328065 +渭南市,中材哈密,1680.8782773515923 +渭南市,中材邯郸,342.39622377720815 +渭南市,中材酒泉,1238.0643976042363 +渭南市,中材连云港,881.0758470117493 +渭南市,中材萍乡,954.6979132123728 +渭南市,中材锡林,1114.149452152157 +渭南市,中材兴安盟,1572.2006667164717 +渭南市,中材阳江,1621.687087556206 +渭南市,中材伊吾,1680.8782773515923 +渭南市,中材玉溪,1582.3771241795328 +渭南市,重通昌吉,1916.0122890113391 +渭南市,重通大安,1648.9241600938883 +渭南市,重通如东,1068.4900350506582 +渭南市,重通武威,641.7042218016064 +烟台市,艾郎玉门,2120.6895256171474 +烟台市,艾郎张北,765.5813971625226 +烟台市,时代巴里坤,2480.330403021607 +烟台市,时代百色,1976.039244109444 +烟台市,时代射阳,393.62703440432404 +烟台市,时代松原,879.3594706097014 +烟台市,时代株洲,1228.0001223222218 +烟台市,双瑞大丰,395.21822745044346 +烟台市,双瑞东营,268.51237405250936 +烟台市,天顺濮阳,546.623450403339 +烟台市,天顺沙洋,978.8650859565411 +烟台市,中材白城,1015.3236636357384 +烟台市,中材阜宁,334.77937102413534 +烟台市,中材哈密,2480.330403021607 +烟台市,中材邯郸,702.3696334551221 +烟台市,中材酒泉,2120.6895256171474 +烟台市,中材连云港,307.3075355426539 +烟台市,中材萍乡,1203.8236542448976 +烟台市,中材锡林,1029.9689126315138 +烟台市,中材兴安盟,1037.1915567779372 +烟台市,中材阳江,1947.4474538739753 +烟台市,中材伊吾,2480.330403021607 +烟台市,中材玉溪,2423.551446182532 +烟台市,重通昌吉,2710.8659835177814 +烟台市,重通大安,1015.3236636357384 +烟台市,重通如东,504.4862969806453 +烟台市,重通武威,1524.4460517691398 +玉林市,艾郎玉门,2402.9671211057444 +玉林市,艾郎张北,2142.915260987977 +玉林市,时代巴里坤,2874.4469065568055 +玉林市,时代百色,500.68630869176184 +玉林市,时代射阳,1544.7297055495178 +玉林市,时代松原,2749.9319160094683 +玉林市,时代株洲,698.6346467412094 +玉林市,双瑞大丰,1580.9078876463457 +玉林市,双瑞东营,1771.7249043462969 +玉林市,天顺濮阳,1586.1046247880256 +玉林市,天顺沙洋,1045.8946411275426 +玉林市,中材白城,2879.2657286493873 +玉林市,中材阜宁,1601.3008422456273 +玉林市,中材哈密,2874.4469065568055 +玉林市,中材邯郸,1568.9055919196903 +玉林市,中材酒泉,2402.9671211057444 +玉林市,中材连云港,1613.9560883445415 +玉林市,中材萍乡,717.4180479142226 +玉林市,中材锡林,2528.653081498138 +玉林市,中材兴安盟,2853.2103670083534 +玉林市,中材阳江,234.51439751475533 +玉林市,中材伊吾,2874.4469065568055 +玉林市,中材玉溪,928.1018262267603 +玉林市,重通昌吉,3082.8353676592005 +玉林市,重通大安,2879.2657286493873 +玉林市,重通如东,1500.6595491785529 +玉林市,重通武威,1970.672066667415 +白城市,艾郎玉门,2222.365789822785 +白城市,艾郎张北,912.321582824782 +白城市,时代巴里坤,2410.396061568036 +白城市,时代百色,2838.9883336330167 +白城市,时代射阳,1405.8482887118619 +白城市,时代松原,136.0444111302959 +白城市,时代株洲,2181.61172979104 +白城市,双瑞大丰,1409.9036005293747 +白城市,双瑞东营,1108.781821031083 +白城市,天顺濮阳,1311.664668474229 +白城市,天顺沙洋,1855.3918754735498 +白城市,中材白城,0.0 +白城市,中材阜宁,1347.6222025742727 +白城市,中材哈密,2410.396061568036 +白城市,中材邯郸,1381.2281777848937 +白城市,中材酒泉,2222.365789822785 +白城市,中材连云港,1303.7710830020662 +白城市,中材萍乡,2172.3236086749757 +白城市,中材锡林,720.2646648710656 +白城市,中材兴安盟,148.4919462157313 +白城市,中材阳江,2934.1950896198723 +白城市,中材伊吾,2410.396061568036 +白城市,中材玉溪,3219.52280724568 +白城市,重通昌吉,2601.144641879565 +白城市,重通大安,0.0 +白城市,重通如东,1518.2206530017165 +白城市,重通武威,1781.7137574915791 +百色市,艾郎玉门,1988.4063591696874 +百色市,艾郎张北,2007.3985530956963 +百色市,时代巴里坤,2451.1707573197123 +百色市,时代百色,0.0 +百色市,时代射阳,1647.0049255126307 +百色市,时代松原,2719.6040879607303 +百色市,时代株洲,810.7887295347441 +百色市,双瑞大丰,1704.476026941911 +百色市,双瑞东营,1771.8090506594683 +百色市,天顺濮阳,1530.8193298459062 +百色市,天顺沙洋,1002.4954730025345 +百色市,中材白城,2838.9883336330167 +百色市,中材阜宁,1695.957421666274 +百色市,中材哈密,2451.1707573197123 +百色市,中材邯郸,1462.0441666455447 +百色市,中材酒泉,1988.4063591696874 +百色市,中材连云港,1682.042707785951 +百色市,中材萍乡,869.2959416435867 +百色市,中材锡林,2375.2316620787824 +百色市,中材兴安盟,2786.9768635535925 +百色市,中材阳江,735.084854374933 +百色市,中材伊吾,2451.1707573197123 +百色市,中材玉溪,506.3366468812157 +百色市,重通昌吉,2647.8432525040466 +百色市,重通大安,2838.9883336330167 +百色市,重通如东,1650.4621819623517 +百色市,重通武威,1634.8598192401073 +秦皇岛市,艾郎玉门,1877.9465269404648 +秦皇岛市,艾郎张北,448.7754488187443 +秦皇岛市,时代巴里坤,2199.006926599206 +秦皇岛市,时代百色,2086.4332824416524 +秦皇岛市,时代射阳,692.9261115872378 +秦皇岛市,时代松原,638.299883947255 +秦皇岛市,时代株洲,1416.9515750529365 +秦皇岛市,双瑞大丰,722.6118948416827 +秦皇岛市,双瑞东营,347.65016644962293 +秦皇岛市,天顺濮阳,556.0307865433455 +秦皇岛市,天顺沙洋,1093.3051068630461 +秦皇岛市,中材白城,765.4620770708437 +秦皇岛市,中材阜宁,639.9502029520479 +秦皇岛市,中材哈密,2199.006926599206 +秦皇岛市,中材邯郸,654.1886415927705 +秦皇岛市,中材酒泉,1877.9465269404648 +秦皇岛市,中材连云港,575.8170204832388 +秦皇岛市,中材萍乡,1409.8885435629231 +秦皇岛市,中材锡林,669.1439829191924 +秦皇岛市,中材兴安盟,746.8677117938306 +秦皇岛市,中材阳江,2174.1384947397164 +秦皇岛市,中材伊吾,2199.006926599206 +秦皇岛市,中材玉溪,2490.3895413332784 +秦皇岛市,重通昌吉,2423.686214492616 +秦皇岛市,重通大安,765.4620770708437 +秦皇岛市,重通如东,831.6170932990476 +秦皇岛市,重通武威,1313.1415739925897 +绥化市,艾郎玉门,2513.4788975323254 +绥化市,艾郎张北,1218.7033957302363 +绥化市,时代巴里坤,2678.57959525822 +绥化市,时代百色,3119.104640903563 +绥化市,时代射阳,1622.948971551133 +绥化市,时代松原,403.3588681287825 +绥化市,时代株洲,2434.7816425339147 +绥化市,双瑞大丰,1614.3907499964034 +绥化市,双瑞东营,1364.1370478167735 +绥化市,天顺濮阳,1588.2959206829132 +绥化市,天顺沙洋,2126.0235312643536 +绥化市,中材白城,307.2746128416617 +绥化市,中材阜宁,1564.039362017373 +绥化市,中材哈密,2678.57959525822 +绥化市,中材邯郸,1669.8095883951326 +绥化市,中材酒泉,2513.4788975323254 +绥化市,中材连云港,1531.9759852253098 +绥化市,中材萍乡,2419.609299734139 +绥化市,中材锡林,1015.6992301132674 +绥化市,中材兴安盟,428.3294993677809 +绥化市,中材阳江,3173.879939804024 +绥化市,中材伊吾,2678.57959525822 +绥化市,中材玉溪,3511.601553927601 +绥化市,重通昌吉,2860.3836303796165 +绥化市,重通大安,307.2746128416617 +绥化市,重通如东,1718.5636998167488 +绥化市,重通武威,2086.78976991872 +聊城市,艾郎玉门,1650.4431973860303 +聊城市,艾郎张北,514.0419217203405 +聊城市,时代巴里坤,2041.4830933014448 +聊城市,时代百色,1618.8355326293038 +聊城市,时代射阳,522.951346836794 +聊城市,时代松原,1100.8018548351238 +聊城市,时代株洲,993.441656189765 +聊城市,双瑞大丰,597.6971895194563 +聊城市,双瑞东营,237.5947331805899 +聊城市,天顺濮阳,92.54252908205883 +聊城市,天顺沙洋,637.9501170202044 +聊城市,中材白城,1221.613618391755 +聊城市,中材阜宁,503.54514780697025 +聊城市,中材哈密,2041.4830933014448 +聊城市,中材邯郸,201.10124366737514 +聊城市,中材酒泉,1650.4431973860303 +聊城市,中材连云港,416.5815717430022 +聊城市,中材萍乡,1000.3513958129499 +聊城市,中材锡林,893.4847104817019 +聊城市,中材兴安盟,1179.8325192011303 +聊城市,中材阳江,1762.8692396731965 +聊城市,中材伊吾,2041.4830933014448 +聊城市,中材玉溪,2019.833256009505 +聊城市,重通昌吉,2276.329362970383 +聊城市,重通大安,1221.613618391755 +聊城市,重通如东,674.904809348926 +聊城市,重通武威,1042.7572576840935 +荆州市,艾郎玉门,1836.523981243332 +荆州市,艾郎张北,1282.7210333621574 +荆州市,时代巴里坤,2302.1921803475734 +荆州市,时代百色,850.6875225293985 +荆州市,时代射阳,802.3802643349244 +荆州市,时代松原,1904.8879709038306 +荆州市,时代株洲,227.77267738945534 +荆州市,双瑞大丰,865.978432891114 +荆州市,双瑞东营,935.1423662814559 +荆州市,天顺濮阳,725.3868765909242 +荆州市,天顺沙洋,182.8408534199749 +荆州市,中材白城,2030.799009166259 +荆州市,中材阜宁,848.6991787281552 +荆州市,中材哈密,2302.1921803475734 +荆州市,中材邯郸,708.2614417277979 +荆州市,中材酒泉,1836.523981243332 +荆州市,中材连云港,831.4773806947156 +荆州市,中材萍乡,280.6848787193429 +荆州市,中材锡林,1669.8870964952127 +荆州市,中材兴安盟,1996.5110193456928 +荆州市,中材阳江,970.2360034807173 +荆州市,中材伊吾,2302.1921803475734 +荆州市,中材玉溪,1316.8575855713511 +荆州市,重通昌吉,2531.7981091982297 +荆州市,重通大安,2030.799009166259 +荆州市,重通如东,827.0091703457902 +荆州市,重通武威,1287.544481144107 +荆门市,艾郎玉门,1738.225328898579 +荆门市,艾郎张北,1100.2005275938286 +荆门市,时代巴里坤,2195.785062369379 +荆门市,时代百色,1002.4954730025345 +荆门市,时代射阳,690.5133631606902 +荆门市,时代松原,1731.041684402287 +荆门市,时代株洲,391.6811300670263 +荆门市,双瑞大丰,763.505027263098 +荆门市,双瑞东营,769.8403243495793 +荆门市,天顺濮阳,545.9515841820945 +荆门市,天顺沙洋,0.0 +荆门市,中材白城,1855.3918754735498 +荆门市,中材阜宁,729.3128827315543 +荆门市,中材哈密,2195.785062369379 +荆门市,中材邯郸,525.8948978382974 +荆门市,中材酒泉,1738.225328898579 +荆门市,中材连云港,697.7281315115274 +荆门市,中材萍乡,426.4062835689576 +荆门市,中材锡林,1487.56588924206 +荆门市,中材兴安盟,1817.6888216409718 +荆门市,中材阳江,1150.7094264808134 +荆门市,中材伊吾,2195.785062369379 +荆门市,中材玉溪,1445.7103133612063 +荆门市,重通昌吉,2428.5281872108985 +荆门市,重通大安,1855.3918754735498 +荆门市,重通如东,745.6013674655158 +荆门市,重通武威,1165.2461703650774 +葫芦岛市,艾郎玉门,1978.2816282994436 +葫芦岛市,艾郎张北,533.8530449360283 +葫芦岛市,时代巴里坤,2271.6341604851186 +葫芦岛市,时代百色,2265.4100342786637 +葫芦岛市,时代射阳,828.013884525537 +葫芦岛市,时代松原,463.60856097557985 +葫芦岛市,时代株洲,1588.194073542567 +葫芦岛市,双瑞大丰,844.5098373394859 +葫芦岛市,双瑞东营,514.9103214518461 +葫芦岛市,天顺濮阳,735.1714424134465 +葫芦岛市,天顺沙洋,1271.0034623819545 +葫芦岛市,中材白城,594.0763373897902 +葫芦岛市,中材阜宁,771.5329954865948 +葫芦岛市,中材哈密,2271.6341604851186 +葫芦岛市,中材邯郸,830.315042997221 +葫芦岛市,中材酒泉,1978.2816282994436 +葫芦岛市,中材连云港,718.5515248736976 +葫芦岛市,中材萍乡,1578.2591508287894 +葫芦岛市,中材锡林,645.6386366740783 +葫芦岛市,中材兴安盟,591.186720064759 +葫芦岛市,中材阳江,2340.361198490409 +葫芦岛市,中材伊吾,2271.6341604851186 +葫芦岛市,中材玉溪,2668.8473359335903 +葫芦岛市,重通昌吉,2490.4634405025135 +葫芦岛市,重通大安,594.0763373897902 +葫芦岛市,重通如东,954.5807527629838 +葫芦岛市,重通武威,1435.9597910365692 +衡水市,艾郎玉门,1598.7446080749996 +衡水市,艾郎张北,357.50818496119587 +衡水市,时代巴里坤,1966.3241799338696 +衡水市,时代百色,1751.3073290980342 +衡水市,时代射阳,641.1603765511276 +衡水市,时代松原,974.2430290535309 +衡水市,时代株洲,1150.723985046731 +衡水市,双瑞大丰,707.4357759804398 +衡水市,双瑞东营,284.02736505477134 +衡水市,天顺濮阳,249.96262066842607 +衡水市,天顺沙洋,787.0915440073828 +衡水市,中材白城,1089.1616936171574 +衡水市,中材阜宁,611.0084317871019 +衡水市,中材哈密,1966.3241799338696 +衡水市,中材邯郸,292.71156132651413 +衡水市,中材酒泉,1598.7446080749996 +衡水市,中材连云港,523.860066892362 +衡水市,中材萍乡,1159.462964646595 +衡水市,中材锡林,733.4586135665966 +衡水市,中材兴安盟,1037.09481514588 +衡水市,中材阳江,1920.615091026883 +衡水市,中材伊吾,1966.3241799338696 +衡水市,中材玉溪,2134.652061451285 +衡水市,重通昌吉,2198.8586564055195 +衡水市,重通大安,1089.1616936171574 +衡水市,重通如东,796.2549501249858 +衡水市,重通武威,1003.6320731821178 +赣州市,艾郎玉门,2338.1070106017123 +赣州市,艾郎张北,1707.0832403929046 +赣州市,时代巴里坤,2806.859352061119 +赣州市,时代百色,911.6996269212744 +赣州市,时代射阳,952.550198947675 +赣州市,时代松原,2203.92140469606 +赣州市,时代株洲,286.72400765568943 +赣州市,双瑞大丰,976.9556559858461 +赣州市,双瑞东营,1236.4224542771424 +赣州市,天顺濮阳,1113.0407750965041 +赣州市,天顺沙洋,656.8781730561492 +赣州市,中材白城,2337.5230832441116 +赣州市,中材阜宁,1011.0574308625796 +赣州市,中材哈密,2806.859352061119 +赣州市,中材邯郸,1150.1106927838302 +赣州市,中材酒泉,2338.1070106017123 +赣州市,中材连云港,1038.8806790512135 +赣州市,中材萍乡,232.10055261071864 +赣州市,中材锡林,2092.5184816493693 +赣州市,中材兴安盟,2330.733807204494 +赣州市,中材阳江,606.5263665589038 +赣州市,中材伊吾,2806.859352061119 +赣州市,中材玉溪,1416.9336847222007 +赣州市,重通昌吉,3034.4956865810964 +赣州市,重通大安,2337.5230832441116 +赣州市,重通如东,888.1423310406343 +赣州市,重通武威,1798.1532660780615 +辽阳市,艾郎玉门,2195.7827856818312 +辽阳市,艾郎张北,758.6348145169039 +辽阳市,时代巴里坤,2466.758581069736 +辽阳市,时代百色,2482.757479150202 +辽阳市,时代射阳,964.8879301604175 +辽阳市,时代松原,320.99669940163807 +辽阳市,时代株洲,1777.0301672645085 +辽阳市,双瑞大丰,961.8569786287319 +辽阳市,双瑞东营,713.1302713745682 +辽阳市,天顺濮阳,959.6462309682686 +辽阳市,天顺沙洋,1482.2045661554446 +辽阳市,中材白城,455.29406838896045 +辽阳市,中材阜宁,906.0608903348125 +辽阳市,中材哈密,2466.758581069736 +辽阳市,中材邯郸,1066.1784631201836 +辽阳市,中材酒泉,2195.7827856818312 +辽阳市,中材连云港,871.4178304075324 +辽阳市,中材萍乡,1760.0319511889982 +辽阳市,中材锡林,783.1489748336489 +辽阳市,中材兴安盟,511.69375519788747 +辽阳市,中材阳江,2513.170674254249 +辽阳市,中材伊吾,2466.758581069736 +辽阳市,中材玉溪,2897.709651423355 +辽阳市,重通昌吉,2679.644981593645 +辽阳市,重通大安,455.29406838896045 +辽阳市,重通如东,1068.712899858505 +辽阳市,重通武威,1668.6439794947466 +运城市,艾郎玉门,1412.6757454712772 +运城市,艾郎张北,657.7538340879057 +运城市,时代巴里坤,1839.4362430724577 +运城市,时代百色,1354.0502710088626 +运城市,时代射阳,745.77722709722 +运城市,时代松原,1390.4473827424351 +运城市,时代株洲,863.9717146335878 +运城市,双瑞大丰,829.7536303231387 +运城市,双瑞东营,567.9623042804078 +运城市,天顺濮阳,289.97203760114326 +运城市,天顺沙洋,472.2927075832187 +运城市,中材白城,1501.2561960383307 +运城市,中材阜宁,749.2801692587605 +运城市,中材哈密,1839.4362430724577 +运城市,中材邯郸,136.7882158730764 +运城市,中材酒泉,1412.6757454712772 +运城市,中材连云港,673.4069677399327 +运城市,中材萍乡,895.5311997791874 +运城市,中材锡林,1037.6645211854816 +运城市,中材兴安盟,1438.03892475905 +运城市,中材阳江,1616.9947357968197 +运城市,中材伊吾,1839.4362430724577 +运城市,中材玉溪,1718.4430806650005 +运城市,重通昌吉,2075.66069420115 +运城市,重通大安,1501.2561960383307 +运城市,重通如东,874.8955966469978 +运城市,重通武威,803.7509426526108 +通辽市,艾郎玉门,1989.4776194753954 +通辽市,艾郎张北,593.2070015035786 +通辽市,时代巴里坤,2234.0163365778844 +通辽市,时代百色,2483.1604746732824 +通辽市,时代射阳,1088.3279664634479 +通辽市,时代松原,243.5764393707685 +通辽市,时代株洲,1833.2435045759162 +通辽市,双瑞大丰,1104.0213478619391 +通辽市,双瑞东营,764.4367692908354 +通辽市,天顺濮阳,956.3636425436255 +通辽市,天顺沙洋,1500.9151337033 +通辽市,中材白城,355.83885166704084 +通辽市,中材阜宁,1031.841674741616 +通辽市,中材哈密,2234.0163365778844 +通辽市,中材邯郸,1026.3905154154272 +通辽市,中材酒泉,1989.4776194753954 +通辽市,中材连云港,978.2275701334493 +通辽市,中材萍乡,1826.972099994903 +通辽市,中材锡林,530.8487608940122 +通辽市,中材兴安盟,331.80737007977933 +通辽市,中材阳江,2591.2686111118337 +通辽市,中材伊吾,2234.0163365778844 +通辽市,中材玉溪,2866.636227049623 +通辽市,重通昌吉,2441.56867394464 +通辽市,重通大安,355.83885166704084 +通辽市,重通如东,1214.0301819948363 +通辽市,重通武威,1496.593889709407 +邢台市,艾郎玉门,1579.7076878370194 +邢台市,艾郎张北,415.63592223064995 +邢台市,时代巴里坤,1960.276458113419 +邢台市,时代百色,1672.41023405734 +邢台市,时代射阳,617.1630264029498 +邢台市,时代松原,1052.215166851105 +邢台市,时代株洲,1077.357348370361 +邢台市,双瑞大丰,689.0031731275733 +邢台市,双瑞东营,292.4209687826131 +邢台市,天顺濮阳,181.32951243549195 +邢台市,天顺沙洋,710.1126940750039 +邢台市,中材白城,1167.782962201402 +邢台市,中材阜宁,593.5009298188091 +邢台市,中材哈密,1960.276458113419 +邢台市,中材邯郸,215.2532045173957 +邢台市,中材酒泉,1579.7076878370194 +邢台市,中材连云港,505.8763577025113 +邢台市,中材萍乡,1088.2101650474456 +邢台市,中材锡林,798.6762916270014 +邢台市,中材兴安盟,1115.9544696569405 +邢台市,中材阳江,1847.3488779139504 +邢台市,中材伊吾,1960.276458113419 +邢台市,中材玉溪,2057.3354663667214 +邢台市,重通昌吉,2194.2572595128436 +邢台市,重通大安,1167.782962201402 +邢台市,重通如东,770.6825331658164 +邢台市,重通武威,977.1668485996547 +鄂尔多斯市,艾郎玉门,1147.6847842535017 +鄂尔多斯市,艾郎张北,335.8478995830502 +鄂尔多斯市,时代巴里坤,1499.6194275863907 +鄂尔多斯市,时代百色,1781.1572103711999 +鄂尔多斯市,时代射阳,1086.157868462059 +鄂尔多斯市,时代松原,1161.7264698746205 +鄂尔多斯市,时代株洲,1372.1149427214477 +鄂尔多斯市,双瑞大丰,1159.5872790145202 +鄂尔多斯市,双瑞东营,751.1833886300745 +鄂尔多斯市,天顺濮阳,608.3529069023826 +鄂尔多斯市,天顺沙洋,980.5361674605604 +鄂尔多斯市,中材白城,1239.5973741651583 +鄂尔多斯市,中材阜宁,1064.3518325488967 +鄂尔多斯市,中材哈密,1499.6194275863907 +鄂尔多斯市,中材邯郸,498.0959263390704 +鄂尔多斯市,中材酒泉,1147.6847842535017 +鄂尔多斯市,中材连云港,976.7731412570739 +鄂尔多斯市,中材萍乡,1404.161778669042 +鄂尔多斯市,中材锡林,613.4995144760345 +鄂尔多斯市,中材兴安盟,1136.8558446517254 +鄂尔多斯市,中材阳江,2118.262302670356 +鄂尔多斯市,中材伊吾,1499.6194275863907 +鄂尔多斯市,中材玉溪,2072.093533006724 +鄂尔多斯市,重通昌吉,1731.5859419238755 +鄂尔多斯市,重通大安,1239.5973741651583 +鄂尔多斯市,重通如东,1238.1300109778676 +鄂尔多斯市,重通武威,583.1875553175507 +酒泉市,艾郎玉门,0.0 +酒泉市,艾郎张北,1444.5456293902525 +酒泉市,时代巴里坤,473.8542775808841 +酒泉市,时代百色,1988.4063591696874 +酒泉市,时代射阳,2148.0979480360693 +酒泉市,时代松原,2186.987942129067 +酒泉市,时代株洲,2052.0477845866735 +酒泉市,双瑞大丰,2230.0784438523397 +酒泉市,双瑞东营,1872.0681983594325 +酒泉市,天顺濮阳,1657.8337330203344 +酒泉市,天顺沙洋,1738.225328898579 +酒泉市,中材白城,2222.365789822785 +酒泉市,中材阜宁,2142.0721487841565 +酒泉市,中材哈密,473.8542775808841 +酒泉市,中材邯郸,1499.3773763484392 +酒泉市,中材酒泉,0.0 +酒泉市,中材连云港,2058.6642693181207 +酒泉市,中材萍乡,2114.937377423778 +酒泉市,中材锡林,1502.2103076979267 +酒泉市,中材兴安盟,2086.3610724372484 +酒泉市,中材阳江,2611.2302836866147 +酒泉市,中材伊吾,473.8542775808841 +酒泉市,中材玉溪,1992.9981886213855 +酒泉市,重通昌吉,696.5248113484544 +酒泉市,重通大安,2222.365789822785 +酒泉市,重通如东,2284.939839227625 +酒泉市,重通武威,611.5038507527217 +重庆市,艾郎玉门,1624.4228176535275 +重庆市,艾郎张北,1446.3165181801912 +重庆市,时代巴里坤,2098.2768378198725 +重庆市,时代百色,561.0884968568084 +重庆市,时代射阳,1188.6012910844283 +重庆市,时代松原,2169.917130668712 +重庆市,时代株洲,523.8453598550801 +重庆市,双瑞大丰,1258.8788204558355 +重庆市,双瑞东营,1245.1901663522513 +重庆市,天顺濮阳,987.7516719875185 +重庆市,天顺沙洋,500.1391372680264 +重庆市,中材白城,2286.370223740965 +重庆市,中材阜宁,1228.9825705058543 +重庆市,中材哈密,2098.2768378198725 +重庆市,中材邯郸,905.7078604799233 +重庆市,中材酒泉,1624.4228176535275 +重庆市,中材连云港,1197.3628202109874 +重庆市,中材萍乡,598.9957831150198 +重庆市,中材锡林,1815.5211036463756 +重庆市,中材兴安盟,2229.7688478464897 +重庆市,中材阳江,995.8199947168475 +重庆市,中材伊吾,2098.2768378198725 +重庆市,中材玉溪,954.1364000920533 +重庆市,重通昌吉,2316.350049866403 +重庆市,重通大安,2286.370223740965 +重庆市,重通如东,1230.2313800843572 +重庆市,重通武威,1163.4221883888338 +钦州市,艾郎玉门,2369.682338429419 +钦州市,艾郎张北,2158.916079369304 +钦州市,时代巴里坤,2839.687841329515 +钦州市,时代百色,437.79147812184664 +钦州市,时代射阳,1591.4130091686816 +钦州市,时代松原,2783.0041409507935 +钦州市,时代株洲,736.2982391709268 +钦州市,双瑞大丰,1630.5081932215917 +钦州市,双瑞东营,1805.8664891234075 +钦州市,天顺濮阳,1611.322645358543 +钦州市,天顺沙洋,1067.4829282080639 +钦州市,中材白城,2911.2127692209606 +钦州市,中材阜宁,1647.2954021388937 +钦州市,中材哈密,2839.687841329515 +钦州市,中材邯郸,1586.3906635477913 +钦州市,中材酒泉,2369.682338429419 +钦州市,中材连云港,1656.5255819485983 +钦州市,中材萍乡,761.5837130872696 +钦州市,中材锡林,2543.0834812856056 +钦州市,中材兴安盟,2881.4215225485505 +钦州市,中材阳江,301.1050991749029 +钦州市,中材伊吾,2839.687841329515 +钦州市,中材玉溪,851.9729773814831 +钦州市,重通昌吉,3045.3444044919474 +钦州市,重通大安,2911.2127692209606 +钦州市,重通如东,1553.1445921769264 +钦州市,重通武威,1952.505801257392 +铜仁市,艾郎玉门,1707.955333435716 +铜仁市,艾郎张北,1493.6882599849441 +铜仁市,时代巴里坤,2181.8090929833693 +铜仁市,时代百色,520.4547082785042 +铜仁市,时代射阳,1177.8197123769255 +铜仁市,时代松原,2199.818858798769 +铜仁市,时代株洲,462.5701607042746 +铜仁市,双瑞大丰,1244.7388173720124 +铜仁市,双瑞东营,1260.512834530406 +铜仁市,天顺濮阳,1012.1942227772956 +铜仁市,天顺沙洋,499.1935399420966 +铜仁市,中材白城,2318.6811213311285 +铜仁市,中材阜宁,1221.077173771431 +铜仁市,中材哈密,2181.8090929833693 +铜仁市,中材邯郸,942.0170172121941 +铜仁市,中材酒泉,1707.955333435716 +铜仁市,中材连云港,1195.1957279420153 +铜仁市,中材萍乡,537.6691202031064 +铜仁市,中材锡林,1867.4867743078985 +铜仁市,中材兴安盟,2266.7962582130313 +铜仁市,中材阳江,913.7480094051401 +铜仁市,中材伊吾,2181.8090929833693 +铜仁市,中材玉溪,946.6255276124157 +铜仁市,重通昌吉,2399.844927671517 +铜仁市,重通大安,2318.6811213311285 +铜仁市,重通如东,1209.0905425984256 +铜仁市,重通武威,1243.3450879071559 +锡林郭勒盟,艾郎玉门,1502.2103076979267 +锡林郭勒盟,艾郎张北,387.8944641758237 +锡林郭勒盟,时代巴里坤,1711.5725740673845 +锡林郭勒盟,时代百色,2375.2316620787824 +锡林郭勒盟,时代射阳,1318.2339857661773 +锡林郭勒盟,时代松原,691.5112998838858 +锡林郭勒盟,时代株洲,1868.61216732038 +锡林郭勒盟,双瑞大丰,1364.508239601583 +锡林郭勒盟,双瑞东营,934.5636534637553 +锡林郭勒盟,天顺濮阳,979.8535146017629 +锡林郭勒盟,天顺沙洋,1487.56588924206 +锡林郭勒盟,中材白城,720.2646648710656 +锡林郭勒盟,中材阜宁,1273.136580436015 +锡林郭勒盟,中材哈密,1711.5725740673845 +锡林郭勒盟,中材邯郸,961.6767593212326 +锡林郭勒盟,中材酒泉,1502.2103076979267 +锡林郭勒盟,中材连云港,1195.2620165172318 +锡林郭勒盟,中材萍乡,1884.069190389757 +锡林郭勒盟,中材锡林,0.0 +锡林郭勒盟,中材兴安盟,587.3759263493329 +锡林郭勒盟,中材阳江,2636.7486269112414 +锡林郭勒盟,中材伊吾,1711.5725740673845 +锡林郭勒盟,中材玉溪,2684.3701048903254 +锡林郭勒盟,重通昌吉,1914.5558825185487 +锡林郭勒盟,重通大安,720.2646648710656 +锡林郭勒盟,重通如东,1468.678927888431 +锡林郭勒盟,重通武威,1085.6326451975515 +锦州市,艾郎玉门,2042.0137644161966 +锦州市,艾郎张北,599.1563034335519 +锦州市,时代巴里坤,2327.424539674726 +锦州市,时代百色,2333.837464289105 +锦州市,时代射阳,869.3604587752039 +锦州市,时代松原,406.1956229013854 +锦州市,时代株洲,1647.8646163847066 +锦州市,双瑞大丰,879.5714057904473 +锦州市,双瑞东营,575.0985264111092 +锦州市,天顺濮阳,804.8741524033265 +锦州市,天顺沙洋,1337.1939474630085 +锦州市,中材白城,539.8731997051239 +锦州市,中材阜宁,811.7623490336206 +锦州市,中材哈密,2327.424539674726 +锦州市,中材邯郸,903.5063270753266 +锦州市,中材酒泉,2042.0137644161966 +锦州市,中材连云港,764.5296037627692 +锦州市,中材萍乡,1635.76165018527 +锦州市,中材锡林,677.2038210144773 +锦州市,中材兴安盟,552.1806658146584 +锦州市,中材阳江,2395.71924738834 +锦州市,中材伊吾,2327.424539674726 +锦州市,中材玉溪,2740.5057334319195 +锦州市,重通昌吉,2544.271472598037 +锦州市,重通大安,539.8731997051239 +锦州市,重通如东,989.2162897546832 +锦州市,重通武威,1505.3862258835688 +阜阳市,艾郎玉门,1800.5283837548384 +阜阳市,艾郎张北,902.1012590665016 +阜阳市,时代巴里坤,2234.94092080355 +阜阳市,时代百色,1293.1005035259634 +阜阳市,时代射阳,428.2241926654033 +阜阳市,时代松原,1457.5167514921018 +阜阳市,时代株洲,601.7626594853886 +阜阳市,双瑞大丰,509.10070042922905 +阜阳市,双瑞东营,484.34741345349056 +阜阳市,天顺濮阳,307.1428348805333 +阜阳市,天顺沙洋,292.2846752318412 +阜阳市,中材白城,1585.2239012139723 +阜阳市,中材阜宁,456.90407984758156 +阜阳市,中材哈密,2234.94092080355 +阜阳市,中材邯郸,368.3876834149631 +阜阳市,中材酒泉,1800.5283837548384 +阜阳市,中材连云港,413.04437026770387 +阜阳市,中材萍乡,604.5110480570412 +阜阳市,中材锡林,1286.6720311197819 +阜阳市,中材兴安盟,1558.1452259433906 +阜阳市,中材阳江,1368.83259284865 +阜阳市,中材伊吾,2234.94092080355 +阜阳市,中材玉溪,1737.1509086937433 +阜阳市,重通昌吉,2470.978016532369 +阜阳市,重通大安,1585.2239012139723 +阜阳市,重通如东,520.526104271967 +阜阳市,重通武威,1196.3686019160198 +阳江市,艾郎玉门,2611.2302836866147 +阳江市,艾郎张北,2248.902320800186 +阳江市,时代巴里坤,3084.2318557276553 +阳江市,时代百色,735.084854374933 +阳江市,时代射阳,1558.8095347506928 +阳江市,时代松原,2801.803535690175 +阳江市,时代株洲,769.9969805362691 +阳江市,双瑞大丰,1583.079551606973 +阳江市,双瑞东营,1827.0645074210777 +阳江市,天顺濮阳,1671.1451075881953 +阳江市,天顺沙洋,1150.7094264808134 +阳江市,中材白城,2934.1950896198723 +阳江市,中材阜宁,1617.1995808097324 +阳江市,中材哈密,3084.2318557276553 +阳江市,中材邯郸,1675.8535687260223 +阳江市,中材酒泉,2611.2302836866147 +阳江市,中材连云港,1642.3334102524584 +阳江市,中材萍乡,765.7047841101272 +阳江市,中材锡林,2636.7486269112414 +阳江市,中材兴安盟,2920.0479212736914 +阳江市,中材阳江,0.0 +阳江市,中材伊吾,3084.2318557276553 +阳江市,中材玉溪,1144.6373012683111 +阳江市,重通昌吉,3296.296079111697 +阳江市,重通大安,2934.1950896198723 +阳江市,重通如东,1492.2186098617835 +阳江市,重通武威,2154.9597992292443 +阳泉市,艾郎玉门,1400.8883246611117 +阳泉市,艾郎张北,339.2397277707181 +阳泉市,时代巴里坤,1777.9466216297014 +阳泉市,时代百色,1671.3873407031529 +阳泉市,时代射阳,793.9619266901165 +阳泉市,时代松原,1099.9430839578222 +阳泉市,时代株洲,1153.7448010780645 +阳泉市,双瑞大丰,868.0944875695624 +阳泉市,双瑞东营,472.362804920637 +阳泉市,天顺濮阳,320.1525597848486 +阳泉市,天顺沙洋,767.5243864362753 +阳泉市,中材白城,1202.7507263506197 +阳泉市,中材阜宁,773.2974362341059 +阳泉市,中材哈密,1777.9466216297014 +阳泉市,中材邯郸,243.94033054571122 +阳泉市,中材酒泉,1400.8883246611117 +阳泉市,中材连云港,685.8962682867219 +阳泉市,中材萍乡,1175.3172317345538 +阳泉市,中材锡林,722.5522824959882 +阳泉市,中材兴安盟,1129.711573860534 +阳泉市,中材阳江,1918.203021700377 +阳泉市,中材伊吾,1777.9466216297014 +阳泉市,中材玉溪,2021.6651467551048 +阳泉市,重通昌吉,2011.8757899904224 +阳泉市,重通大安,1202.7507263506197 +阳泉市,重通如东,945.7562611304659 +阳泉市,重通武威,802.919748501429 +阿勒泰地区,艾郎玉门,1158.9798632901345 +阿勒泰地区,艾郎张北,2374.5976288205206 +阿勒泰地区,时代巴里坤,692.7756426641631 +阿勒泰地区,时代百色,3093.9743986821304 +阿勒泰地区,时代射阳,3229.9340468846813 +阿勒泰地区,时代松原,2930.2690927972576 +阿勒泰地区,时代株洲,3210.678239314978 +阿勒泰地区,双瑞大丰,3307.564447306452 +阿勒泰地区,双瑞东营,2907.3532690665947 +阿勒泰地区,天顺濮阳,2737.565335681865 +阿勒泰地区,天顺沙洋,2888.560260390672 +阿勒泰地区,中材白城,2915.798273459553 +阿勒泰地区,中材阜宁,3214.212113419529 +阿勒泰地区,中材哈密,692.7756426641631 +阿勒泰地区,中材邯郸,2591.3170894327127 +阿勒泰地区,中材酒泉,1158.9798632901345 +阿勒泰地区,中材连云港,3127.3538877337974 +阿勒泰地区,中材萍乡,3272.939288349431 +阿勒泰地区,中材锡林,2265.41574560127 +阿勒泰地区,中材兴安盟,2767.348821325858 +阿勒泰地区,中材阳江,3753.129046042303 +阿勒泰地区,中材伊吾,692.7756426641631 +阿勒泰地区,中材玉溪,3001.592024584059 +阿勒泰地区,重通昌吉,462.45599892057055 +阿勒泰地区,重通大安,2915.798273459553 +阿勒泰地区,重通如东,3376.378632812892 +阿勒泰地区,重通武威,1730.5005711171468 +鞍山市,艾郎玉门,2109.1205374144392 +鞍山市,艾郎张北,670.0283697464007 +鞍山市,时代巴里坤,2385.262320411239 +鞍山市,时代百色,2411.446487003668 +鞍山市,时代射阳,924.306204180487 +鞍山市,时代松原,345.94829216710326 +鞍山市,时代株洲,1718.0261787864176 +鞍山市,双瑞大丰,928.589368970701 +鞍山市,双瑞东营,647.5626707742201 +鞍山市,天顺濮阳,883.9693349114245 +鞍山市,天顺沙洋,1413.2129179274073 +鞍山市,中材白城,481.76999374426254 +鞍山市,中材阜宁,865.9792182886255 +鞍山市,中材哈密,2385.262320411239 +鞍山市,中材邯郸,984.8527168920521 +鞍山市,中材酒泉,2109.1205374144392 +鞍山市,中材连云港,824.200951439736 +鞍山市,中材萍乡,1703.9663175252501 +鞍山市,中材锡林,713.5387359434147 +鞍山市,中材兴安盟,512.5185502871981 +鞍山市,中材阳江,2461.484647124353 +鞍山市,中材伊吾,2385.262320411239 +鞍山市,中材玉溪,2820.6805888521785 +鞍山市,重通昌吉,2599.732977824883 +鞍山市,重通大安,481.76999374426254 +鞍山市,重通如东,1037.2906933539637 +鞍山市,重通武威,1579.4541987165433 +黄冈市,艾郎玉门,2082.186271376267 +黄冈市,艾郎张北,1252.5943345894377 +黄冈市,时代巴里坤,2533.04853102711 +黄冈市,时代百色,1158.6674694075616 +黄冈市,时代射阳,509.100027795182 +黄冈市,时代松原,1733.8049890743084 +黄冈市,时代株洲,356.9600540312457 +黄冈市,双瑞大丰,553.900680852496 +黄冈市,双瑞东营,763.0779096269533 +黄冈市,天顺濮阳,655.9846564160836 +黄冈市,天顺沙洋,356.16521690878056 +黄冈市,中材白城,1866.677116744226 +黄冈市,中材阜宁,564.6193122280496 +黄冈市,中材哈密,2533.04853102711 +黄冈市,中材邯郸,722.1442274335811 +黄冈市,中材酒泉,2082.186271376267 +黄冈市,中材连云港,577.6488771415709 +黄冈市,中材萍乡,321.1165255940992 +黄冈市,中材锡林,1633.5651826606263 +黄冈市,中材兴安盟,1857.534354643927 +黄冈市,中材阳江,1068.3665824985362 +黄冈市,中材伊吾,2533.04853102711 +黄冈市,中材玉溪,1647.4810793090196 +黄冈市,重通昌吉,2767.4351456438108 +黄冈市,重通大安,1866.677116744226 +黄冈市,重通如东,491.9792858854915 +黄冈市,重通武威,1495.27135344524 +黔西南布依族苗族自治州,艾郎玉门,1937.0815076202648 +黔西南布依族苗族自治州,艾郎张北,1959.876369511419 +黔西南布依族苗族自治州,时代巴里坤,2400.6041437211543 +黔西南布依族苗族自治州,时代百色,53.4715015043679 +黔西南布依族苗族自治州,时代射阳,1618.015059623377 +黔西南布依族苗族自治州,时代松原,2677.4037062718526 +黔西南布依族苗族自治州,时代株洲,791.5685542035828 +黔西南布依族苗族自治州,双瑞大丰,1677.1761813904254 +黔西南布依族苗族自治州,双瑞东营,1733.7498646321187 +黔西南布依族苗族自治州,天顺濮阳,1489.5472913846336 +黔西南布依族苗族自治州,天顺沙洋,965.597993920041 +黔西南布依族苗族自治州,中材白城,2795.9903130380394 +黔西南布依族苗族自治州,中材阜宁,1666.0564194853944 +黔西南布依族苗族自治州,中材哈密,2400.6041437211543 +黔西南布依族苗族自治州,中材邯郸,1417.5260732463253 +黔西南布依族苗族自治州,中材酒泉,1937.0815076202648 +黔西南布依族苗族自治州,中材连云港,1649.8689360614876 +黔西南布依族苗族自治州,中材萍乡,852.844872848649 +黔西南布依族苗族自治州,中材锡林,2326.344980095623 +黔西南布依族苗族自治州,中材兴安盟,2742.403699692718 +黔西南布依族苗族自治州,中材阳江,768.3033115211382 +黔西南布依族苗族自治州,中材伊吾,2400.6041437211543 +黔西南布依族苗族自治州,中材玉溪,517.8717690920055 +黔西南布依族苗族自治州,重通昌吉,2598.26868136867 +黔西南布依族苗族自治州,重通大安,2795.9903130380394 +黔西南布依族苗族自治州,重通如东,1625.909903918552 +黔西南布依族苗族自治州,重通武威,1581.3883303169512 +济南市,艾郎玉门,1790.7605213939758 +济南市,艾郎张北,572.4971012525758 +济南市,时代巴里坤,2174.962096327732 +济南市,时代百色,1695.6219106433102 +济南市,时代射阳,414.03451044161534 +济南市,时代松原,1037.5271695408883 +济南市,时代株洲,1019.3270055764149 +济南市,双瑞大丰,480.4250996363163 +济南市,双瑞东营,95.35389641784086 +济南市,天顺濮阳,188.05080204601796 +济南市,天顺沙洋,696.7758964889669 +济南市,中材白城,1164.8472000630295 +济南市,中材阜宁,384.0752603484551 +济南市,中材哈密,2174.962096327732 +济南市,中材邯郸,339.0646824858005 +济南市,中材酒泉,1790.7605213939758 +济南市,中材连云港,296.71118004397624 +济南市,中材萍乡,1015.4633566185237 +济南市,中材锡林,929.0033923338584 +济南市,中材兴安盟,1139.9893062024248 +济南市,中材阳江,1781.0515144198362 +济南市,中材伊吾,2174.962096327732 +济南市,中材玉溪,2115.526524940516 +济南市,重通昌吉,2409.0327544881543 +济南市,重通大安,1164.8472000630295 +济南市,重通如东,569.2200640877873 +济南市,重通武威,1184.8966537947856 +安阳市,艾郎玉门,1573.1174702282174 +安阳市,艾郎张北,600.7603773407532 +安阳市,时代巴里坤,1984.3380540686849 +安阳市,时代百色,1469.0641456674216 +安阳市,时代射阳,574.9810480981419 +安阳市,时代松原,1251.7490273718583 +安阳市,时代株洲,880.3291716140756 +安阳市,双瑞大丰,657.1701349033336 +安阳市,双瑞东营,376.941751364079 +安阳市,天顺濮阳,97.14924207418662 +安阳市,天顺沙洋,505.9077267094271 +安阳市,中材白城,1369.9447436485214 +安阳市,中材阜宁,571.1121974778529 +安阳市,中材哈密,1984.3380540686849 +安阳市,中材邯郸,73.75275257671323 +安阳市,中材酒泉,1573.1174702282174 +安阳市,中材连云港,490.83837074641116 +安阳市,中材萍乡,896.2913246531979 +安阳市,中材锡林,988.4766060485775 +安阳市,中材兴安盟,1321.2753673326943 +安阳市,中材阳江,1649.4055961035951 +安阳市,中材伊吾,1984.3380540686849 +安阳市,中材玉溪,1863.6209019598164 +安阳市,重通昌吉,2220.438684300376 +安阳市,重通大安,1369.9447436485214 +安阳市,重通如东,714.6835329180258 +安阳市,重通武威,961.6179937466466 +白银市,艾郎玉门,775.4290380394375 +白银市,艾郎张北,1032.2001940739597 +白银市,时代巴里坤,1242.1396095817831 +白银市,时代百色,1337.3382685309066 +白银市,时代射阳,1450.7016723917325 +白银市,时代松原,1860.3273084180519 +白银市,时代株洲,1278.2061824041843 +白银市,双瑞大丰,1535.0349448946963 +白银市,双瑞东营,1248.9185304776952 +白银市,天顺濮阳,988.9153123112177 +白银市,天顺沙洋,966.6998234112107 +白银市,中材白城,1939.2862381011964 +白银市,中材阜宁,1456.5269664106063 +白银市,中材哈密,1242.1396095817831 +白银市,中材邯郸,824.3918307462147 +白银市,中材酒泉,775.4290380394375 +白银市,中材连云港,1380.8930750381592 +白银市,中材萍乡,1340.0752607592794 +白银市,中材锡林,1282.6939163864863 +白银市,中材兴安盟,1833.9459045559172 +白银市,中材阳江,1879.0833600912913 +白银市,中材伊吾,1242.1396095817831 +白银市,中材玉溪,1496.7001223130594 +白银市,重通昌吉,1470.7063822594466 +白银市,重通大安,1939.2862381011964 +白银市,重通如东,1572.3148773580103 +白银市,重通武威,298.8881705201778 +毕节市,艾郎玉门,1749.6623802831966 +毕节市,艾郎张北,1760.6566968981117 +毕节市,时代巴里坤,2217.511389363631 +毕节市,时代百色,263.8890065619558 +毕节市,时代射阳,1486.5458392545518 +毕节市,时代松原,2494.4680721018553 +毕节市,时代株洲,714.5302303967114 +毕节市,双瑞大丰,1551.8013195672154 +毕节市,双瑞东营,1567.394238574735 +毕节市,天顺濮阳,1312.482827210405 +毕节市,天顺沙洋,809.965648837139 +毕节市,中材白城,2610.294183266457 +毕节市,中材阜宁,1530.7499577751887 +毕节市,中材哈密,2217.511389363631 +毕节市,中材邯郸,1229.1468071920287 +毕节市,中材酒泉,1749.6623802831966 +毕节市,中材连云港,1505.9777730730036 +毕节市,中材萍乡,784.8064021884402 +毕节市,中材锡林,2122.9458524155734 +毕节市,中材兴安盟,2551.6640621062857 +毕节市,中材阳江,894.1616452953643 +毕节市,中材伊吾,2217.511389363631 +毕节市,中材玉溪,635.7567658325846 +毕节市,重通昌吉,2421.004525265804 +毕节市,重通大安,2610.294183266457 +毕节市,重通如东,1511.5761171815232 +毕节市,重通武威,1373.6330604601608 +邯郸市,艾郎玉门,1571.2978228839957 +邯郸市,艾郎张北,502.14334475982025 +邯郸市,时代巴里坤,1967.399056577157 +邯郸市,时代百色,1573.8661413916486 +邯郸市,时代射阳,590.157212715649 +邯郸市,时代松原,1148.7319141133685 +邯郸市,时代株洲,982.3593277428129 +邯郸市,双瑞大丰,667.8607906591338 +邯郸市,双瑞东营,321.50260617222585 +邯郸市,天顺濮阳,106.34170525305201 +邯郸市,天顺沙洋,611.6467460258666 +邯郸市,中材白城,1265.5876880606434 +邯郸市,中材阜宁,575.592396127138 +邯郸市,中材哈密,1967.399056577157 +邯郸市,中材邯郸,125.38117380470838 +邯郸市,中材酒泉,1571.2978228839957 +邯郸市,中材连云港,489.89177067807384 +邯郸市,中材萍乡,995.5751719063772 +邯郸市,中材锡林,888.6519798581021 +邯郸市,中材兴安盟,1215.19054355043 +邯郸市,中材阳江,1752.1112628678236 +邯郸市,中材伊吾,1967.399056577157 +邯郸市,中材玉溪,1962.8719237169 +邯郸市,重通昌吉,2202.7042843947843 +邯郸市,重通大安,1265.5876880606434 +邯郸市,重通如东,738.9188729215052 +邯郸市,重通武威,962.3242772731687 +七台河市,艾郎玉门,2775.0949217278176 +七台河市,艾郎张北,1436.896085889718 +七台河市,时代巴里坤,2952.23341939608 +七台河市,时代百色,3260.0835241514997 +七台河市,时代射阳,1695.320602603145 +七台河市,时代松原,609.5219691824275 +七台河市,时代株洲,2538.8708403645383 +七台河市,双瑞大丰,1673.0242782178873 +七台河市,双瑞东营,1488.6700162848567 +七台河市,天顺濮阳,1737.1764592936665 +七台河市,天顺沙洋,2258.508112021149 +七台河市,中材白城,552.9115722685245 +七台河市,中材阜宁,1637.1886575239416 +七台河市,中材哈密,2952.23341939608 +七台河市,中材邯郸,1837.3101114680862 +七台河市,中材酒泉,2775.0949217278176 +七台河市,中材连云港,1619.358755044141 +七台河市,中材萍乡,2515.882916365035 +七台河市,中材锡林,1273.1448132897326 +七台河市,中材兴安盟,690.7322234873455 +七台河市,中材阳江,3253.8801769423826 +七台河市,中材伊吾,2952.23341939608 +七台河市,中材玉溪,3674.6082899643316 +七台河市,重通昌吉,3136.278346756651 +七台河市,重通大安,552.9115722685245 +七台河市,重通如东,1770.0363552264437 +七台河市,重通武威,2327.0860065587844 +通化市,艾郎玉门,2398.9543719510993 +通化市,艾郎张北,967.535085300011 +通化市,时代巴里坤,2657.297873682401 +通化市,时代百色,2661.095890332437 +通化市,时代射阳,1092.1226053060802 +通化市,时代松原,347.7032810993784 +通化市,时代株洲,1932.551640040157 +通化市,双瑞大丰,1074.733861921796 +通化市,双瑞东营,890.1615280469341 +通化市,天顺濮阳,1150.7178850509003 +通化市,天顺沙洋,1658.607475499677 +通化市,中材白城,450.75162349669273 +通化市,中材阜宁,1033.6180031251588 +通化市,中材哈密,2657.297873682401 +通化市,中材邯郸,1266.1454697481813 +通化市,中材酒泉,2398.9543719510993 +通化市,中材连云港,1013.2653692835922 +通化市,中材萍乡,1909.6998279358907 +通化市,中材锡林,955.6820306300402 +通化市,中材兴安盟,559.4195219304794 +通化市,中材阳江,2650.7860778616323 +通化市,中材伊吾,2657.297873682401 +通化市,中材玉溪,3087.020260961845 +通化市,重通昌吉,2866.2289703231027 +通化市,重通大安,450.75162349669273 +通化市,重通如东,1175.549172900447 +通化市,重通武威,1878.6658617959756 +盐城市,艾郎玉门,2195.454590290856 +盐城市,艾郎张北,1003.2019610088755 +盐城市,时代巴里坤,2598.9655866595413 +盐城市,时代百色,1698.1591463294326 +盐城市,时代射阳,57.40876459057743 +盐城市,时代松原,1251.6200207111156 +盐城市,时代株洲,909.7697896330618 +盐城市,双瑞大丰,36.84459463919456 +盐城市,双瑞东营,403.01852096408356 +盐城市,天顺濮阳,538.356862712033 +盐城市,天顺沙洋,746.9159761327664 +盐城市,中材白城,1387.5762426718309 +盐城市,中材阜宁,59.7374812470025 +盐城市,中材哈密,2598.9655866595413 +盐城市,中材邯郸,696.5211657495468 +盐城市,中材酒泉,2195.454590290856 +盐城市,中材连云港,146.91978092075146 +盐城市,中材萍乡,873.4738291843979 +盐城市,中材锡林,1330.3794345430947 +盐城市,中材兴安盟,1406.2740400741507 +盐城市,中材阳江,1593.1931412228073 +盐城市,中材伊吾,2598.9655866595413 +盐城市,中材玉溪,2172.5907850354256 +盐城市,重通昌吉,2834.4142593658844 +盐城市,重通大安,1387.5762426718309 +盐城市,重通如东,139.8501205852453 +盐城市,重通武威,1584.0829154604512 +本溪市,艾郎玉门,2215.7282934122477 +本溪市,艾郎张北,779.5862327935512 +本溪市,时代巴里坤,2484.749373516501 +本溪市,时代百色,2502.993529730371 +本溪市,时代射阳,979.7275500871874 +本溪市,时代松原,313.826499062962 +本溪市,时代株洲,1795.1398977963627 +本溪市,双瑞大丰,975.1975379098004 +本溪市,双瑞东营,732.7673286698541 +本溪市,天顺濮阳,980.7152992834323 +本溪市,天顺沙洋,1502.1408134656313 +本溪市,中材白城,446.72677660227856 +本溪市,中材阜宁,920.854499350254 +本溪市,中材哈密,2484.749373516501 +本溪市,中材邯郸,1087.957763827612 +本溪市,中材酒泉,2215.7282934122477 +本溪市,中材连云港,887.6502417544203 +本溪市,中材萍乡,1777.5882250083973 +本溪市,中材锡林,797.9258988518525 +本溪市,中材兴安盟,509.23385763745665 +本溪市,中材阳江,2529.7618927527124 +本溪市,中材伊吾,2484.749373516501 +本溪市,中材玉溪,2918.8383537014297 +本溪市,重通昌吉,2697.084607667587 +本溪市,重通大安,446.72677660227856 +本溪市,重通如东,1081.5689255921914 +本溪市,重通武威,1689.9248293294615 +鹤岗市,艾郎玉门,2724.7608632352 +鹤岗市,艾郎张北,1443.0227124805144 +鹤岗市,时代巴里坤,2873.9306173913 +鹤岗市,时代百色,3330.3549673907496 +鹤岗市,时代射阳,1804.329843136389 +鹤岗市,时代松原,624.0761118777252 +鹤岗市,时代株洲,2632.006172522917 +鹤岗市,双瑞大丰,1789.0012945136484 +鹤岗市,双瑞东营,1566.9961805585078 +鹤岗市,天顺濮阳,1800.1779947795003 +鹤岗市,天顺沙洋,2333.51029654291 +鹤岗市,中材白城,531.4541115518325 +鹤岗市,中材阜宁,1745.5870664261247 +鹤岗市,中材哈密,2873.9306173913 +鹤岗市,中材邯郸,1887.0611746233365 +鹤岗市,中材酒泉,2724.7608632352 +鹤岗市,中材连云港,1720.0202646815324 +鹤岗市,中材萍乡,2613.5560792734855 +鹤岗市,中材锡林,1232.6533336921289 +鹤岗市,中材兴安盟,646.5775494106848 +鹤岗市,中材阳江,3361.5348252039544 +鹤岗市,中材伊吾,2873.9306173913 +鹤岗市,中材玉溪,3729.1793904246615 +鹤岗市,重通昌吉,3049.2651763427752 +鹤岗市,重通大安,531.4541115518325 +鹤岗市,重通如东,1889.8781398130268 +鹤岗市,重通武威,2308.499200874473 +开封市,艾郎玉门,1646.1564783442814 +开封市,艾郎张北,702.2255036270151 +开封市,时代巴里坤,2066.6156411344846 +开封市,时代百色,1402.9169428786342 +开封市,时代射阳,509.79578991266743 +开封市,时代松原,1317.9947315424538 +开封市,时代株洲,782.2741943157625 +开封市,双瑞大丰,593.9282887814512 +开封市,双瑞东营,390.59793234914775 +开封市,天顺濮阳,128.43255271335892 +开封市,天顺沙洋,418.6989118389049 +开封市,中材白城,1440.0893446540576 +开封市,中材阜宁,515.4420097882472 +开封市,中材哈密,2066.6156411344846 +开封市,中材邯郸,165.70206258879347 +开封市,中材酒泉,1646.1564783442814 +开封市,中材连云港,443.0240675447073 +开封市,中材萍乡,794.980952384541 +开封市,中材锡林,1089.1511308242043 +开封市,中材兴安盟,1399.2885999824875 +开封市,中材阳江,1552.2147049744165 +开封市,中材伊吾,2066.6156411344846 +开封市,中材玉溪,1814.467966001877 +开封市,重通昌吉,2302.8990753646794 +开封市,重通大安,1440.0893446540576 +开封市,重通如东,639.370872495803 +开封市,重通武威,1035.6543895692769 +洛阳市,艾郎玉门,1502.7260856124608 +洛阳市,艾郎张北,730.6483691855686 +洛阳市,时代巴里坤,1935.141482703638 +洛阳市,时代百色,1299.7894688557978 +洛阳市,时代射阳,673.1449093230958 +洛阳市,时代松原,1425.9520639190437 +洛阳市,时代株洲,768.3795399469444 +洛阳市,双瑞大丰,757.5834668922703 +洛阳市,双瑞东营,547.0284847787138 +洛阳市,天顺濮阳,265.70757880124745 +洛阳市,天顺沙洋,377.8057519626183 +洛阳市,中材白城,1541.7757047838606 +洛阳市,中材阜宁,683.0173458645937 +洛阳市,中材哈密,1935.141482703638 +洛阳市,中材邯郸,162.551871658974 +洛阳市,中材酒泉,1502.7260856124608 +洛阳市,中材连云港,613.0467145345749 +洛阳市,中材萍乡,796.8651613951056 +洛阳市,中材锡林,1115.7420297224646 +洛阳市,中材兴安盟,1487.2062409851553 +洛阳市,中材阳江,1527.4526198045467 +洛阳市,中材伊吾,1935.141482703638 +洛阳市,中材玉溪,1685.7054834864596 +洛阳市,重通昌吉,2171.1986710162864 +洛阳市,重通大安,1541.7757047838606 +洛阳市,重通如东,793.8776507727661 +洛阳市,重通武威,896.8897623556106 +莆田市,艾郎玉门,2642.27299099642 +莆田市,艾郎张北,1792.739359132997 +莆田市,时代巴里坤,3100.589151071622 +莆田市,时代百色,1322.10061171747 +莆田市,时代射阳,874.6030340503561 +莆田市,时代松原,2135.3309883383295 +莆田市,时代株洲,639.234480049722 +莆田市,双瑞大丰,861.6852141016177 +莆田市,双瑞东营,1236.3806337700335 +莆田市,天顺濮阳,1207.138466769455 +莆田市,天顺沙洋,904.8537980446652 +莆田市,中材白城,2271.375039599375 +莆田市,中材阜宁,930.4929923123985 +莆田市,中材哈密,3100.589151071622 +莆田市,中材邯郸,1295.339661334851 +莆田市,中材酒泉,2642.27299099642 +莆田市,中材连云港,989.7021625363956 +莆田市,中材萍乡,564.8665841650932 +莆田市,中材锡林,2159.9381619826568 +莆田市,中材兴安盟,2291.6678041368896 +莆田市,中材阳江,870.3510073576036 +莆田市,中材伊吾,3100.589151071622 +莆田市,中材玉溪,1824.723645237934 +莆田市,重通昌吉,3333.371055976533 +莆田市,重通大安,2271.375039599375 +莆田市,重通如东,753.1704825971385 +莆田市,重通武威,2067.5430836234937 +新乡市,艾郎玉门,1584.1065491338286 +新乡市,艾郎张北,659.5265839254556 +新乡市,时代巴里坤,2002.9583870402766 +新乡市,时代百色,1411.5925684791432 +新乡市,时代射阳,568.1051634334559 +新乡市,时代松原,1308.336934924629 +新乡市,时代株洲,821.2279665131717 +新乡市,双瑞大丰,651.7982083077904 +新乡市,双瑞东营,412.0906151911424 +新乡市,天顺濮阳,131.2288630453136 +新乡市,天顺沙洋,445.5968858249072 +新乡市,中材白城,1427.508418914448 +新乡市,中材阜宁,570.4541703320286 +新乡市,中材哈密,2002.9583870402766 +新乡市,中材邯郸,103.42499018840705 +新乡市,中材酒泉,1584.1065491338286 +新乡市,中材连云港,494.7045758108209 +新乡市,中材萍乡,838.4440002826882 +新乡市,中材锡林,1047.3850448047156 +新乡市,中材兴安盟,1380.3914145107804 +新乡市,中材阳江,1589.9132353540704 +新乡市,中材伊吾,2002.9583870402766 +新乡市,中材玉溪,1810.8134373654664 +新乡市,重通昌吉,2239.23128837004 +新乡市,重通大安,1427.508418914448 +新乡市,重通如东,700.8688098785877 +新乡市,重通武威,973.2075343444384 +伊犁哈萨克自治州,艾郎玉门,4939.430947121915 +伊犁哈萨克自治州,艾郎张北,5172.97224215588 +伊犁哈萨克自治州,时代巴里坤,4537.330016956597 +伊犁哈萨克自治州,时代百色,6860.153204943409 +伊犁哈萨克自治州,时代射阳,6111.093892782699 +伊犁哈萨克自治州,时代松原,4977.625786165645 +伊犁哈萨克自治州,时代株洲,6606.112905956122 +伊犁哈萨克自治州,双瑞大丰,6147.638311246011 +伊犁哈萨克自治州,双瑞东营,5732.3567278478085 +伊犁哈萨克自治州,天顺濮阳,5767.489503729985 +伊犁哈萨克自治州,天顺沙洋,6214.592015606789 +伊犁哈萨克自治州,中材白城,4854.11706999731 +伊犁哈萨克自治州,中材阜宁,6061.688997597333 +伊犁哈萨克自治州,中材哈密,4537.330016956597 +伊犁哈萨克自治州,中材邯郸,5711.515673747557 +伊犁哈萨克自治州,中材酒泉,4939.430947121915 +伊犁哈萨克自治州,中材连云港,5989.323704435105 +伊犁哈萨克自治州,中材萍乡,6637.312213931616 +伊犁哈萨克自治州,中材锡林,4802.4012207323285 +伊犁哈萨克自治州,中材兴安盟,4778.395771151972 +伊犁哈萨克自治州,中材阳江,7339.702808030153 +伊犁哈萨克自治州,中材伊吾,4537.330016956597 +伊犁哈萨克自治州,中材玉溪,6931.348602569769 +伊犁哈萨克自治州,重通昌吉,4412.546099106517 +伊犁哈萨克自治州,重通大安,4854.11706999731 +伊犁哈萨克自治州,重通如东,6255.808892890267 +伊犁哈萨克自治州,重通武威,5227.431436732243 +镇江市,艾郎玉门,2201.61560748964 +镇江市,艾郎张北,1089.8806678596777 +镇江市,时代巴里坤,2619.9067814135174 +镇江市,时代百色,1572.20859743226 +镇江市,时代射阳,125.21681644174157 +镇江市,时代松原,1393.9792250458668 +镇江市,时代株洲,774.206410711033 +镇江市,双瑞大丰,138.67279325494437 +镇江市,双瑞东营,500.60262682666394 +镇江市,天顺濮阳,565.9144992875508 +镇江市,天顺沙洋,653.6308253916283 +镇江市,中材白城,1529.7460759630399 +镇江市,中材阜宁,182.31857315324467 +镇江市,中材哈密,2619.9067814135174 +镇江市,中材邯郸,708.9808577820265 +镇江市,中材酒泉,2201.61560748964 +镇江市,中材连云港,242.89895849090482 +镇江市,中材萍乡,733.7680415567364 +镇江市,中材锡林,1435.096784196045 +镇江市,中材兴安盟,1543.7798156095062 +镇江市,中材阳江,1446.2687834887138 +镇江市,中材伊吾,2619.9067814135174 +镇江市,中材玉溪,2054.0909067076664 +镇江市,重通昌吉,2856.096665589703 +镇江市,重通大安,1529.7460759630399 +镇江市,重通如东,93.52163785649913 +镇江市,重通武威,1591.1815226406584 +上海市,艾郎玉门,2412.811611581566 +上海市,艾郎张北,1270.5449474423199 +上海市,时代巴里坤,2830.5498387690845 +上海市,时代百色,1679.5248655763487 +上海市,时代射阳,291.41199125726894 +上海市,时代松原,1477.4905945357668 +上海市,时代株洲,868.8404434726631 +上海市,双瑞大丰,233.54219810404336 +上海市,双瑞东营,670.9325398141038 +上海市,天顺濮阳,773.2207625664083 +上海市,天顺沙洋,827.1525353977108 +上海市,中材白城,1613.2331998467669 +上海市,中材阜宁,327.1319272733288 +上海市,中材哈密,2830.5498387690845 +上海市,中材邯郸,919.447139500189 +上海市,中材酒泉,2412.811611581566 +上海市,中材连云港,411.06848278786936 +上海市,中材萍乡,814.3468896997239 +上海市,中材锡林,1597.989154581868 +上海市,中材兴安盟,1645.0560711072947 +上海市,中材阳江,1458.8007961381818 +上海市,中材伊吾,2830.5498387690845 +上海市,中材玉溪,2174.24362943687 +上海市,重通昌吉,3066.6954327234657 +上海市,重通大安,1613.2331998467669 +上海市,重通如东,136.597854045206 +上海市,重通武威,1802.4080471760508 +桂林市,艾郎玉门,2110.934257664787 +桂林市,艾郎张北,1800.4786015891505 +桂林市,时代巴里坤,2584.6639150223223 +桂林市,时代百色,448.943267676672 +桂林市,时代射阳,1265.1449077108402 +桂林市,时代松原,2429.6510299223646 +桂林市,时代株洲,401.7355681460306 +桂林市,双瑞大丰,1312.2882568588518 +桂林市,双瑞东营,1454.812115682995 +桂林市,天顺濮阳,1253.2671364630924 +桂林市,天顺沙洋,708.5974121670846 +桂林市,中材白城,2556.7465287732366 +桂林市,中材阜宁,1318.8119947633352 +桂林市,中材哈密,2584.6639150223223 +桂林市,中材邯郸,1227.4585174110402 +桂林市,中材酒泉,2110.934257664787 +桂林市,中材连云港,1319.943570730317 +桂林市,中材萍乡,444.90361925207526 +桂林市,中材锡林,2185.3100260409406 +桂林市,中材兴安盟,2524.2948784696414 +桂林市,中材阳江,508.48542672722044 +桂林市,中材伊吾,2584.6639150223223 +桂林市,中材玉溪,954.8719758704814 +桂林市,重通昌吉,2800.406821912123 +桂林市,重通大安,2556.7465287732366 +桂林市,重通如东,1245.2403104788166 +桂林市,重通武威,1646.5352326394693 +呼和浩特市,艾郎玉门,1203.1178317816969 +呼和浩特市,艾郎张北,258.65601054558726 +呼和浩特市,时代巴里坤,1538.565988809858 +呼和浩特市,时代百色,1849.9679955357997 +呼和浩特市,时代射阳,1076.0338749390996 +呼和浩特市,时代松原,1081.3837385320082 +呼和浩特市,时代株洲,1414.9865200404702 +呼和浩特市,双瑞大丰,1146.2143198514082 +呼和浩特市,双瑞东营,725.392881903102 +呼和浩特市,天顺濮阳,613.1772218183675 +呼和浩特市,天顺沙洋,1023.570778025977 +呼和浩特市,中材白城,1157.944330957905 +呼和浩特市,中材阜宁,1050.1133485576236 +呼和浩特市,中材哈密,1538.565988809858 +呼和浩特市,中材邯郸,521.8117959725528 +呼和浩特市,中材酒泉,1203.1178317816969 +呼和浩特市,中材连云港,962.5071789543055 +呼和浩特市,中材萍乡,1443.5248574820273 +呼和浩特市,中材锡林,535.5189649333067 +呼和浩特市,中材兴安盟,1054.669384465011 +呼和浩特市,中材阳江,2168.101416652533 +呼和浩特市,中材伊吾,1538.565988809858 +呼和浩特市,中材玉溪,2148.886849854554 +呼和浩特市,重通昌吉,1768.2584307163418 +呼和浩特市,重通大安,1157.944330957905 +呼和浩特市,重通如东,1229.8695042946267 +呼和浩特市,重通武威,654.0009688098742 +济宁市,艾郎玉门,1779.5977240949987 +济宁市,艾郎张北,657.5496035568729 +济宁市,时代巴里坤,2180.924408554174 +济宁市,时代百色,1573.4374949380326 +济宁市,时代射阳,375.46248884092387 +济宁市,时代松原,1163.042973582432 +济宁市,时代株洲,894.8363393073131 +济宁市,双瑞大丰,453.8031528069236 +济宁市,双瑞东营,200.04782443850073 +济宁市,天顺濮阳,122.37297746227921 +济宁市,天顺沙洋,572.8234496342436 +济宁市,中材白城,1290.3502024019883 +济宁市,中材阜宁,362.9391987872942 +济宁市,中材哈密,2180.924408554174 +济宁市,中材邯郸,286.20912790608605 +济宁市,中材酒泉,1779.5977240949987 +济宁市,中材连云港,279.1459634891106 +济宁市,中材萍乡,892.6412367468488 +济宁市,中材锡林,1028.642787523355 +济宁市,中材兴安盟,1264.2157425908608 +济宁市,中材阳江,1658.3421278834217 +济宁市,中材伊吾,2180.924408554174 +济宁市,中材玉溪,1999.2183817116122 +济宁市,重通昌吉,2416.4349336997743 +济宁市,重通大安,1290.3502024019883 +济宁市,重通如东,524.6615314761206 +济宁市,重通武威,1168.8291860096137 +天门市,艾郎玉门,1829.067635736717 +天门市,艾郎张北,1168.9804485867799 +天门市,时代巴里坤,2287.6568751829773 +天门市,时代百色,987.9048127953816 +天门市,时代射阳,671.6072851943644 +天门市,时代松原,1770.1955408965098 +天门市,时代株洲,312.626365895017 +天门市,双瑞大丰,738.6537239118192 +天门市,双瑞东营,798.0966181961775 +天门市,天顺濮阳,597.4813036914763 +天门市,天顺沙洋,92.91301229765233 +天门市,中材白城,1896.9915597961328 +天门市,中材阜宁,715.8564092353224 +天门市,中材哈密,2287.6568751829773 +天门市,中材邯郸,597.5000878598046 +天门市,中材酒泉,1829.067635736717 +天门市,中材连云港,695.2115488833118 +天门市,中材萍乡,339.60832854492963 +天门市,中材锡林,1556.8708674939244 +天门市,中材兴安盟,1865.702041542109 +天门市,中材阳江,1080.0860322722579 +天门市,中材伊吾,2287.6568751829773 +天门市,中材玉溪,1448.7954165472024 +天门市,重通昌吉,2520.1347026282147 +天门市,重通大安,1896.9915597961328 +天门市,重通如东,708.0064624830203 +天门市,重通武威,1257.9749176412129 +黔南布依族苗族自治州,艾郎玉门,1910.7548601783415 +黔南布依族苗族自治州,艾郎张北,1888.8164457659996 +黔南布依族苗族自治州,时代巴里坤,2377.489246917974 +黔南布依族苗族自治州,时代百色,119.06219452109269 +黔南布依族苗族自治州,时代射阳,1539.4005912020434 +黔南布依族苗族自治州,时代松原,2601.1387658239623 +黔南布依族苗族自治州,时代株洲,716.8105272702009 +黔南布依族苗族自治州,双瑞大丰,1598.8841699355262 +黔南布依族苗族自治州,双瑞东营,1655.5681098407665 +黔南布依族苗族自治州,天顺濮阳,1412.6930423326287 +黔南布依族苗族自治州,天顺沙洋,887.0556817652746 +黔南布依族苗族自治州,中材白城,2720.2639226677697 +黔南布依族苗族自治州,中材阜宁,1587.308155451847 +黔南布依族苗族自治州,中材哈密,2377.489246917974 +黔南布依族苗族自治州,中材邯郸,1343.0067525278691 +黔南布依族苗族自治州,中材酒泉,1910.7548601783415 +黔南布依族苗族自治州,中材连云港,1570.9466388694866 +黔南布依族苗族自治州,中材萍乡,779.5762345189872 +黔南布依族苗族自治州,中材锡林,2257.476593321946 +黔南布依族苗族自治州,中材兴安盟,2667.9467880715365 +黔南布依族苗族自治州,中材阳江,754.5090953904376 +黔南布依族苗族自治州,中材伊吾,2377.489246917974 +黔南布依族苗族自治州,中材玉溪,591.9265055558036 +黔南布依族苗族自治州,重通昌吉,2579.117401562049 +黔南布依族苗族自治州,重通大安,2720.2639226677697 +黔南布依族苗族自治州,重通如东,1548.3773908049875 +黔南布依族苗族自治州,重通武威,1535.0443814662362 +黔东南苗族侗族自治州,艾郎玉门,1967.521346191245 +黔东南苗族侗族自治州,艾郎张北,1891.2125465309184 +黔东南苗族侗族自治州,时代巴里坤,2436.1403766292683 +黔东南苗族侗族自治州,时代百色,147.593176009699 +黔东南苗族侗族自治州,时代射阳,1500.7374349535753 +黔东南苗族侗族自治州,时代松原,2587.9225636798114 +黔东南苗族侗族自治州,时代株洲,663.517690490883 +黔东南苗族侗族自治州,双瑞大丰,1557.5465933705423 +黔东南苗族侗族自治州,双瑞东营,1633.6083962240366 +黔东南苗族侗族自治州,天顺濮阳,1398.2910084036546 +黔东南苗族侗族自治州,天顺沙洋,863.7738817752976 +黔东南苗族侗族自治州,中材白城,2708.958571245718 +黔东南苗族侗族自治州,中材阜宁,1550.1260416290345 +黔东南苗族侗族自治州,中材哈密,2436.1403766292683 +黔东南苗族侗族自治州,中材邯郸,1337.1946642735968 +黔东南苗族侗族自治州,中材酒泉,1967.521346191245 +黔东南苗族侗族自治州,中材连云港,1537.6588706876562 +黔东南苗族侗族自治州,中材萍乡,722.9016459217405 +黔东南苗族侗族自治州,中材锡林,2264.2273584225327 +黔东南苗族侗族自治州,中材兴安盟,2660.78936359328 +黔东南苗族侗族自治州,中材阳江,680.9807889077367 +黔东南苗族侗族自治州,中材伊吾,2436.1403766292683 +黔东南苗族侗族自治州,中材玉溪,649.0707233593354 +黔东南苗族侗族自治州,重通昌吉,2640.2489232525113 +黔东南苗族侗族自治州,重通大安,2708.958571245718 +黔东南苗族侗族自治州,重通如东,1502.9565853143051 +黔东南苗族侗族自治州,重通武威,1574.9209976445593 diff --git a/data/factory_mapping.json b/data/factory_mapping.json new file mode 100644 index 0000000..dfbc33b --- /dev/null +++ b/data/factory_mapping.json @@ -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" +} diff --git a/data/ga_best_params.json b/data/ga_best_params.json new file mode 100644 index 0000000..621b9f5 --- /dev/null +++ b/data/ga_best_params.json @@ -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 +} \ No newline at end of file diff --git a/data/ga_two_best_params.json b/data/ga_two_best_params.json new file mode 100644 index 0000000..03a97ca --- /dev/null +++ b/data/ga_two_best_params.json @@ -0,0 +1,5 @@ +{ + "best_score": 0.013780913115116374, + "factor_ZhongcaiBaicheng": 1.8461095046937892, + "factor_ZhongcaiHami": 1.4843503931169255 +} \ No newline at end of file diff --git a/data/model_params.json b/data/model_params.json new file mode 100644 index 0000000..6f5a806 --- /dev/null +++ b/data/model_params.json @@ -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" + ] +} diff --git a/data/month_hours.json b/data/month_hours.json new file mode 100644 index 0000000..79a9196 --- /dev/null +++ b/data/month_hours.json @@ -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 +} diff --git a/data/product.csv b/data/product.csv new file mode 100644 index 0000000..b9146ef --- /dev/null +++ b/data/product.csv @@ -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 diff --git a/data/transportation_price.csv b/data/transportation_price.csv new file mode 100644 index 0000000..5ee6b35 --- /dev/null +++ b/data/transportation_price.csv @@ -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 , +,,, diff --git a/demand_agent.py b/demand_agent.py new file mode 100644 index 0000000..25f53e3 --- /dev/null +++ b/demand_agent.py @@ -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) diff --git a/environment.yml b/environment.yml new file mode 100644 index 0000000..0988be4 --- /dev/null +++ b/environment.yml @@ -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 diff --git a/ga_two_factor_calibration.py b/ga_two_factor_calibration.py new file mode 100644 index 0000000..244fbd1 --- /dev/null +++ b/ga_two_factor_calibration.py @@ -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() diff --git a/genetic_calibration.py b/genetic_calibration.py new file mode 100644 index 0000000..8b397a7 --- /dev/null +++ b/genetic_calibration.py @@ -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() diff --git a/production_line.py b/production_line.py new file mode 100644 index 0000000..ac7aeec --- /dev/null +++ b/production_line.py @@ -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, + ) diff --git a/schedule_pulp.py b/schedule_pulp.py new file mode 100644 index 0000000..d9f2b55 --- /dev/null +++ b/schedule_pulp.py @@ -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 '异常'}") diff --git a/simulation_model.py b/simulation_model.py new file mode 100644 index 0000000..b044f83 --- /dev/null +++ b/simulation_model.py @@ -0,0 +1,1054 @@ +import json +import pandas as pd +import os +from datetime import datetime +import matplotlib +matplotlib.use('TkAgg') +import matplotlib.pyplot as plt +from mesa.datacollection import DataCollector +from mesa.model import Model +import pulp + +from production_line import ProductionLineAgent +from demand_agent import DemandAgent + +# Configure matplotlib fonts for Chinese output in plots. +matplotlib.rcParams["font.family"] = ["Microsoft YaHei", "SimHei", "sans-serif"] +matplotlib.rcParams["axes.unicode_minus"] = False + + +class SimulationModel(Model): + """ + Minimal model that instantiates one ProductionLineAgent per production line + entry and tracks the number of lines per region over time. + """ + + def __init__( + self, + month1: float | None = None, + month2: float | None = None, + month3: float | None = None, + month4: float | None = None, + factory_factors: dict | None = None, + output_enabled: bool = False, + is_within_region_allocation_only: bool | None = None, + product_set: tuple | list | set | str | None = None, + **kwargs, + ): + super().__init__() + cfg = self._load_model_params() + # Apply overrides if provided + self.month_holiday_days = self._load_month_holiday_days(cfg) + self.ramp_ranges = { + 1: float(month1 if month1 is not None else cfg["month1"]), + 2: float(month2 if month2 is not None else cfg["month2"]), + 3: float(month3 if month3 is not None else cfg["month3"]), + 4: float(month4 if month4 is not None else cfg["month4"]), + } + self.factory_mapping = self._load_factory_mapping() + self.factory_factors = self._load_factory_factors(cfg) + merged_factors = {} + merged_factors.update({k: v for k, v in kwargs.items() if k.startswith("factor_")}) + if factory_factors: + merged_factors.update(factory_factors) + if merged_factors: + self._merge_factory_factors(merged_factors) + self.default_new_factory_factor = cfg.get("factor_default", 1.3) + self.within_region_only = self._to_bool( + is_within_region_allocation_only if is_within_region_allocation_only is not None else cfg.get("is_within_region_allocation_only", False) + ) + self.current_month = 1 + self.cumulative_production = 0 + self.monthly_totals = {} + self.production_log = [] + self.mean_abs_error = 0.0 + # Allow explicit product_set override; otherwise fall back to config. + self.product_set = self._parse_product_set(product_set if product_set is not None else cfg.get("product_set")) + self.output_enabled = output_enabled + self.region_totals = {} + self.factory_error_df = None + self.demand_agents = [] + self.region_demand_totals = {} + self.region_alloc_inventory = {} + self.region_demand_fulfilled = {} + self.backlog_city_prod = {} + self.region_fulfill_pct = {} + self.region_unmet_backlog = {} + self.region_transport_month = {} + self.inv_history = [] + self.fulfill_history_month = [] + self.fulfill_history_cum = [] + self.unmet_history = [] + self.assignment_log = [] + self.overall_fulfill_pct = 0.0 + self.monthly_transport_cost = 0.0 + self.fulfill_overall_history = [] + self.transport_cost_history = [] + self.transport_units_history = [] + self.product_names = set() + self.product_list = [] + self.monthly_allocation_summary = [] + + self._load_month_hours() + self._load_agents_from_csv() + self._load_demand_agents_from_csv() + self._load_transport_data() + + # Initialize fulfillment tracking before the first DataCollector run + demand_regions = getattr(self, "demand_regions", []) + self.region_fulfill_pct_month = {r: 0 for r in demand_regions} + self.region_fulfill_pct_cum = {r: 0 for r in demand_regions} + self.region_transport_month = {r: 0 for r in demand_regions} + + reporters = { + region: (lambda m, region=region: m.region_totals.get(region, 0)) + for region in self.region_names + } + reporters.update( + {f"demand_{region}": (lambda m, region=region: m.region_demand_totals.get(region, 0)) + for region in self.demand_regions} + ) + reporters.update( + { + f"inventory_{region}": (lambda m, region=region: m.region_alloc_inventory.get(region, 0)) + for region in self.region_names + } + ) + reporters.update( + { + f"demand_fulfilled_{region}": (lambda m, region=region: m.region_demand_fulfilled.get(region, 0)) + for region in self.demand_regions + } + ) + reporters.update( + { + "cumulative_production": lambda m: m.cumulative_production, + "monthly_total": lambda m: m.monthly_totals.get(m.current_month, 0), + "mean_abs_error": lambda m: m.mean_abs_error, + "fulfill_pct_overall": lambda m: m.overall_fulfill_pct, + "transport_cost": lambda m: m.monthly_transport_cost, + } + ) + reporters.update( + {f"demand_{region}": (lambda m, region=region: m.region_demand_totals.get(region, 0)) + for region in self.demand_regions} + ) + reporters.update( + { + f"inventory_{region}": (lambda m, region=region: m.region_alloc_inventory.get(region, 0)) + for region in self.region_names + } + ) + reporters.update( + { + f"fulfill_pct_{region}": (lambda m, region=region: m.region_fulfill_pct.get(region, 0)) + for region in self.demand_regions + } + ) + reporters.update( + { + f"unmet_{region}": (lambda m, region=region: m.region_unmet_backlog.get(region, 0)) + for region in self.demand_regions + } + ) + reporters.update( + { + f"transport_units_{region}": (lambda m, region=region: m.region_transport_month.get(region, 0)) + for region in self.demand_regions + } + ) + # Ensure fulfillment tracking exists before reporter access + if not hasattr(self, "region_fulfill_pct_month"): + self.region_fulfill_pct_month = {r: 0 for r in self.demand_regions} + if not hasattr(self, "region_fulfill_pct_cum"): + self.region_fulfill_pct_cum = {r: 0 for r in self.demand_regions} + reporters.update( + { + f"fulfill_month_{region}": (lambda m, region=region: m.region_fulfill_pct_month.get(region, 0)) + for region in self.demand_regions + } + ) + reporters.update( + { + f"fulfill_cum_{region}": (lambda m, region=region: m.region_fulfill_pct_cum.get(region, 0)) + for region in self.demand_regions + } + ) + self.datacollector = DataCollector(model_reporters=reporters) + self.running = True + self.datacollector.collect(self) + + def _get_output_timestamp(self) -> str: + if not hasattr(self, "_output_timestamp"): + self._output_timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") + return self._output_timestamp + + def _load_month_hours(self): + with open("data/month_hours.json", "r", encoding="utf-8") as f: + self.month_days = {int(k): v for k, v in json.load(f).items()} + + def _load_model_params(self): + with open("data/model_params.json", "r", encoding="utf-8") as f: + return json.load(f) + + def _load_month_holiday_days(self, cfg: dict) -> dict: + # Default 2 days off per month unless overridden + holidays = {m: 2 for m in range(1, 13)} + for m in range(1, 13): + key = f"holiday_days_{m}" + if key in cfg: + try: + holidays[m] = int(float(cfg[key])) + except Exception: + continue + return holidays + + def _sanitize_product(self, name: str) -> str: + return str(name).replace("-", "").replace(".", "") + + def _load_factory_mapping(self) -> dict: + with open("data/factory_mapping.json", "r", encoding="utf-8") as f: + return json.load(f) + + def _parse_product_set(self, val) -> tuple: + if val is None: + return tuple() + if isinstance(val, str): + stripped = val.strip() + if stripped.startswith("(") and stripped.endswith(")"): + stripped = stripped[1:-1] + parts = [p.strip() for p in stripped.split(",") if p.strip()] + return tuple(parts) + if isinstance(val, (list, tuple, set)): + return tuple(str(v).strip() for v in val if str(v).strip()) + return tuple() + + def _to_bool(self, val): + if isinstance(val, str): + return val.strip().lower() in {"true", "1", "yes", "y", "是", "对"} + return bool(val) + + def _load_factory_factors(self, cfg: dict) -> dict: + factors = {} + for key, val in cfg.items(): + if key.startswith("factor_"): + suffix = key[len("factor_") :] + factors[suffix] = float(val) + return factors + + def _merge_factory_factors(self, overrides: dict): + for key, val in overrides.items(): + suffix = key + if key.startswith("factor_"): + suffix = key[len("factor_") :] + self.factory_factors[self._sanitize_product(suffix)] = float(val) + + def get_factory_code(self, factory_name: str) -> str: + return self.factory_mapping.get(factory_name, self._sanitize_product(factory_name)) + + def get_factory_factor(self, factory_name: str) -> float: + code = self.get_factory_code(factory_name) + return self.factory_factors.get(code, self.default_new_factory_factor) + + def _load_agents_from_csv(self): + encodings = ("utf-8", "utf-8-sig", "gbk") + last_error = None + for enc in encodings: + try: + df = pd.read_csv("data/ProductionLine.csv", encoding=enc) + break + except UnicodeDecodeError as exc: + last_error = exc + continue + else: + raise last_error + + df["生产型号"] = df["生产型号"].astype(str).str.strip() + if self.product_set: + df = df[df["生产型号"].isin(self.product_set)] + self.region_names = sorted(df["区域名"].unique()) if not df.empty else [] + self.line_factory = {} + self.line_region = {} + for line_id, group in df.groupby("产线ID"): + first = group.iloc[0] + schedule = [] + for _, row in group.iterrows(): + product = row["生产型号"] + schedule.append( + { + "product": product, + "start_month": int(row["开始月份"]), + "end_month": int(row["结束月份"]), + } + ) + self.product_names.add(str(product).strip()) + is_new_factory = str(first["是否新工厂"]).strip() in {"是", "Yes", "True", "true", "1"} + self.line_factory[line_id] = first["工厂名"] + self.line_region[line_id] = first["区域名"] + ProductionLineAgent( + model=self, + line_id=line_id, + region=first["区域名"], + factory=first["工厂名"], + is_new_factory=is_new_factory, + schedule=schedule, + ramp_ranges=self.ramp_ranges, + ) + + def _load_demand_agents_from_csv(self): + encodings = ("utf-8", "utf-8-sig", "gbk") + last_error = None + for enc in encodings: + try: + df = pd.read_csv("data/demand.csv", encoding=enc) + break + except UnicodeDecodeError as exc: + last_error = exc + continue + else: + raise last_error + + product_col = df.columns[0] + df[product_col] = df[product_col].astype(str).str.strip() + if self.product_set: + df = df[df[product_col].isin(self.product_set)] + month_cols = [col for col in df.columns if col.endswith("月")] + df[month_cols] = df[month_cols].apply(pd.to_numeric, errors="coerce") + # total_demand = df[month_cols].stack().sum() + # region_totals = df.groupby("需求区域")[month_cols].sum().sum(axis=1) + # print(f"载入需求总量:{total_demand}") + # print(f"分区域需求:{region_totals.to_dict()}") + month_cols = [col for col in df.columns if col.endswith("月")] + grouped = ( + df.groupby([product_col, "市", "需求区域"])[month_cols] + .sum() + .reset_index() + ) + self.demand_regions = sorted(grouped["需求区域"].unique()) + self.demand_by_city_product = {} + self.city_to_region = {} + + # Aggregate per city-region into product -> monthly dict + city_region_groups = grouped.groupby(["市", "需求区域"]) + for (city, region), sub in city_region_groups: + prod_monthly = {} + for _, row in sub.iterrows(): + prod_name = str(row[product_col]).strip() + monthly = {int(col.rstrip("月")): row[col] for col in month_cols} + prod_monthly[prod_name] = monthly + self.demand_by_city_product[(city, prod_name)] = monthly + self.city_to_region[str(city).strip()] = region + self.product_names.add(prod_name) + DemandAgent( + model=self, + city=city, + region=region, + product_monthly_demand=prod_monthly, + ) + + def _load_transport_data(self): + # Distance matrix + dist_df = pd.read_csv("data/distance_matrix.csv", encoding="utf-8") + self.distance_lookup = { + (row["factory"], row["demand_city"]): float(row["distance_km"]) + for _, row in dist_df.iterrows() + } + # Transportation prices + price_df = pd.read_csv("data/transportation_price.csv", encoding="gbk") + price_df.columns = [c.strip() for c in price_df.columns] + price_df["产品型号"] = price_df["产品型号"].str.strip() + if self.product_set: + generic = {"others", "other", "其它", "其他"} + price_df = price_df[ + price_df["产品型号"].isin(self.product_set) + | price_df["产品型号"].str.lower().isin(generic) + ] + price_df["里程区间[公里]"] = price_df["里程区间[公里]"].str.strip() + for col in price_df.columns: + if "单价" in col or "整车价" in col: + price_df[col] = ( + price_df[col] + .astype(str) + .str.replace(",", "", regex=False) + .str.replace(" ", "", regex=False) + ) + price_df[col] = pd.to_numeric(price_df[col], errors="coerce") + self.transport_prices = [] + for _, row in price_df.iterrows(): + rng = str(row["里程区间[公里]"]) + if "-" in rng: + low, high = rng.split("-") + low = float(low) + high = float(high) + else: + low = 0.0 + high = float("inf") + self.transport_prices.append( + { + "category": row["产品型号"], + "low": low, + "high": high, + "unit_price": row.get("平均单价[元/(公里*片)]", None), + "truck_price": row.get("平均整车价[元/片]", None), + } + ) + self.special_products = {"GWBD-A2", "GWBD-A3", "GWBD-B"} + self.big_M = 1e6 + # Finalize product list once all sources are loaded + self.product_list = sorted(self.product_names) + + def _cost_per_unit(self, factory, city, product): + dist = self.distance_lookup.get((factory, city)) + if dist is None or pd.isna(dist): + return self.big_M + prod = str(product).strip() + best_cost = None + for row in self.transport_prices: + row_cat = str(row["category"]).strip() + # Match logic: exact product, specials grouped, or generic others buckets + is_special_prod = prod in self.special_products + is_special_row = row_cat in self.special_products + is_generic_row = row_cat.lower() in {"others", "other", "其它", "其他"} + match = False + if row_cat == prod: + match = True + elif is_special_prod and is_special_row: + match = True + elif is_generic_row: + match = True + if not match: + continue + if row["low"] <= dist <= row["high"]: + unit_price = row["unit_price"] + truck_price = row["truck_price"] + cost = None + if pd.notna(unit_price): + cost = unit_price * dist * 3 + elif pd.notna(truck_price): + cost = truck_price * 3 + if cost is not None: + best_cost = cost if best_cost is None else min(best_cost, cost) + return best_cost if best_cost is not None else self.big_M + + def get_available_hours(self, month: int) -> float: + days = self.month_days.get(month, 30) + holidays = self.month_holiday_days.get(month, 0) + days = max(days - holidays, 0) + return days * 24 + + def record_demand(self, region: str, demand_units: float): + self.region_demand_totals[region] = self.region_demand_totals.get(region, 0) + demand_units + + def count_region(self, region): + return sum(1 for agent in self.agents if agent.region == region) + + def record_production(self, line_id, factory, region, month, product, units): + if units <= 0: + return + self.production_log.append( + { + "line_id": line_id, + "factory": factory, + "region": region, + "month": month, + "product": product, + "units": units, + } + ) + self.monthly_totals[month] = self.monthly_totals.get(month, 0) + units + self.cumulative_production += units + self.region_totals[region] = self.region_totals.get(region, 0) + units + + def step(self): + for agent in list(self.agents): + agent.step() + # Allocation after production for current month + self._run_allocation() + self._update_region_inventory() + self._record_histories() + if self.current_month >= 12: + self.running = False + self._finalize_factory_errors(write_files=self.output_enabled) + if self.output_enabled: + self._write_report() + self._write_allocation_workbook() + self.datacollector.collect(self) + if not self.running and self.output_enabled: + self._write_visualization_outputs() + self.current_month += 1 + + def _write_report(self): + if not self.production_log: + return + df = pd.DataFrame(self.production_log) + # Group by product, factory, line and pivot months + pivot = ( + df.groupby(["product", "line_id", "factory", "month"])["units"] + .sum() + .reset_index() + .pivot_table( + index=["product", "line_id", "factory"], + columns="month", + values="units", + fill_value=0, + ) + ) + # Ensure columns 1-12 exist + for m in range(1, 13): + if m not in pivot.columns: + pivot[m] = 0 + pivot = pivot[sorted([c for c in pivot.columns if isinstance(c, int)])] + pivot["total"] = pivot.sum(axis=1) + pivot.reset_index(inplace=True) + pivot.columns = ( + ["生产型号", "产线名称", "工厂名"] + + [f"{m}月" for m in range(1, 13)] + + ["总计"] + ) + timestamp = self._get_output_timestamp() + output_dir = "output" + os.makedirs(output_dir, exist_ok=True) + out_path = os.path.join(output_dir, f"production_report_{timestamp}.csv") + pivot.to_csv(out_path, index=False, encoding="utf-8-sig") + + def _write_allocation_workbook(self): + if not self.monthly_allocation_summary: + return + timestamp = self._get_output_timestamp() + output_dir = "output" + os.makedirs(output_dir, exist_ok=True) + out_path = os.path.join(output_dir, f"allocation_summary_{timestamp}.xlsx") + with pd.ExcelWriter(out_path, engine="openpyxl") as writer: + for month in range(1, 13): + rows = [row for row in self.monthly_allocation_summary if row["month"] == month] + if not rows and self.product_list: + rows = [ + { + "month": month, + "product": product, + "inventory_before": 0, + "demand_before": 0, + "allocated": 0, + "inventory_after": 0, + "demand_after": 0, + } + for product in self.product_list + ] + if not rows: + continue + df = pd.DataFrame(rows) + df = df.sort_values(by="product") + df = df[ + ["product", "inventory_before", "demand_before", "allocated", "inventory_after", "demand_after"] + ] + df.columns = ["叶片型号", "调拨前总库存", "调拨前总需求", "当月调拨总量", "调拨后总库存", "调拨后总需求"] + sheet_name = f"第{month}月" + df.to_excel(writer, sheet_name=sheet_name, index=False) + + def _write_visualization_outputs(self): + df = self.datacollector.get_model_vars_dataframe() + if df.empty: + return + + timestamp = self._get_output_timestamp() + output_dir = "output" + os.makedirs(output_dir, exist_ok=True) + + def plot_series(columns, label_map, ylabel, title, filename, colors=None): + available = [col for col in columns if col in df.columns] + if not available: + return + plt.figure(figsize=(10, 6)) + for col in available: + color = colors.get(col) if isinstance(colors, dict) else None + plt.plot(df.index, df[col], label=label_map.get(col, col), color=color) + plt.xlabel("步数") + if ylabel: + plt.ylabel(ylabel) + if title: + plt.title(title) + plt.legend(loc="best") + plt.tight_layout() + plt.savefig(os.path.join(output_dir, f"{filename}_{timestamp}.png")) + plt.close() + + def make_color_map(keys): + return {key: f"C{idx}" for idx, key in enumerate(keys)} + + production_cols = [region for region in self.region_names if region in df.columns] + demand_cols = [f"demand_{region}" for region in self.demand_regions if f"demand_{region}" in df.columns] + inventory_cols = [f"inventory_{region}" for region in self.region_names if f"inventory_{region}" in df.columns] + fulfill_cols = [f"fulfill_pct_{region}" for region in self.demand_regions if f"fulfill_pct_{region}" in df.columns] + unmet_cols = [f"unmet_{region}" for region in self.demand_regions if f"unmet_{region}" in df.columns] + fulfill_month_cols = [f"fulfill_month_{region}" for region in self.demand_regions if f"fulfill_month_{region}" in df.columns] + fulfill_cum_cols = [f"fulfill_cum_{region}" for region in self.demand_regions if f"fulfill_cum_{region}" in df.columns] + transport_unit_cols = [f"transport_units_{region}" for region in self.demand_regions if f"transport_units_{region}" in df.columns] + + plot_series( + production_cols, + {col: f"{col}-产出[套]" for col in production_cols}, + "产出[套]", + "区域产出", + "production_by_region", + colors=make_color_map(production_cols), + ) + plot_series( + demand_cols, + {col: f"{col.replace('demand_', '')}-需求[套]" for col in demand_cols}, + "需求量[套]", + "区域需求", + "demand_by_region", + colors=make_color_map(demand_cols), + ) + plot_series( + inventory_cols, + {col: f"{col.replace('inventory_', '')}-库存[套]" for col in inventory_cols}, + "库存量[套]", + "区域库存", + "inventory_by_region", + colors=make_color_map(inventory_cols), + ) + plot_series( + fulfill_cols, + {col: f"{col.replace('fulfill_pct_', '')}-满足率[%]" for col in fulfill_cols}, + "满足率[%]", + "区域满足率(累计)", + "fulfill_pct_by_region", + colors=make_color_map(fulfill_cols), + ) + plot_series( + fulfill_month_cols, + {col: f"{col.replace('fulfill_month_', '')}-当月满足率[%]" for col in fulfill_month_cols}, + "当月满足率[%]", + "区域满足率(当月)", + "fulfill_pct_month_by_region", + colors=make_color_map(fulfill_month_cols), + ) + plot_series( + fulfill_cum_cols, + {col: f"{col.replace('fulfill_cum_', '')}-累计满足率[%]" for col in fulfill_cum_cols}, + "累计满足率[%]", + "区域满足率(累计)", + "fulfill_pct_cum_by_region", + colors=make_color_map(fulfill_cum_cols), + ) + plot_series( + unmet_cols, + {col: f"{col.replace('unmet_', '')}-未满足需求[套]" for col in unmet_cols}, + "未满足需求[套]", + "区域未满足需求", + "unmet_by_region", + colors=make_color_map(unmet_cols), + ) + plot_series( + transport_unit_cols, + {col: f"{col.replace('transport_units_', '')}-运输量[套]" for col in transport_unit_cols}, + "运输量[套]", + "区域运输量", + "transport_units_by_region", + colors=make_color_map(transport_unit_cols), + ) + if "fulfill_pct_overall" in df.columns: + plot_series( + ["fulfill_pct_overall"], + {"fulfill_pct_overall": "总体满足率[%]"}, + "总体满足率[%]", + "总体满足率", + "fulfill_pct_overall", + ) + if "transport_cost" in df.columns: + plot_series( + ["transport_cost"], + {"transport_cost": "运输成本[万元]"}, + "运输成本[万元]", + "运输成本", + "transport_cost", + ) + + def _finalize_factory_errors(self, write_files: bool): + if not self.production_log: + self.mean_abs_error = float("inf") + return + df = pd.DataFrame(self.production_log) + factory_pivot = ( + df.groupby(["factory", "month"])["units"] + .sum() + .reset_index() + .pivot_table(index="factory", columns="month", values="units", fill_value=0) + ) + for m in range(1, 13): + if m not in factory_pivot.columns: + factory_pivot[m] = 0 + factory_pivot = factory_pivot[sorted([c for c in factory_pivot.columns if isinstance(c, int)])] + factory_pivot["total"] = factory_pivot.sum(axis=1) + factory_pivot.reset_index(inplace=True) + factory_pivot = factory_pivot.sort_values(by="factory") + factory_pivot.columns = ["工厂名称"] + [f"{m}月" for m in range(1, 13)] + ["总计"] + + # Benchmark comparison + try: + benchmark = pd.read_csv("data/benchmark.csv", encoding="utf-8-sig") + except UnicodeDecodeError: + benchmark = pd.read_csv("data/benchmark.csv", encoding="gbk") + benchmark_sorted = benchmark.sort_values(by=benchmark.columns[0]) + total_col = "总计" + month_cols = [f"{m}月" for m in range(1, 13)] + if total_col not in benchmark_sorted.columns: + benchmark_sorted[total_col] = benchmark_sorted[month_cols].sum(axis=1) + bench_total = benchmark_sorted[total_col].astype(float).reset_index(drop=True) + prod_total = factory_pivot["总计"].astype(float).reset_index(drop=True) + min_len = min(len(bench_total), len(prod_total)) + if min_len == 0: + self.mean_abs_error = float("inf") + return + bench_total = bench_total.iloc[:min_len] + prod_total = prod_total.iloc[:min_len] + bench_total_safe = bench_total.replace(0, pd.NA) + rel_errors = (prod_total - bench_total_safe) / bench_total_safe + rel_errors = rel_errors.fillna(0).astype(float) + abs_rel_errors = rel_errors.abs() + self.mean_abs_error = abs_rel_errors.mean() + + if not write_files: + return + + timestamp = self._get_output_timestamp() + output_dir = "output" + os.makedirs(output_dir, exist_ok=True) + factory_report_path = os.path.join(output_dir, f"factory_report_{timestamp}.csv") + factory_pivot.to_csv(factory_report_path, index=False, encoding="utf-8-sig") + + error_df = pd.DataFrame( + { + "工厂名称": factory_pivot["工厂名称"].iloc[:min_len], + "仿真总计": prod_total, + "基准总计": bench_total, + "误差(比例)": rel_errors.round(6), + "误差绝对值(比例)": abs_rel_errors.round(6), + } + ) + error_path = os.path.join(output_dir, f"factory_error_{timestamp}.csv") + error_df.to_csv(error_path, index=False, encoding="utf-8-sig") + + # Error bar charts by month and by factory (mean error) + # Align monthly errors + prod_months = factory_pivot[[f"{m}月" for m in range(1, 13)]].iloc[:min_len].astype(float) + bench_months = benchmark_sorted[[f"{m}月" for m in range(1, 13)]].iloc[:min_len].astype(float) + bench_months_safe = bench_months.replace(0, pd.NA) + month_pct_errors = (prod_months - bench_months_safe) / bench_months_safe * 100 + month_pct_errors = month_pct_errors.fillna(0).convert_dtypes().astype(float) + month_error_means = pd.Series(month_pct_errors.mean(axis=0), index=[f"{m}月" for m in range(1, 13)]) + + plt.figure(figsize=(10, 5)) + month_error_means.plot(kind="bar") + plt.ylabel("平均误差(%)") + plt.title("按月份的平均误差(百分比)") + plt.tight_layout() + month_plot_path = os.path.join(output_dir, f"error_by_month_{timestamp}.png") + plt.savefig(month_plot_path) + plt.close() + + bench_totals_safe = bench_total.replace(0, pd.NA) + factory_pct_errors = (prod_total - bench_totals_safe) / bench_totals_safe * 100 + factory_pct_errors = factory_pct_errors.fillna(0).convert_dtypes().astype(float) + factory_names = factory_pivot["工厂名称"].iloc[:min_len].reset_index(drop=True) + factory_df = pd.DataFrame({"name": factory_names, "error_pct": factory_pct_errors}).sort_values( + by="error_pct" + ) + self.factory_error_df = factory_df.reset_index(drop=True) + plt.figure(figsize=(12, 6)) + ax = factory_df["error_pct"].reset_index(drop=True).plot(kind="bar") + plt.ylabel("误差(%)") + plt.title("按工厂的误差(总计,百分比)") + plt.tight_layout() + # Annotate large absolute errors + for idx, row in factory_df.reset_index(drop=True).iterrows(): + val = row["error_pct"] + if abs(val) >= 50: # threshold + ax.text( + idx, + val, + row["name"], + rotation=90, + va="bottom" if val >= 0 else "top", + ha="center", + fontsize=8, + ) + factory_plot_path = os.path.join(output_dir, f"error_by_factory_{timestamp}.png") + plt.savefig(factory_plot_path) + plt.close() + + # Save histories for inventory, fulfillment pct, unmet backlog + inv_path = os.path.join(output_dir, f"inventory_history_{timestamp}.csv") + fulfill_path = os.path.join(output_dir, f"fulfill_history_{timestamp}.csv") + unmet_path = os.path.join(output_dir, f"unmet_history_{timestamp}.csv") + if self.inv_history: + pd.DataFrame(self.inv_history).to_csv(inv_path, index=False, encoding="utf-8-sig") + if self.fulfill_history_cum: + pd.DataFrame(self.fulfill_history_cum).to_csv(fulfill_path, index=False, encoding="utf-8-sig") + if self.unmet_history: + pd.DataFrame(self.unmet_history).to_csv(unmet_path, index=False, encoding="utf-8-sig") + + if self.assignment_log: + assign_path = os.path.join(output_dir, f"assignments_{timestamp}.csv") + pd.DataFrame(self.assignment_log).to_csv(assign_path, index=False, encoding="utf-8-sig") + + if self.fulfill_overall_history: + overall_path = os.path.join(output_dir, f"fulfill_overall_history_{timestamp}.csv") + pd.DataFrame(self.fulfill_overall_history).to_csv(overall_path, index=False, encoding="utf-8-sig") + if self.transport_cost_history: + cost_path = os.path.join(output_dir, f"transport_cost_history_{timestamp}.csv") + pd.DataFrame(self.transport_cost_history).to_csv(cost_path, index=False, encoding="utf-8-sig") + if self.fulfill_history_month: + pd.DataFrame(self.fulfill_history_month).to_csv( + os.path.join(output_dir, f"fulfill_month_history_{timestamp}.csv"), index=False, encoding="utf-8-sig" + ) + if self.transport_units_history: + pd.DataFrame(self.transport_units_history).to_csv( + os.path.join(output_dir, f"transport_units_history_{timestamp}.csv"), index=False, encoding="utf-8-sig" + ) + + def _update_monthly_fulfill(self): + # Per-region fulfillment percentage for current month + region_pct = {} + for region in self.demand_regions: + # pct computed during allocation + pct = self.region_fulfill_pct.get(region, 0) + region_pct[region] = pct + self.region_fulfill_pct = region_pct + self.region_unmet_backlog = { + self.city_to_region.get(str(city).strip()): self.region_unmet_backlog.get(self.city_to_region.get(str(city).strip()), 0) + for city in [] + } + + def _record_allocation_report(self, month, inventory_before, demand_before, shipped): + products = self.product_list or sorted(set(inventory_before) | set(demand_before) | set(shipped)) + for product in products: + before_inv = float(inventory_before.get(product, 0) or 0) + before_dem = float(demand_before.get(product, 0) or 0) + shipped_qty = float(shipped.get(product, 0) or 0) + after_inv = max(before_inv - shipped_qty, 0) + after_dem = max(before_dem - shipped_qty, 0) + self.monthly_allocation_summary.append( + { + "month": month, + "product": product, + "inventory_before": before_inv, + "demand_before": before_dem, + "allocated": shipped_qty, + "inventory_after": after_inv, + "demand_after": after_dem, + } + ) + + def _run_allocation(self): + # reset transport count for current month + self.region_transport_month = {r: 0 for r in self.demand_regions} + # Supply from line unit_stock (assembled units) + supplies = {} + inventory_before = {} + for agent in self.agents: + if not isinstance(agent, ProductionLineAgent): + continue + for prod, units in agent.unit_stock.items(): + qty = int(units) + if qty > 0: + supplies[(agent.line_id, str(prod).strip())] = qty + inventory_before[str(prod).strip()] = inventory_before.get(str(prod).strip(), 0) + qty + # Demand per city-product for current month including backlog + demands = {} + region_month_demand = {} + demand_before = {} + for (city, prod), monthly in self.demand_by_city_product.items(): + current = monthly.get(self.current_month, 0) + backlog = self.backlog_city_prod.get((city, prod), 0) + qty = backlog + current + if qty > 0: + key = (city, str(prod).strip()) + demands[key] = qty + region = self.city_to_region.get(str(city).strip()) + if region: + region_month_demand[region] = region_month_demand.get(region, 0) + qty + demand_before[str(prod).strip()] = demand_before.get(str(prod).strip(), 0) + qty + if not supplies: + self._record_allocation_report(self.current_month, inventory_before, demand_before, {}) + self.monthly_transport_cost = 0.0 + return + if not demands: + self.region_fulfill_pct = {r: 0 for r in self.demand_regions} + self._record_allocation_report(self.current_month, inventory_before, demand_before, {}) + self.monthly_transport_cost = 0.0 + return + + prob = pulp.LpProblem("allocation", pulp.LpMinimize) + x = {} + for (line, prod), supply in supplies.items(): + factory = self.line_factory.get(line) + for (city, dprod), dem in demands.items(): + if dprod != prod: + continue + if self.within_region_only: + demand_region = self.city_to_region.get(str(city).strip()) + line_region = self.line_region.get(line) + if demand_region is not None and line_region is not None and demand_region != line_region: + continue + x[(line, city, prod)] = pulp.LpVariable(f"x_{line}_{city}_{prod}", lowBound=0, cat="Integer") + + shortage = { + (city, prod): pulp.LpVariable(f"s_{city}_{prod}", lowBound=0, cat="Continuous") + for (city, prod) in demands + } + + # Objective: transport cost + penalty on shortage + obj_terms = [] + shortage_penalty = self.big_M * 10 # Penalize shortage higher than any transport cost + for (line, city, prod), var in x.items(): + factory = self.line_factory.get(line) + factory_region = self.line_region.get(line.strip()).strip() + demand_region = self.city_to_region.get(str(city).strip()).strip() + if "国际" in factory_region or "国际" in demand_region: + cost = 0 + else: + cost = self._cost_per_unit(factory, city, prod) + obj_terms.append(cost * var) + obj_terms += [shortage_penalty * s for s in shortage.values()] + prob += pulp.lpSum(obj_terms) + + # Supply constraints + for (line, prod), supply in supplies.items(): + prob += pulp.lpSum(var for (l, c, p), var in x.items() if l == line and p == prod) <= supply + + # Demand soft constraints + for (city, prod), dem in demands.items(): + prob += pulp.lpSum(var for (l, c, p), var in x.items() if c == city and p == prod) + shortage[(city, prod)] >= dem + + status = prob.solve(pulp.PULP_CBC_CMD(msg=False)) + if pulp.LpStatus[status] != "Optimal": + self.monthly_transport_cost = 0.0 + self._record_allocation_report(self.current_month, inventory_before, demand_before, {}) + return + + # Update inventories and backlogs + shipped = {} + shipped_city_prod = {} + shipped_product = {} + for (line, city, prod), var in x.items(): + qty = int(pulp.value(var) or 0) + if qty > 0: + shipped[(line, prod)] = shipped.get((line, prod), 0) + qty + shipped_city_prod[(city, prod)] = shipped_city_prod.get((city, prod), 0) + qty + shipped_product[prod] = shipped_product.get(prod, 0) + qty + # update demand fulfillment by region of demand + region = self.city_to_region.get(str(city).strip()) + if region: + self.region_demand_fulfilled[region] = self.region_demand_fulfilled.get(region, 0) + qty + if self.output_enabled: + factory_region = self.line_region.get(line) + demand_region = self.city_to_region.get(str(city).strip()) + distance_km = float(self.distance_lookup.get((factory, city), 0) or 0) + if factory_region == "国际" or demand_region == "国际": + unit_cost = 0.0 + else: + unit_cost = float(self._cost_per_unit(factory, city, prod) or 0.0) + assign_cost = (unit_cost * qty) / 10000.0 + self.assignment_log.append( + { + "month": self.current_month, + "line_id": line, + "product": prod, + "demand_city": city, + "quantity": qty, + "transport_distance_km": distance_km, + "transport_cost_wan": assign_cost, + } + ) + if shipped: + for agent in self.agents: + if isinstance(agent, ProductionLineAgent): + for (l, p), qty in shipped.items(): + if agent.line_id == l and p in agent.unit_stock: + agent.unit_stock[p] = max(0, agent.unit_stock[p] - qty) + + # Update backlogs and region fulfillment + region_shipped = {} + total_shipped = 0 + for (city, prod), qty in shipped_city_prod.items(): + region = self.city_to_region.get(str(city).strip()) + if region: + region_shipped[region] = region_shipped.get(region, 0) + qty + total_shipped += qty + + region_unmet = {} + region_pct_month = {} + region_pct_cum = {} + region_transport_month = {r: 0 for r in self.demand_regions} + for (city, prod), demand in demands.items(): + shipped_qty = shipped_city_prod.get((city, prod), 0) + remaining = max(0, demand - shipped_qty) + self.backlog_city_prod[(city, prod)] = remaining + region = self.city_to_region.get(str(city).strip()) + if region: + region_unmet[region] = region_unmet.get(region, 0) + remaining + for region, qty in region_shipped.items(): + region_transport_month[region] = qty + + for region in self.demand_regions: + total = region_month_demand.get(region, 0) + total_current = sum( + monthly.get(self.current_month, 0) + for (city, prod), monthly in self.demand_by_city_product.items() + if self.city_to_region.get(str(city).strip()) == region + ) + fulfilled = region_shipped.get(region, 0) + pct_cum = (fulfilled / total) * 100 if total > 0 else 0.0 + pct_month = (fulfilled / total_current) * 100 if total_current > 0 else 0.0 + region_pct_cum[region] = pct_cum + region_pct_month[region] = pct_month + + self.region_fulfill_pct = region_pct_cum + self.region_fulfill_pct_month = region_pct_month + self.region_fulfill_pct_cum = region_pct_cum + self.region_unmet_backlog = region_unmet + self.region_transport_month = region_transport_month + # Overall fulfillment and cost + total_demand_all = sum(region_month_demand.values()) + self.overall_fulfill_pct = (total_shipped / total_demand_all) * 100 if total_demand_all > 0 else 0.0 + # Compute realized transport cost directly from allocation results (exclude shortage penalties) + total_transport_cost = 0.0 + for (line, city, prod), var in x.items(): + qty = int(pulp.value(var) or 0) + if qty <= 0: + continue + factory = self.line_factory.get(line) + factory_region = self.line_region.get(line) + demand_region = self.city_to_region.get(str(city).strip()) + if factory_region == "国际" or demand_region == "国际": + unit_cost = 0.0 + else: + unit_cost = float(self._cost_per_unit(factory, city, prod) or 0.0) + total_transport_cost += unit_cost * qty + self.monthly_transport_cost = total_transport_cost / 10000.0 + self._record_allocation_report(self.current_month, inventory_before, demand_before, shipped_product) + + def _update_region_inventory(self): + region_inv = {} + for agent in self.agents: + if isinstance(agent, ProductionLineAgent): + total_units = sum(agent.unit_stock.values()) + region_inv[agent.region] = region_inv.get(agent.region, 0) + total_units + self.region_alloc_inventory = region_inv + + def _record_histories(self): + self.inv_history.append({"month": self.current_month, **self.region_alloc_inventory}) + self.fulfill_history_month.append({"month": self.current_month, **getattr(self, "region_fulfill_pct_month", {})}) + self.fulfill_history_cum.append({"month": self.current_month, **getattr(self, "region_fulfill_pct_cum", {})}) + self.unmet_history.append({"month": self.current_month, **self.region_unmet_backlog}) + self.fulfill_overall_history.append({"month": self.current_month, "fulfill_pct_overall": self.overall_fulfill_pct}) + self.transport_cost_history.append({"month": self.current_month, "transport_cost": self.monthly_transport_cost}) + self.transport_units_history.append({"month": self.current_month, **self.region_transport_month}) + + +if __name__ == "__main__": + model = SimulationModel(output_enabled=True) + while model.running: + model.step()