[学习笔记]整数规划matlab实现与实例

主要内容:整数规划的引入与线性整数规划的求解
一、整数规划的分类
(1)线性整数规划:可以直接使用matlab求解
(2)非线性整数规划:无特定算法,只能够用近似算法,如蒙特卡洛模拟,智能算法。
(3)0-1规划:特殊的整数规划,matlab中只能做到线性0-1规划,非线性0-1规划只能做近似求解。

二、线性规划与整数线性规划
线性规划:[x,fval]=linprog[c,A,b,Aeq,beq,lb,ub,x0]
非线性规划:[x,fval]=intlinprog[c,intcon,A,b,Aeq,beq,lb,ub]

可见:1.整数线性规划中缺少了x0,不能指定初始值。
2.增加了intcon。intcon表示指定第某个变量是整数变量。
如:
intcon=3;表示第三个变量是整数变量。
intcon=[1,3];表示第一个和第三个是整数变量。
intcon=[1:9];表示第一个到第九个都是整数变量。
其他用法与线性规划相同。

针对0-1规划,通常是在ub与lb上做文章,使得只能够取得0或者1。

三、实例背包问题
在这里插入图片描述
由题目可以分析得,自变量是物品。目标函数是物品得利润总和。由于物品只能取0或者1,所以物品的取舍成为了整数约束条件。又由于总数不能超过车的载重,因此不等式约束条件是重量总和小于30t。

c = [540 200 180 350 60 150 280 450 320 120];
c=-c;
A = [6 3 4 5 1 2 3 5 4 2];
b = 30;
intcon=[1:10];
lb=zeros(1,10);
ub=ones(1,10);
[x,fval]=intlinprog(c,intcon,A,b,[],[],lb,ub)
fval=-fval;

四、指派问题
在这里插入图片描述

分析:由题目可以确定,目标函数是游泳成绩之和,最优解是其最小值。约束条件是每人只能选取一种游泳方式、每种游泳方式只能一人使用。因此自变量可以设成某个人用某种游泳方式(1~20),例如甲的四种游泳方式对应编号1-4,乙的编号对应5-8…自变量的取值为0、1,表示参加与否。

%指派问题
c = [66.8 75.6 87 58.6 ...
    57.2 66 66.4 53 ...
    78 67.8 84.6 59.4 ...
    70 74.2 69.6 57.2 ...
    67.4 71 83.8 62.4];
A = zeros(5,20);
for i = 1:4
    A(1,i)=1;A(2,i+4)=1;A(3,i+8)=1;A(4,i+12)=1;A(5,i+16)=1;
end
b = [1,1,1,1,1]';
Aeq = zeros(4,20);
for i = 0:4;
    Aeq(1,1+4*i)=1;Aeq(2,2+4*i)=1;Aeq(3,3+4*i)=1;Aeq(4,4+4*i)=1;
end
beq = [1,1,1,1];
lb = zeros(1,20);
ub = ones(1,20);
intcon = [1:20];
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)

五、钢管切割问题
在这里插入图片描述
分析问题:首先确定切割方式,如果只切割成某种特定的型号,2.9m能够切割2根,2.1m能够切割三根,1m能够切割6根。为了满足对每个钢管的利用最大化,剩余的钢管程度必须小于1m。即通过枚举法获得钢管的分割方式。

	%% (1)枚举法找出同一个原材料上所有的切割方法
for i = 0: 2  % 2.9m长的圆钢的数量
    for j = 0: 3  % 2.1m长的圆钢的数量
        for k = 0:6   % 1m长的圆钢的数量
            if 2.9*i+2.1*j+1*k >= 6 & 2.9*i+2.1*j+1*k <= 6.9
                disp([i, j, k])
            end
        end
    end
end

最后分割方式写出代码即可:

%钢管切割问题
c = [1 1 1 1 1 1 1];
A = [1 2 0 0 0 0 1
    0 0 3 2 1 0 1
    4 1 0 2 4 6 1];
A = -A;
b = [100 100 100];
b = -b;
lb = [0 0 0 0 0 0 0];
intcon = 1:7;
[x,fval] = intlinprog(c,intcon,A,b,[],[],lb)
  • 29
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值