You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SAS代码优化Z需求排查:修复无结果问题,实现DC选址运输工作量最小化

解决SAS设施选址优化代码无输出问题及优化方案

Hey there! Let's work through this SAS optimization problem together—since you're still learning, I'll break down every part so you can see exactly where things might have gone wrong, and give you a fully working, optimized code setup for your DC-to-shelter routing problem.

先理清楚核心问题

Your goal is to select DCs (from DC1-DC5) to minimize total "kit miles"—that's classic facility location optimization where we want to match supply (DCs) to demand (shelters) with the least total transportation effort.

常见导致无输出的原因

Before diving into code, here are the most likely reasons your original code didn't produce results:

  • You forgot to load your datasets correctly into the optimization model
  • Your constraints were conflicting (e.g., total DC supply is less than total shelter demand, making the model unsolvable)
  • You didn't actually call the solver with a solve statement
  • Decision variables were defined incorrectly (like missing non-negativity rules)

优化后的完整SAS代码

This code includes data setup (replace with your real data!), model definition, constraints, solving, and result output:

Step 1: Create/Load Your Data

First, we'll define sample datasets—swap these out with your actual demand, supply, and distance data:

/* 庇护所需求数据(套件数) */
data shelters;
    input shelter_id $ demand;
    datalines;
S1 100
S2 150
S3 80
S4 200
;
run;

/* DC供应能力数据(套件数) */
data dcs;
    input dc_id $ supply;
    datalines;
DC1 500
DC2 600
DC3 450
DC4 550
DC5 400
;
run;

/* DC到庇护所的距离矩阵(英里) */
data distance_matrix;
    input dc_id $ shelter_id $ distance;
    datalines;
DC1 S1 25
DC1 S2 40
DC1 S3 30
DC1 S4 50
DC2 S1 35
DC2 S2 20
DC2 S3 45
DC2 S4 30
DC3 S1 50
DC3 S2 30
DC3 S3 20
DC3 S4 40
DC4 S1 30
DC4 S2 50
DC4 S3 35
DC4 S4 25
DC5 S1 45
DC5 S2 40
DC5 S3 50
DC5 S4 35
;
run;

Step 2: Build & Solve the Optimization Model

We'll use PROC OPTMODEL (SAS's optimization procedure) to define the model:

proc optmodel;
    /* 定义集合和参数来存储数据 */
    set DCs;                  /* 所有DC的集合 */
    set SHELTERS;             /* 所有庇护所的集合 */
    num demand{SHELTERS};     /* 每个庇护所的需求 */
    num supply{DCs};          /* 每个DC的供应能力 */
    num distance{DCs, SHELTERS}; /* 每个DC到庇护所的距离 */

    /* 从SAS数据集加载数据 */
    read data dcs into DCs=[dc_id] supply=supply;
    read data shelters into SHELTERS=[shelter_id] demand=demand;
    read data distance_matrix into [dc_id shelter_id] distance=distance;

    /* 决策变量:x[dc,s] = 从DC运输到庇护所的套件数量 */
    var x{DCs, SHELTERS} >= 0; /* 运输量不能为负 */

    /* 可选:二进制变量y[dc] = 1如果选择该DC,0否则(用于限制选DC的数量) */
    var y{DCs} binary;

    /* 目标函数:最小化总套件英里数 */
    min total_transport_work = sum{dc in DCs, s in SHELTERS} x[dc,s] * distance[dc,s];

    /* 约束1:每个庇护所的需求必须被完全满足 */
    con meet_demand{s in SHELTERS}:
        sum{dc in DCs} x[dc,s] = demand[s];

    /* 约束2:每个DC的运输量不能超过其供应能力(如果选择了该DC) */
    con respect_supply{dc in DCs}:
        sum{s in SHELTERS} x[dc,s] <= supply[dc] * y[dc];

    /* 可选:限制最多选择的DC数量(比如最多选2个),去掉注释即可启用 */
    /* con max_selected_dcs: sum{dc in DCs} y[dc] <= 2; */

    /* 求解模型:用MILP(混合整数线性规划),如果不用y变量,用LP即可 */
    solve with milp / loglevel=1; /* loglevel=1会输出求解过程,方便排查问题 */

    /* 打印结果到SAS日志 */
    print x;                  /* 各DC到庇护所的运输量 */
    print y;                  /* 选中的DC(y=1表示选中) */
    print total_transport_work; /* 最小化的总套件英里数 */

    /* 将结果导出到SAS数据集,方便后续分析 */
    create data transport_results from [dc_id shelter_id] x=x;
    create data dc_selection_results from [dc_id] y=y;
quit;

关键优化与修复说明

  • Data Loading Fix: The read data statements explicitly map dataset variables to model parameters—no more mismatched variable names causing missing data.
  • Feasibility Checks: The constraints ensure demand is met and supply isn't exceeded. If your model is unsolvable, check if total supply >= total demand (a common issue!).
  • Flexibility: The binary y variable lets you easily add constraints on how many DCs you can select (just uncomment the max_selected_dcs line and adjust the number).
  • Result Output: We print results directly to the log and export them to datasets, so you don't miss any outputs.
  • Debugging: loglevel=1 gives you detailed solver logs—if the model fails, this will tell you exactly why (e.g., which constraint is conflicting).

适配你的真实数据

Just replace the sample shelters, dcs, and distance_matrix datasets with your actual data. Make sure:

  • Variable names match what's in the read data statements (e.g., if your DC ID variable is dc_num instead of dc_id, update the code accordingly)
  • Distance values are correctly mapped between each DC and shelter

内容的提问来源于stack exchange,提问作者Sugunendra S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:30:34