数学建模 割平面算法求解整数规划基本原理与编程实现

基本思想

松弛问题:线性规划
割掉一块全部都是小数的区域(这一部分取不到整数)
在这里插入图片描述

案例

1)横坐标x1,纵坐标x2
2)蓝色小三角形的区域:x2:(1,7/4) x1:(0,3/4)
这块区域,x1与x2完全取不到整数,所以直接切去

所以,此时取值范围变化了:
x2<=1把此约束条件带入,得到x1=1,x2=1,z=2

3)能够取到整数的区域就不能切掉
在这里插入图片描述
引入松弛变量:(解出x1=1,x2=1,z=2的过程)
1)松弛变量:引入之后的效果与原先是一致的
如:-x1+x2<=1 引入x3>=0之后 得到 -x1+x2+x3=1 则此时-x1+x2仍然<=1,所以不影响结果

2)把式子4与5的系数与单个数字拆分为(整数+小数,小数>=0)
即:x1=(1+0)x1 -1/4x3=(-1+3/4)x3 1/4x4=(0+1/4)x4 3/4=(0+3/4)

然后再把整数部分(系数为整数与单个整数)放在左边,小数部分放在右边(系数为小数+单个小数)

所以现在变为了
3/4-正数=一个整数
而且0=<3/4<=1 x3,x4>=0
所以 ,3/4-正数<=0
即 3x3+x4>=3
4x2+3x3+x4>=7

在这里插入图片描述

基本步骤

引入松弛变量,变不等式为等式
aikxk 松弛变量
aik=[aik]+fik 松弛变量的系数化为正数部分和小数部分
[aik] xk正数部分汇合
fik xk小数部分汇合

[aik]xk -[bi]整数部分放在左侧
[bi]+fi 小数部分放在右侧

在这里插入图片描述

切割平面法流程

在这里插入图片描述

案例

在这里插入图片描述
解答:
在这里插入图片描述
引入松弛变量:
matlab中只有min,所以求最大值要加上负号
在这里插入图片描述

matlab代码

DividePlane.m

function  [intx,intf] = DividePlane(A,c,b,baseVector)
%功能:用割平面法求解整数规划
%调用格式:[intx,intf]=DividePlane(A,c,b,baseVector)
%其中,A:约束矩阵;
%      c:目标函数系数向量;
%      b:约束右端向量;
%      baseVector:初始基向量;
%      intx:目标函数取最小值时的自变量值;
%      intf:目标函数的最小值;
sz = size(A);
nVia = sz(2);%获取有多少决策变量
n = sz(1);%获取有多少约束条件
xx = 1:nVia;

if length(baseVector) ~= n
    disp('基变量的个数要与约束矩阵的行数相等!');
    mx = NaN;
    mf = NaN;
    return;
end
 
M = 0;
sigma = -[transpose(c) zeros(1,(nVia-length(c)))];
xb = b;
 
%首先用单纯形法求出最优解
while 1   
    [maxs,ind] = max(sigma);
%--------------------用单纯形法求最优解--------------------------------------
    if maxs <= 0   %当检验数均小于0时,求得最优解。      
        vr = find(c~=
  • 16
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DQ_CODING

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值