1、首先启动matlab,新建一个函数文件。
2、在d出的编辑窗口中输入代码。
3、保存该函数,注意文件命名要与函数名相同。
4、文件保存的位置应该与搜索路径相同,否则使用该函数时将会因为找不到该函数文件而出错。
5、最后再命令行窗口中输入命令,get01(m,n)就可以产生m行n列的随机0-1矩阵了。
详情见下。运筹学理论上,如不加特殊说明,一般指整数线性规划。对于整数线性规划模型大致可分为两类:
1、变量全限制为整数时,称纯(完全)整数规划。
2、变量部分限制为整数的,称混合整数规划。
理论求解方法分类:
(i)分枝定界法—可求纯或混合整数线性规划。
(ii)割平面法—可求纯或混合整数线性规划。
(iii)隐枚举法—求解“0-1”整数规划:①过滤隐枚举法;②分枝隐枚举法。
(iv)匈牙利法—解决指派问题(“0-1”规划特殊情形)。
(v)蒙特卡洛法—求解各种类型规划。
整数线性规划可以用linprog函数,help里有超级详细的说明,0-1整数规划可以用bintprog函数。
1、求解整数规划问题并不是MATLAB的强项,如果不是有要求必需要用MATLAB,可以考虑使用Lingo求解,求解速度快,程序也很简单:
max=120x1+560x2;06x1+(1+05x2)x2=300;
x1>=0;
x2>=0;
@GIN(x1);@GIN(x2);
end
得到的结果是x1=500,x2=0。
2、用MATLAB求解整数规划,官方好像并没有提供有效的手段(仅有一个用于求解0-1规划问题的bintprog函数)。我知道的有两个第三方函数:
一个是bnb20,是十几年前编写的,现在用的话需要做一些改动。而且对非线性约束的处理似乎有问题,我使用它求解并未得到正确答案。
另一个是lpsolve,其实是用C语言编的,提供了MATLAB的调用接口而已。由于调用动态链接库涉及到32位/64位的问题,配置起来比较麻烦,似乎没必要用它而不是Lingo。
3、就本题而言,由于变量少,问题规模不大,可以采用穷举法。听起来穷举法似乎是一种比较笨的方法,但其实对于一些简单问题来说却最为直接有效。
由于x1, x2>=0,又存在一个等式约束,不难得到,满足约束的x2最大值为235153,考虑到整数约束,x2的取值其实只有一共24种可能(0-23);再考虑到等式约束,计算出的x2满足整数要求的仅有8个数而已。在8个数里面选一个最大的,应该不是难事吧?
参考代码:
ezplot('06x1+(1+05x2)x2-300',[0 500 0 24])hold on
x2 = 0:23;
x1 = ( 300 - (1+05x2)x2) / 06;
valid = abs(x1-fix(x1)) <= eps;
x1 = x1(valid);
x2 = x2(valid);
z = 120x1+560x2;
[inx,inx] = max(z);
[x1(inx) x2(inx)]
scatter(x1,x2,40,z,'filled')
colorbar
得到结果与用Lingo求解一致。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)