MATLAB intlinprog求解工种分配问题出现不可行解求助
MATLAB intlinprog 工种分配问题求解异常排查
问题背景
- 任务需求:将10个任务(i=1,..,10)分配给7种类型工人(j=1,..,7),目标为最小化总任务耗时(目标系数为任务i分配给工人j的耗时
t(i,j))。 - 核心约束:
- 每个任务必须且仅分配给一种工人;
- 单任务耗时≤999;
- 单任务风险≤17;
- 决策变量:
x(i,j)为0-1整数变量,任务i分配给工人j时取1,否则取0。 - 异常结果:求解后部分任务未分配工人,部分任务被分配给多种工人,不满足每行恰好一个1的预期。
已完成工作
- 构建了时间约束矩阵
matrix1、风险约束矩阵matrix2、任务分配唯一性等式约束矩阵matrix3; - 编写MATLAB求解代码,
t(i,j)矩阵、r(i,j)矩阵、代码及求解结果均与原问题一致。
重点排查方向
1. 决策变量维度映射错误
intlinprog要求决策变量为一维向量,若二维x(i,j)转一维时索引对应关系混乱,会导致约束矩阵与变量不匹配。需确认:
- 同一任务i的所有
x(i,j)变量在一维向量中对应的索引,是否被正确纳入matrix3的同一约束行; - 一维变量的总数是否为10×7=70个,无遗漏或重复。
2. 任务分配约束构建错误
任务分配唯一性是核心等式约束,需检查:
matrix3应为10行(对应10个任务),每行仅对应该任务的7个x(i,j)位置为1,其余为0,右侧beq向量全为1;- 约束类型必须是等式约束(传入
Aeq和beq),而非不等式约束(A和b),否则无法保证“必须分配且仅分配一次”。
3. 时间/风险约束逻辑错误
对于t(i,j)>999或r(i,j)>17的无效分配,需添加x(i,j)=0的约束:
- 确认这类约束是否正确构建:对应位置系数为1,右侧常数项为0;
- 若误将约束写成
t(i,j)*x(i,j) ≤999,当t(i,j)本身大于999时,该约束无法限制x(i,j)=0,会导致无效分配被允许,干扰核心约束。
4. intlinprog参数设置错误
- 检查
intcon参数:所有70个x(i,j)都是0-1整数变量,需将全部一维变量索引传入intcon,若遗漏部分变量,会导致其被当作连续变量处理,出现非0/1取值; - 确认
Aeq和beq是否正确绑定matrix3和全1向量,避免误传入不等式约束参数中。
5. 问题可行性验证
- 单独检查每个任务是否至少存在一个工人j,满足
t(i,j)≤999且r(i,j)≤17;若存在无可行分配的任务,求解器会返回不可行解,出现任务未分配的情况; - 检查求解器选项,是否因迭代次数限制或精度设置导致未找到完整的整数最优解。
内容的提问来源于stack exchange,提问作者user2018
相关产品推荐
相关产品推荐

