数模入门之整数规划(matlab软件学习)

第二章 整数规划
1.1 定义
规划中的变量(部分或全部)限制为整数时,称为整数规划。若在线性规划模型中,变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法,往往只适用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。
1.2 常用的求解方法:
(i)分枝定界法—可求纯或混合整数线性规划。
(ii)割平面法—可求纯或混合整数线性规划。
(iii)隐枚举法—求解“0-1”整数规划:
①过滤隐枚举法;
②分枝隐枚举法。
(iv)匈牙利法—解决指派问题(“0-1”规划特殊情形)。
(v)蒙特卡洛法—求解各种类型规划。
下面将简要介绍常用的一种求解整数规划的方法:
蒙特卡洛法(随机取样法)
对于非线性整数规划目前尚未有一种成熟而准确的求解方法,因为非线性规划本身的通用有效解法尚未找到,更何况是非线性整数规划。然而,尽管整数规划由于限制变量为整数而增加了难度;然而又由于整数解是有限个,于是为枚举法提供了方便。当然,当自变量维数很大和取值范围很宽情况下,企图用显枚举法(即穷举法)计算出最优值是不现实的,但是应用概率理论可以证明,在一定的计算量的情况下,完全可以得出一个满意解。
数模入门之整数规划(matlab软件学习)_第1张图片
如果用显枚举法试探,共需计算100的5次方和10的10次方 个点个点,其计算量非常之大。然而应用蒙特卡洛去随机计算106 个点,便可找到满意解,那么这种方法的可信度究竟怎样呢?
下面就分析随机取样采集106 个点计算时,应用概率理论来估计一下可信度。不失一般性,假定一个整数规划的最优点不是孤立的奇点。
假设目标函数落在高值区的概率分别为 0.01,0.00001,则当计算106 个点后,有任一个点能落在高值区的概率分别为
在这里插入图片描述
(i)首先编写 M 文件 mente.m 定义目标函数 f 和约束向量函数 g,程序如下
function [f,g]=mengte(x); f=x(1)2+x(2)2+3x(3)2+4*x(4)2+2x(5)-8x(1)-2x(2)-3x(3)-… x(4)-2x(5);
g=[sum(x)-400 x(1)+2x(2)+2x(3)+x(4)+6x(5)-800 2x(1)+x(2)+6x(3)-200
x(3)+x(4)+5
x(5)-200];
(ii)编写M文件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
计算结果

x0 =

38
97
 3
99
17

p0 =

   50022

时间已过 1.707487 秒。
程序解析:

  1. rand(‘state’,sum(clock))
    rand(‘state’,X)该指令可以用来设置随机数流的状态,我们只要给一个确定的X值,那么后面的随机数流就会确定,但是这也产生了一个问题,因为这个算法是固定的,因此我们使用这种方法产生数叫做伪随机数。这有什么缺点呢?比如说我们设置
    rand(‘state’,1)
    rand(3,1)
    得出结果,
    ans =

    0.9528
    0.7041
    0.9539
    我们不管什么时候用这个指令得出的结果都是上面的三个结果。为了增加随机性,这里用当前时间数码sum(clock)作为随机数的状态,clock返回一个6个元素的向量分辨是年月日时分秒,sum加起来就作为随机数的状态,因为你每次运行程序的时间不同,所以得到的随机数序列就不同单独使用这句时,改变了随机数流的状态,但是还没有使用,所以不产生任何变量。

  2. toc tic
    tic和toc用来记录matlab命令执行的时间。
    tic用来保存当前时间,而后使用toc来记录程序完成时间。
    两者往往结合使用。

3.sum(g<=0)==4
该指令应该是记录满足条件的个数,一共四个限制条件,只有当四个限制条件都满足的时候该指令才成立。

你可能感兴趣的:(数学建模)