实验三 整数规划实现
一、实验目的
1、掌握0-1整数规划原理;
2、用Matlab实现0-1整数规划隐枚举法的常规解法或简化解法;
3、对0-1整数规划求解算法进行评价。
二、实验要求
安装Matlab,编写代码实现以下例题6的求解,可以采用常规解法或简化解法求解。
使用Matlab实现0-1整数规划隐枚举法常规解法或简化解法。编写代码实现以下例题6的求解,同时与手工计算结果比对。按实验内容及步骤完成操作,完成实验报告,所有实验环节均由每位学生独立完成,严禁抄袭他人实验结果。最终提交的文件包括代码、数据、实验报告(内含预习报告)。
三、实验环境
PC机,Matlab2019b或更高的版本。
四、实验内容及分析
0-1整数规划常规解法或简化解法的实现。
输入:
输出:
具体代码如下:
%主函数:
c=input('输入系数 c=')
A=input('系数矩阵 A=')
b=input('输入资源矩阵 b=')
[m,n]=size(A);
allsolution=lingyi(n);
z=[];
x=zeros(n,1);
for i=1:2^n
z=[z;objfunction(c,allsolution(i,:)')];
end
[maxx, maxxi]=max(z);
while feasible(A,allsolution(maxxi,:)',b)==0
allsolution(maxxi,:)=[];
z(maxxi,:)=[];
[maxx, maxxi]=max(z);
end
input('the optimization solution of the programming is:')
allsolution(maxxi,:)
input('the optimization value of the programming is:')
max(z(maxxi))
%子函数1:
function z=objfunction(c,x)
z=c*x
end
%子函数2:
function t=feasible(A,x,b)
if(A*x-b)<=0
t=1;
else
t=0;
end
end
%子函数3:
function y=lingyi(k)
if k==1
y=[0;1];
else if k>1
lc=2^(k-1);
xinlie1=zeros(lc,1);
xinlie2=ones(lc,1);
xinlie=[xinlie1;xinlie2];
pre_lingyi=lingyi(k-1);
pre_lingyi=[pre_lingyi;pre_lingyi];
y=[xinlie,pre_lingyi];
end
end
end
求解基于两种方法:暴力"穷举"方法和"隐式枚举"方法。
ZeroOneprog函数有4个输入参数。
C:线性目标函数的系数向量
A:线性不等式约束的系数矩阵
B:线性不等式约束的右侧向量
X0:问题的初始可行整数解
该函数返回两个输出:
Intx:问题的最优解(即最小化目标函数的变量向量)。
Intf:目标函数的最小值
根据矩阵A的大小,可以通过调用两个子函数中的一个来找到解决方案:Allprog或Implicitprog。如果矩阵A的列数小于3,则调用Allprog函数来使用穷举方法解决问题。否则,调用Implicitprog函数,以初始可行解x0为起点,使用隐式枚举方法求解该问题。
Allprog函数使用蛮力方法来解决这个问题。它枚举决策变量的所有可能值(即长度等于A列数的所有可能的二元向量),并检查每个可能的解是否满足不等式约束。对于每个可行解,它计算目标函数的值,并跟踪找到的最小值。该函数返回最优解(即最小化目标函数的决策变量向量)和目标函数的最小值。
Implicitprog函数使用隐式枚举方法来解决这个问题。它从初始可行解x0开始,执行一系列的局部改进,迭代寻找一个更好的可行解,直到无法再进行进一步的改进。该函数返回最终的可行解(即最小化目标函数的决策变量向量)和目标函数的最小值。
五、实验小结
通过本次实验,我学习了如何使用 Matlab 实现 0-1 整数规划隐枚举法。并且所求结果与手算结果一致。在实验中使用了 Matlab 的内置函数Allprog或Implicitprog实现了枚举所有可能的变量组合的过程,然后使用循环语句遍历每一组变量组合,并判断是否满足约束条件,如果满足就计算出目标函数的值,并比较是否比当前最优解更优,如果更优就更新最优解。最后,我们输出了最优解和最优值。
总的来说,本次实验对于我们理解0-1整数规划隐枚举法的基本原理和使用 Matlab 实现这种方法的方法有很大的帮助。