数学建模03——整数规划

目录

方法简介

概述

分类

特点

简单例题一

思路分析

代码实现

简单例题二

代码实现

简单例题三(背包问题表现为单目标、单下标)

思路分析

代码实现

简单例题四(指派问题表现为多目标、双下标)

思路分析

代码实现


方法简介

概述

      若在规划问题中,变量(全部或部分)限制为整数,则称为整数规划。

      目前所流行的求解整数规划的方法,往往只适 用于整数线性规划。目前还没有一种方法能有效地求解一切整数规划。

分类

(1)变量完全为整数时,称纯整数规划

(2)变量部分为整数时,称混合整数规划

特点

 (1)原线性规划有最优解,当自变量限制为整数后,其整数规划解的存在特点如下:

1) 原线性规划最优解全是整数,则整数规划最优解与线性规划最优解一致。

2) 整数规划无可行解。

3)有可行解,最优解也存在,但最优解值被削弱~

  (2) 整数规划最优解不能按照实数最优解简单取整而获得。

简单例题一

思路分析

       若在第一时段开始安排服务员上班,则会在第四时段结束后下班;同理若在第五时段开始时安排服务员,则会在第八时段结束后下班,故第六、七、八时段不应再安排服务员上班

       设第 j 时段开始时安排上班的服务员数目为 x_{j}^{}  ( j = 1, 2, 3, 4,5)

\min z=\sum_{j=1}^{j=5} x_{j}

代码实现

clc,clear;
f=[1,1,1,1,1];
A=[-1,0,0,0,0;-1,-1,0,0,0;-1,-1,-1,0,0;-1,-1,-1,-1,0;0,-1,-1,-1,-1;0,0,-1,-1,-1;0,0,0,-1,-1;0,0,0,0,-1];
b=[-10;-8;-9;-11;-13;-8;-5;-3];
lb=zeros(5,1);
[x,y]=linprog(f,A,b,[],[],lb)

找到最优解

x = 5×1
    10
     1
     0
     0
    12
y = 23

简单例题二

代码实现

clc,clear;
f=[-40,-30];
intcon=[1,2];% 限制两个变量为整数解
A=[1,1;240,120];
b=[6;1200];
lb=ones(2,1);
[x,fval]=intlinprog(f,intcon,A,b,[],[],lb);
x,fval=-fval

找到最优解

Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是容差范围内的整数,options.ConstraintTolerance = 1e-06。

x = 2×1
     4
     2
fval = 220

简单例题三(背包问题表现为单目标、单下标

思路分析

代码实现

clc,clear;
f=ones(6,1);
intcon=1:6;
A=[-1,-1,-1,0,0,0;0,0,0,-1,0,-1;0,0,-1,0,-1,0;0,-1,0,-1,0,0;0,0,0,0,-1,-1;-1,0,0,0,0,0];
b=-ones(6,1);
lb=0;
ub=1;
[x,fval]=intlinprog(f,intcon,A,b,[],[],lb,ub);
x,fval

找到最优解 Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是容差范围内的整数,options.ConstraintTolerance = 1e-06。

x = 6×1
     1
     0
     0
     1
     1
     0
fval = 3
% 蒙特卡洛法暴力求解
clc,clear;
% 模拟次数
n=100000;
% 初始化
res_x=0;
res_min=+Inf;
% 循环
for i=1:n
    x=randi([0,1],6,1);% 随机生成一组解
    if((x(1)+x(2)+x(3)>=1)&(x(4)+x(6)>=1)&(x(3)+x(5)>=1)&(x(2)+x(4)>=1)&(x(5)+x(6)>=1)&(x(1)>=1))
        sum_x=sum(x);
        if(sum_x<res_min)
            res_x=x;
            res_min=sum_x;
        end
    end
end
res_min,res_x

简单例题四(指派问题表现为多目标、双下标

思路分析

           约束条件:(1)每台设备必然分给四个企业中的一个

                             (2)每个企业最少分一台

代码实现

clc,clear;
f=-[4 2 3 4, 6 4 5 5,7 6 7 6,7 8 8 6,7 9 8 6,7 10 8 6];
intcon=1:24;


A=-[eye(4),eye(4),eye(4),eye(4),eye(4),eye(4)];
b=-ones(4,1);
Aeq=[ones(1,4),zeros(1,20);
    zeros(1,4),ones(1,4),zeros(1,16);
    zeros(1,8),ones(1,4),zeros(1,12);
    zeros(1,12),ones(1,4),zeros(1,8);
    zeros(1,16),ones(1,4),zeros(1,4);
    zeros(1,20),ones(1,4)];
beq=ones(6,1);
lb=zeros(24,1);
ub=ones(24,1);
[x,fval]=intlinprog(f,intcon,A,b,Aeq,beq,lb,ub);
x,fval=-fval

找到最优解 Intlinprog 在根节点处停止,因为目标值在最优值的间隙容差范围内,options.AbsoluteGapTolerance = 1e-06。intcon 变量是容差范围内的整数,options.ConstraintTolerance = 1e-06。

x = 24×1
     0
     0
     0
     1
     1
     0
     0
     0
     1
     0
fval = 44
%蒙特卡洛法暴力求解
clc,clear;
% 模拟次数
n=10000;
f=[4 2 3 4; 6 4 5 5;7 6 7 6;7 8 8 6;7 9 8 6;7 10 8 6];
% 初始化
res_x=0;res_max=0;
% 循环
for k=1:n
    flag=1;
    x=randi([1,4],1,6);
    for J=1:4
        % 判断每个企业是否分到一台设备
        z=ismember(J,x);
        if(z==0)
            flag=0;
            break;
        end
    end
    % 每个企业分到一台设备
    if(flag==1)
        sum=0;
        for i=1:6
            sum=sum+f(i,x(J));
        end
            % 比较利润大小
            if(sum>res_max)
                res_max=sum;
                res_x=x;
            end
    end
end
res_x,res_max

res_x = 1×6
     2     1     3     3     4     1
res_max = 39
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值