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

如何创建二元[0,1]变量实现设施选址分配优化计算?

二元设施-位置分配优化的Matlab实现方案

先帮你梳理下核心需求:我们要解决一个0-1变量的设施位置匹配问题——让每个设施唯一对应一个位置,同时最小化「设施间流量×对应位置距离」的总加权和。

原代码存在的关键问题

  • 未正确定义二元变量x(i,j):直接使用x但未初始化,也没声明其0-1属性
  • 目标函数构建逻辑错误:循环里误用min函数,没有正确累加所有项形成完整的目标表达式
  • 约束条件写法无效:未基于已定义的变量构建约束,sum(x,2)这类代码在x未定义时会直接报错
  • 循环索引逻辑混淆:设施索引i,k和位置索引j,q的循环范围对应有误

修正后的完整实现代码

我们可以用Matlab的YALMIP工具箱(专门做优化建模,对整数规划支持非常友好)来实现,代码如下:

clc; clear;
% 初始化基础数据
% 流量矩阵:f(i,k) = 设施i与设施k之间的流量
f = [0 5 7 9; 5 0 4 6; 7 4 0 3; 9 6 3 0]; 
% 距离矩阵:d(j,q) = 位置j与位置q之间的距离
d = [0 6 8 9; 6 0 5 1; 8 5 0 2; 9 1 2 0]; 
nf = size(f, 1); % 设施数量
nd = size(d, 1); % 位置数量

% 1. 定义二元决策变量:x(i,j)=1表示设施i分配到位置j,否则为0
x = binvar(nf, nd, 'full');

% 2. 构建目标函数:Min = ΣΣΣΣ(f(i,k)*d(j,q)*x(i,j)*x(k,q))
obj = 0;
for i = 1:nf
    for k = 1:nf
        for j = 1:nd
            for q = 1:nd
                obj = obj + f(i,k)*d(j,q)*x(i,j)*x(k,q);
            end
        end
    end
end

% 3. 添加约束条件
Constraints = [];
% 约束1:每个设施必须分配到恰好一个位置(每行和为1)
for i = 1:nf
    Constraints = [Constraints, sum(x(i,:)) == 1];
end
% 约束2:每个位置只能容纳一个设施(每列和为1)
for j = 1:nd
    Constraints = [Constraints, sum(x(:,j)) == 1];
end

% 4. 调用求解器求解(这里用Gurobi,也可以用CPLEX/Matlab自带intlinprog,需提前安装对应求解器)
ops = sdpsettings('solver','gurobi','verbose',1);
result = optimize(Constraints, obj, ops);

% 5. 输出结果
if result.problem == 0
    disp('最优分配方案:');
    x_val = value(x);
    disp(x_val);
    disp('最小目标值:');
    disp(value(obj));
else
    disp('求解失败,错误码:');
    disp(result.problem);
end

关键细节说明

  • 变量定义:用binvar(nf, nd)直接创建0-1矩阵变量,自动满足二元属性要求,不用额外手动限制
  • 目标函数:通过四层循环累加所有项,构建完整的目标表达式,避免了原代码中min函数的误用
  • 约束条件:通过循环为每个设施、每个位置添加和为1的约束,严格保证设施与位置的一一对应关系
  • 求解器选择:YALMIP支持多种求解器,如果没有Gurobi/CPLEX,也可以改用Matlab自带的intlinprog,但需要将矩阵变量扁平化为一维向量,写法会稍复杂,需要的话我可以再补充对应的实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:01