用matlab和LINGO求解整数规划问题

整数规划问题

尤其是0-1整数规划问题 是我们在数学建模中经常会遇到问题,TSP问题、指派问题、背包问题等,接下来,我将用matlab和LINGO中的一些函数来解决整数规划问题。
matlab常用的就是 intlinprog函数

LINGO 通过 @gin 来实现取整操作

 

intlinprog

  可以使用 matlab 中的 intlinprog 函数 专门用于 求解整数规划问题。 其中值的一提的是,原来以前版本的matlab是不支持求解整数规划问题,只提供了 bintprog函数 来求解 0-1整数问题,但现在matlab 提供了 intlinprog函数来专门求解整数规划问题,且你只需要把函数的自变量x的取值的上下限变为0和1,那么 intlinprog函数就变成了一个求解0-1整数规划问题

intlinprog 函数 用于 求解 这种情况

                                               \large min\quad z=c^Tx\\ s.t. \left\{ \begin{aligned} Ax\leq b,\\ Aeq \ x=beq , \\ lb \leq x_i \leq ub & & i=1,2,...,n \end{aligned} \right.

方程为:

[x, fval]=intlinprog (f, intcon, A, b, Aeq, beq, lb ,ub) ,其中 intcon 为 整数约束的自变量x的编号,比如 方程里面取整的 函数 为 x1、x2、x3 则 intcon=[1 2 3];

 

对于下面一个方程:

                                      \large max\quad z=100x_1+150x_2 \\ s.t. \left\{ \begin{aligned} x_1+2x_2 \leq 160, \\ x_1 \leq 100, \\ x_2 \leq 120, \\ x1,x2 \geq0 \end{aligned} \right.     且 x1 、 x2 为整数

所以,我们用来求解上图那个方程的代码就是:
 

c=[100 150];
A=[1 2;1 0;0 1];
b=[160;100;120];
lb=zeros(2,1);
[x, fval]=intlinprog(-c,[1 2],A,b,[],[],lb);
disp(x);
disp(c*x);

由于intlinprog函数是用于求解最小值,所以我们对目标函数加个负号, 也就是 对 负的目标函数 求最小值 ,即对目标函数求最大值,所以得出结果是直接c*x 就行

结果为:


  100.0000
   30.0000

   14500

如果只符合0-1规划的话,那我们就把ub 设置为1就好

LINGO来求解:

model:
max=100*x1+150*x2;
x1+2*x2<=160;
x1<=100;
x2<=120;

@gin(x1);
@gin(x2);


end

由于,LINGO默认变量都是大于0,所以只需要取整就行。

结果为:

即 x1=100,x2=30,最终结果为 14500。

以上就是 用matlab和 LINGO 两种软件来求解 整数规划问题!

  • 15
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
整数规划问题求解在约束条件下,所有变量均为整数的优化问题。以下是一个例子: 假设有一家公司要生产产品A和产品B,用到3种原材料X、Y、Z,每种原材料的数量和成本如下表所示: | 原材料 | 产品A | 产品B | | ------ | ------ | ------ | | X | 2 | 1 | | Y | 1 | 3 | | Z | 4 | 2 | | 成本 | 7 | 6 | 另外,公司需要满足以下约束条件: 1. 原材料X的数量不得少于20,原材料Y的数量不得少于10,原材料Z的数量不得少于30。 2. 公司需要生产至少10个产品A和20个产品B。 3. 公司需要遵守以下生产比例:产品A和产品B的比例不得超过 1:2。 现在要求公司如何在满足以上约束条件的前提下,以最小的成本生产所需的产品。 MATLAB解法: ```matlab % 原材料成本 C = [7 6]; % 原材料数量限制 A = [-2 -1; -1 -3; -4 -2]; b = [-20; -10; -30]; % 生产数量限制 Aeq = [2 1; 0 1; -1 2]; beq = [10; 20; 0]; % 整数规划 intcon = [1 2]; [x, fval] = intlinprog(C, intcon, A, b, Aeq, beq, zeros(2,1)) % 输出结果 disp('生产产品A的数量为:'); disp(x(1)); disp('生产产品B的数量为:'); disp(x(2)); disp('最小成本为:'); disp(fval); ``` LINGO解法: ``` SET_PRODUCTS = 2; SET_MATERIALS = 3; PARAMETERS C(SET_PRODUCTS) ! 原材料成本 A(SET_MATERIALS, SET_PRODUCTS) ! 原材料使用数量 b(SET_MATERIALS) ! 原材料数量限制 Aeq(SET_PRODUCTS, SET_PRODUCTS) ! 生产数量限制 beq(SET_PRODUCTS) ! 生产数量限制 END C = 7 6 A = 2 1 1 3 4 2 b = 20 10 30 Aeq = 2 1 0 1 beq = 10 20 VARIABLES x(SET_PRODUCTS) INTEGER ! 生产数量 END ! 目标函数为生产成本 MIN = C * x ! 原材料使用量限制 A * x >= b ! 生产数量限制 Aeq * x = beq ! 生产比例限制 x(1) <= 2 * x(2) ! 求解 INTEGER :: x SOLVE ! 输出结果 DISPLAY x("生产产品A的数量为") x("生产产品B的数量为") MIN ``` 以上是MATLABLINGO求解整数规划问题的例子,两种语言都可以有效地解决这类问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值