matlab ceil函数_数学建模与MATLAB整数规划(附有代码讲解)

3baa8f5d4e12d46c8eed138fc19bcb3f.png快点击上方 蓝字 关注我们吧!! 数学建模与MATLAB–整数规划 ac83419730f45d0b40cdcb55435b3699.png

本文简单介绍了整数规划的问题和一些常见的解法,对于此类问题大家可以与线性规划(https://editor.csdn.net/md/?articleId=107674631) 相互对比。

ac83419730f45d0b40cdcb55435b3699.png

什么是整数规划?

d0d027b5c8775939b3e21b50833b239a.png

1、整数规划定义

规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。 注意: 目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。

2、整数规划分类

59471c7a3bf0fd4461c3f6173b462fa2.png3、整数规划的特点

57bf662cf868f585cf9aa91d64e75ea2.png

8c3b48ab3e97e2f26f10352d31fe0d0b.png

整数规划的问题实例

d0d027b5c8775939b3e21b50833b239a.png 用以解决生产进度问题、旅行推销员问题、工厂选址问题、背包问题及分配问题:

4d474c929596aa4752a11a5a24566601.png

8c3b48ab3e97e2f26f10352d31fe0d0b.png

整数规划求解方法

d0d027b5c8775939b3e21b50833b239a.png

1、分支定界法

求解范围:纯或混合整数线性规划思路

对有约束条件的最优化问题(其可行解为有限数)的所有可行解空间恰当地进行系统搜索,这就是分枝与定界内容。

通常,把全部可行解空间反复地分割为越来越小的子集,称为分枝;并且对每个子集内的解集计算一个目标下界(对于最小值问题),这称为定界。在每次分枝后,凡是界限超出已知可行解集目标值的那些子集不再进一步分枝,这样,许多子集可不予考虑,这称剪枝。这就是分枝定界法的主要思路。

求解过程:

84f5c931752438ffbe072401cf2b2e32.png

9a4d0da7e8713cf5b23e0b993bb177b6.png

929be06c51d9effda0f9010c4b00b688.png

2、割平面法

求解范围:纯或混合整数线性规划
先不考虑变量的取整约束,求解相应的线性规划,然后不断增加线性约束条件(割平面),将原可行域割掉不含整数可行解的一部分,最终得到一个具有整数坐标顶点的可行域,而该顶点恰好是原整数规划问题的最优解

3、隐枚举法

求解范围:“0-1”整数规划
它的基本思路时从所有变量等于零出发,依次指定一些变量为1,直至得到一个可行解,并将它作为最好的可行解。

此后,依次检查变量等于0或1的某些组合,以便使最好的可行解不断加以改进,最终获得最优解。隐枚举法不同于穷举法,它不需要将所有可行的变量一一列举。它通过分析、判断派出了许多变量组合作为最优解的可能性。也就是说,它们被隐含枚举,故此得名。

4、匈牙利法

求解范围:“0-1”规划特殊情形(指派问题)

匈牙利解法是求解指派问题的一种新颖而又简便的解法,它是美国数学家库恩(Kuhn)于1955年提出的.库恩引用了匈牙利数学家康尼格(Konig)一个关于矩阵中0元素的定理:系数矩阵中独立0元素的最多个数等于能覆盖所有0元素的最小直线数。

指派问题的最优解有这样一个性质,若从系数矩阵的一行(列)各元素中分别减去该行(列)的最小元素,得到新矩阵,那么以新矩阵为系数矩阵求得的最优解和用原矩阵求得的最优解相同.利用这个性质,可使原系数矩阵变换为含有很多0元素的新矩阵,而最优解保持不变,这就是匈牙利法的基础。
5、蒙特卡罗法

求解范围:各种类型规划
蒙特卡罗是一种随机模拟的方法,对于枚举法解决困难的大型问题,使用蒙特卡罗模拟便可以使用较少的计算量得到较为准确的结果。

8c3b48ab3e97e2f26f10352d31fe0d0b.png

整数规划MATLAB求解实例

d0d027b5c8775939b3e21b50833b239a.png

1、0-1整数规划(指派类问题)

 有n项不同的任务,需要n个人分别完成其中的1项,每个人完成任务的时间不一样。于是就有一个问题,如何分配任务使得花费时间最少。

7026ce88a578352dd664d440fdfe554a.png

上表为指派矩阵,表中数值代表不同人员做不同任务需要的时间对于此问题我们可以使用linprog进行求解,MATLAB代码如下:

>> C = [3 8 2 10 3
8 7 2 9 7
6 4 2 7 5
8 4 2 3 5
9 10 6 9 10
];
>> zhipai(C)

调用函数zhipai.m(此代码来源于网络)

%0-1规划求指派问题
function [y,fval]=zhipai(C)%C为指派n*n系数矩阵
C=C';
f=C(:);%生成一个列向量,作为目标函数系数,matlab默认以列排序
[m,n]=size(C);
Aeq=zeros(2*n,n*n);%2*n个等式约束,n*n个变量
for i=1:n  %这里先生成的是后四个等式约束的左端项
    Aeq(1:n,1+(i-1)*n:i*n)=eye(n,n);
end
for i=1:n  %前四个等式约束左端项
    Aeq(i+n,1+(i-1)*n:i*n)=ones(1,n);
end
beq=ones(2*n,1);
lb=zeros(n*n,1);
ub=ones(n*n,1);
x=linprog(f',[],[],Aeq,beq,lb,ub);%线性规划函数
y=reshape(x,n,n);%将上式求出的x值变成n阶矩阵
y=y';%上式生成的是按列排列的,所以转致一下
y=round(y);%对y元素取整,生成匹配矩阵
sol=zeros(n,n);
for i=1:n
    for j=1:n
        if y(i,j)==1
            sol(i,j)=C(j,i);%匹配矩阵
        end
    end
end
fval=sum(sol(:));%极小值的目标函数值

求解结果

Optimal solution found.
ans =0     0     0     0     10     0     1     0     00     1     0     0     00     0     0     1     01     0     0     0     0

2、非线性整数规划(蒙特卡罗法求解)

fa34ed874a1a6fe568dccbd6aece05c3.png

MATLAB求解代码: mainint.m(主函数)

rand('state',sum(clock));
p0=0;
tic
for i=1:10^6
x=99*rand(5,1);
x1=floor(x);x2=ceil(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=mengte(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0
toc

函数mengte.m

function [f,g]=mengte(x)
f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)-8*x(1)-2*x(2)-3*x(3)-...
x(4)-2*x(5);
g=[sum(x)-400
x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200];

运行结果

x0 =4093     1995
p0 =  48848

历时 2.366465 秒。

上面只介绍了指派问题的linprog函数求解与蒙特卡罗模拟两种方法,其余方法请读者根据算法来进行实践编程。 对于一般的整数规划问题,无法直接使用MATLAB的函数,例如分支定界法和割平面法并没有函数供大家直接调用,需要大家根据算法的思想来编程。
对于整数规划除了使用MATLAB进行求解之外,更好的方法是使用Lingo等专用软件,下面是对于上述例二蒙特卡罗模拟在Lingo中的求解结果。

8b4d996eca840415ae34d7d57fb33bc6.png

Lingo中需要进行编程计算,对规划问题计算速度比MATLAB要快。

8c3b48ab3e97e2f26f10352d31fe0d0b.png

文中部分示例来源于网络,只用于学习交流!由于能力有限,部分地方难免出现错误,请大家批评指正!

关于MATLAB的学习:
可以关注我们的知乎专栏–数据可视化和数据分析中matlab的使用

https://zhuanlan.zhihu.com/c_1131568134137692160

欢迎大家加入我们的MATLAB学习交流群:

953314432

86841f00362b1c9f197cea634ea682df.png 1c61ffcb97f87da40f394824bc52a80a.pngEND 0e318e3b7ffa78aba8fe0fcd82af7d71.png 423368d37546dac3ce24118b83b4c2d6.png 47ffadaff850388a38f0d6e792eb0cac.png扫码关注我们 47ffadaff850388a38f0d6e792eb0cac.png更多精彩等待你发现 出品: Asoul水云天课堂工作室
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值