一、概述

1、定义:规划中变量部分或全部定义成整数是,称为整数规划。

2、分类:纯整数规划和混合整数规划。

3、特点:

(1)原线性规划有最优解,当自变量限制为整数后:

a、原最优解全是整数,那最优解仍成立

b、整数规划没有可行解

c、有可行解,但是不是原最优解

4、求解方法分类

(1)分支定界法

(2)割平面法

(3)隐枚举法

(4)匈牙利法

(5)蒙特卡洛法

二、分支定界法

1、算法如下(求解整数规划最大化问题)

MATLAB实现

function r=checkint(x)
%判断x(i)是不是整数了。是的话r(i)返回1,不是的话,返回0 %输入参数:x X向量
%输出参数:r R向量 for i=1:length(x)
if(min(abs(x(i)-floor(x(i))),abs(x(i)-ceil(x(i))))<1e-3)
r(i)=1;
else
r(i)=0;
end
end
function val=isrowinmat(arow,mat)
%用来判断mat中是否包含与arow一样的向量 %输入变量:arow 向量
% mat 矩阵
%输出变量:val 1表示有,0表示没有
val=0;
rows=size(mat,1);
for i=1:rows
temp=(mat(i,:)==arow);
if length(find(temp==0))==0
val=1;
return;
else
val=0;
end;
end
function [x,fval,exitflag,output,lambda]=linprogdis(ifint,f,A,b,Aeq,beq,lb,ub,x0,options)
% 用法
% [x,fval,exitflag,output,lambda]=lpint(ifint.f,A,b,Aeq,beq)
% [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb)
% [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb,ub)
% [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb,ub,x0)
% [x,fval,exitflag,output,lambda]=lpint(ifint,f,A,b,Aeq,beq,lb,ub,x0,options) if nargin<10, options=[]; end
if nargin<9, x0=[]; end
if nargin<8, ub=inf*ones(size(f)); end
if nargin<7, lb=zeros(size(f)); end [x,fval,exitflag,output,lambda]=linprog(f,A,b,Aeq,beq,lb,ub,x0,options); if exitflag<=0 %表示线性规划没有最优解
return
end v1=find(ifint==1); %找到需要整数规划的变量的下标 temp=x(v1);%如果不是要求整数规划的就可以返回了。
if isempty(temp)
return
end v2=find(checkint(temp)==0);
if isempty(v2) %都是整数,得到最众解
return
end k=v1(v2(1)); temp1=zeros(1,length(f));
temp1(k)=1;
low=floor(x(k));
if isrowinmat([temp1,low],[A,b])==1
thisA=A;
thisb=b;
else
thisA=[A;temp1];
thisb=b;
thisb(end+1)=low;
end [x1,fval1,exitflag1,output1,lambda1]=linprogdis(ifint,f,thisA,thisb,Aeq,beq,lb,ub,x0,options); temp2=zeros(1,length(f));
temp2(k)=-1;
high=-ceil(x(k));
if isrowinmat([temp2,high],[A,b])==1
thisA=A;
thisb=b;
else
thisA=[A;temp2];
thisb=b;
thisb(end+1)=high;
end [x2,fval2,exitflag2,output2,lambda2]=linprogdis(ifint,f,thisA,thisb,Aeq,beq,lb,ub,x0,options); if (isempty(v2) && ((exitflag1>0 && exitflag2<=0 && fval<=fval)||(exitflag2>0 && exitflag1<=0 && fval<=fval2)||(exitflag1>0 && exitflag2>0 && fval<=fval1 && fval<=fval2)))
disp('error call');
return ; %表示都是整数
end if exitflag1>0&&exitflag2<=0
x=x1;
fval=fval1;
exitflag=exitflag1;
output=output1;
lambda=lambda1;
elseif exitflag1<=0&&exitflag2>0
x=x2;
fval=fval2;
exitflag=exitflag2;
output=output2;
lambda=lambda2;
elseif exitflag1>0 && exitflag2>0
if fval1<fval2
x=x1;
fval=fval1;
exitflag=exitflag1;
output=output1;
lambda=lambda1;
else
x=x2;
fval=fval2;
exitflag=exitflag2;
output=output2;
lambda=lambda2;
end
end

三、0-1型整数规划

1、定义:就是变量的取值只能是0-1,这样的话,其实我们可以将不同的整数规划转化成0-1规划。

2、实际问题:

这里我们就可以直接列出一个是0-1规划的方程,设的变量xi,“1”表示被选中,“0”表示没被选中

3、相互排斥的约束条件可以转化成同类型的。

四、求解整数规划的3种方法

(1)穷举法,这种比较土= =,但是最有效,而且某些情况只能穷举。

(2)过渡隐枚举法

a、先试探性求一个可行解X(随便带入求值)

b、然后根据是求极大值还是极小值,如果是求极大值,那么凡是目标值<X的解不必检验是否满足约束条件即可删除,如果是求极小值,那么凡是目标值>X不必检验是否满足约束条件就可满足。

c、改进新的过滤条件

d、然后验证目标值,最终求得。

PS:怎么说呢,这个方法就是一种变相的穷举,如果运气不好,就会变成全部都穷举,但是因为是先比较目标值,所以可以减少计算量,因而还是有效的(但是要注意不要犯反复测验的错误)、

(3)蒙特卡洛法(随机抽样法)

就是选择不穷举全部点,而是采用随机的方式来抽取样本估计整体,如果样本足够大,可信度是很大的。

例如求解此题:

MATLAB编程求解:

function [ f,g ] = mengte( x )
%MENGTE 键入整数线性规划的目标函数和约束条件
% f:指的是目标函数 向量
% g:指的是约束条件 向量 f=x(1)^2+x(2)^2+3*x(3)^2+4*x(4)^2+2*x(5)^2-8*x(1)-2*x(2)-3*x(3)-x(4)-2*x(5); g=[sum(x)-400
x(1)+2*x(2)+2*x(3)+x(4)+6*x(5)-800
2*x(1)+x(2)+6*x(3)-200
x(3)+x(4)+5*x(5)-200]; end
rand('state',sum(clock));
p0=0;
tic
for i=1:10^6
x=99*rand(5,1);
x1=floor(x);x2=ceil(x);
[f,g]=mengte(x1);
if sum(g<=0)==4
if p0<=f
x0=x1;p0=f;
end
end
[f,g]=mengte(x2);
if sum(g<=0)==4
if p0<=f
x0=x2;p0=f;
end
end
end
x0,p0

五、0-1整数规划的求解

例如求解这个指派问题。

由于MATLAB里面有封装好的函数- -,我就不用C++再写了。。不过这个问题还是很容易写出来的,一些比赛题目也会出现的。

c=[3,8,2,10,3;
8,7,2,9,7;
6,4,2,7,5;
8,4,2,3,5;
9,10,6,9,10] c=c(:);%就是变成列向量(提取矩阵的方法)
a=zeros(10,25);
for i=1:5
a(i,(i-1)*5+1:1:5*i)=1;
a(5+i,i:5:25)=1;
end
b=ones(10,1);
[x,y]=bintprog(c,[],[],a,b);
x=reshape(x,[5,5]),y

建模算法(二)——整数规划的更多相关文章

  1. Python小白的数学建模课-04.整数规划

    整数规划与线性规划的差别只是变量的整数约束. 问题区别一点点,难度相差千万里. 选择简单通用的编程方案,让求解器去处理吧. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达 ...

  2. 建模算法(五)——图与网络

    (一)图与网络的基本概念 一.无向图 含有的元素为顶点,弧和权重,但是没有方向 二.有向图 含有的元素为顶点,弧和权重,弧具有方向. 三.有限图.无限图 顶点和边有限就是有限图,否则就是无限图. 四. ...

  3. TensorFlow 入门之手写识别(MNIST) softmax算法 二

    TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  4. 分布式共识算法 (二) Paxos算法

    系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...

  5. 建模算法(一)——线性规划

    一.解决问题 主要是安排现有资源(一定),取得最好的效益的问题解决,而且约束条件都是线性的. 二.数学模型 1.一般数学模型 2.MATLAB数学模型 其中c,x都是列向量,A,Aeq是一个合适的矩阵 ...

  6. 决策树-Cart算法二

    本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 CART - Classification and Regression Trees 分类与回归树,是二叉树,可以用于分类,也可以用于 ...

  7. Design2:数据层次结构建模之二

    MSSql提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌套关系,并 ...

  8. Floyd算法(二)之 C++详解

    本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...

  9. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

随机推荐

  1. c++实现加密和解密算法以及JNI技术的应用实例

    #include "jiami.h" #include "jni.h" #include "com_test_start_CommonClassLoa ...

  2. ubuntu显示桌面的快捷键,以及修改方法

    在ubuntu下面,快速显示桌面,你可以这样做. 1,ctrl+alt+d (默认的) 2,alt+tab 可以切换到桌面 但是我想把它修改成和windows一样的,我该怎么做呢? 其实很简单. 系统 ...

  3. 入门必看--JavaScript基础

    JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...

  4. Poj 1061 青蛙的约会(扩展GCD)

    题目链接:http://poj.org/problem?id=1061 解题报告:两只青蛙在地球的同一条纬度线上,选取一个点位坐标轴原点,所以现在他们都在同一个首尾相连的坐标轴上,那么他们现在的位置分 ...

  5. [Effective JavaScript 笔记]第30条:理解prototype、getPrototypeOf和__ptoto__之间的不同

    原型包括三个独立但相关的访问器.这三个单词都是对单词prototype做了一些变化. C.prototype用于建立由new C()创建的对象的原型 Object.getPrototypeOf(obj ...

  6. [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  7. Python socket 详解

    socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的资源.如果协议protocol未指定(等于0),则使用缺省的连接方式. 对于使用一给定地址族的某一特定套接口, ...

  8. HDFS 原理、架构与特性介绍--转载

    原文地址:http://www.uml.org.cn/sjjm/201309044.asp 本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前H ...

  9. PeopleEditor允许客户端输入的同时验证输入的内容

    如何判断PeopleEditor的值为空   在sharepoint开发中,我们经常会用到PeopleEditor这一控件,最近我在写程序的时候用到了,开始的时候不知道怎么用,后来问题解决啦,现在写出 ...

  10. MySQL的LIMIT与分页优化

    在系统中需要进行分页操作的时候,我们通常会使用LIMIT加上偏移量的办法实现,同时加上合适的ORDER BY子句.如果有对应的索引,通常效率会不错,否则,MySQL需要做大量的文件排序操作. 一个非常 ...