数学规划模型——整数规划问题

整数规划

整数规划:

  1. 线性整数规划 - Matlab可进⾏求解 (线性的意思 在线性规划的基础上 , 加⼊决策变量取整数的条件)

  2. ⾮线性整数规划 → ⽆特定算法, 只能⽤近似算法 , 如蒙特卡罗模拟 、 智能算法 ( 后续会讲到)

特例: 特殊的整数规划 , Matlab中也只能求解线性01规划, 对于⾮线性 0-1规划也只能近似求解 。 (数模⽐赛中常出现)

Matlab整数规划求解

线性整数规划求解

[x ,fval] = linprog [ c, A, b, Aeq, beq, lb, ub, X0] -> 线性规划的函数

[x ,fval] = intlinprog [ c, intconA, b, Aeq, beq, lb, ub]→ 线性整数规划的求解

注 :

  1. intlinpng 不能指定初始值 ;
  2. 加⼊了 inton 参数可以指定哪些决策变量是整数。

例如决策变量有三个 : x1,x2,x3 ; 若x1和x3,是整数 , 则 intcon= [1 , 3] 。

线性 0-1规划求解

仍然使⽤intlinprog 函数 , 只不过在 lb和ub上作⽂章 。

例如决策变量有三个 : x1,x2,x3 ; 若x1和x3是0-1变量,x2不限制, 则 intcon= [1 , 3] ,lb=[0 -inf 0]',ub=[1,+inf,1]。

小例题

%% 线性整数规划问题
%% 例1
c=[-20,-10]';
intcon=[1,2];  % x1和x2限定为整数
A=[5,4;
      2,5];
b=[24;13];
lb=zeros(2,1);  
[x,fval]=intlinprog(c,intcon,A,b,[],[],lb)
fval = -fval

%% 例2
c=[18,23,5]';
intcon=3;  % x3限定为整数
A=[107,500,0;
      72,121,65;
      -107,-500,0;
      -72,-121,-65];
b=[50000;2250;-500;-2000];
lb=zeros(3,1);
[x,fval]=intlinprog(c,intcon,A,b,[],[],lb)

%% 例3
c=[-3;-2;-1]; intcon=3; % x3限定为整数
A=ones(1,3); b=7;
Aeq=[4 2 1]; beq=12;
lb=zeros(3,1); ub=[+inf;+inf;1]; %x(3)为0-1变量
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)

整数规划的典型例题

背包问题

%% 背包问题(货车运送货物的问题)
c = -[540 200 180 350 60 150 280 450 320 120];  % 目标函数的系数矩阵(最大化问题记得加负号)
intcon=[1:10];  % 整数变量的位置(一共10个决策变量,均为0-1整数变量)
A = [6 3 4 5 1 2 3 5 4 2];  b = 30;   % 线性不等式约束的系数矩阵和常数项向量(物品的重量不能超过30)
Aeq = []; beq =[];  % 不存在线性等式约束
lb = zeros(10,1);  % 约束变量的范围下限
ub = ones(10,1);  % 约束变量的范围上限
%最后调用intlinprog()函数
[x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
fval = -fval

指派问题

%% 指派问题(选择队员去进行游泳接力比赛)
clear;clc
c = [66.8 75.6 87 58.6 57.2 66 66.4 53 78 67.8 84.6 59.4 70 74.2 69.6 57.2 67.4 71 83.8 62.4]';  % 目标函数的系数矩阵(先列后行的写法)
intcon = [1:20];  % 整数变量的位置(一共20个决策变量,均为0-1整数变量)
% 线性不等式约束的系数矩阵和常数项向量(每个人只能入选四种泳姿之一,一共五个约束)
A = [1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;
       0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
       0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0;
       0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0;
       0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1];
% A = zeros(5,20);
% for i = 1:5
%     A(i, (4*i-3): 4*i) = 1;
% end
b = [1;1;1;1;1];
% 线性等式约束的系数矩阵和常数项向量 (每种泳姿有且仅有一人参加,一共四个约束)
Aeq = [1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0;
          0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0;
          0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0;
          0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1];
% Aeq = [eye(4),eye(4),eye(4),eye(4),eye(4)];  % 或者写成 repmat(eye(4),1,5) 
% Aeq=zeros(4,20);
% for i = 1:4
%     for j =1:20
%         if mod(j,4)==i
%             Aeq(i,j)=1;
%         end
%         if i==4
%             if mod(j,4)==0
%                 Aeq(i,j)=1;
%             end
%         end
%     end
% end  

beq = [1;1;1;1];
lb = zeros(20,1);  % 约束变量的范围下限
ub = ones(20,1);  % 约束变量的范围上限
%最后调用intlinprog()函数
[x,fval] = intlinprog(c,intcon,A,b,Aeq,beq,lb,ub)
% reshape(x,4,5)'
%      0     0     0     1    甲自由泳
%      1     0     0     0    乙蝶泳
%      0     1     0     0    丙仰泳
%      0     0     1     0    丁蛙泳
%      0     0     0     0    戊不参加

钢管切割问题

%% 钢管切割问题
%% (1)枚举法找出同一个原材料上所有的切割方法
for i = 0: 2  % 2.9m长的圆钢的数量
    for j = 0: 3  % 2.1m长的圆钢的数量
        for k = 0:6   % 1m长的圆钢的数量
            if 2.9*i+2.1*j+1*k >= 6 & 2.9*i+2.1*j+1*k <= 6.9
                disp([i, j, k])
            end
        end
    end
end

%% (2) 线性整数规划问题的求解
c = ones(7,1);  % 目标函数的系数矩阵
intcon=[1:7];  %  整数变量的位置(一共7个决策变量,均为整数变量)
A = -[1 2 0 0 0 0 1;  
         0 0 3 2 1 0 1;
         4 1 0 2 4 6 1];  % 线性不等式约束的系数矩阵
b = -[100 100 100]'; %  线性不等式约束的常数项向量
lb = zeros(7,1); % 约束变量的范围下限
[x,fval]=intlinprog(c,intcon,A,b,[],[],lb)

posted @ 2020-02-27 19:39  pxlsdz  阅读(4270)  评论(0编辑  收藏  举报