建模算法(二)——整数规划
一、概述
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
建模算法(二)——整数规划的更多相关文章
- Python小白的数学建模课-04.整数规划
整数规划与线性规划的差别只是变量的整数约束. 问题区别一点点,难度相差千万里. 选择简单通用的编程方案,让求解器去处理吧. 『Python小白的数学建模课 @ Youcans』带你从数模小白成为国赛达 ...
- 建模算法(五)——图与网络
(一)图与网络的基本概念 一.无向图 含有的元素为顶点,弧和权重,但是没有方向 二.有向图 含有的元素为顶点,弧和权重,弧具有方向. 三.有限图.无限图 顶点和边有限就是有限图,否则就是无限图. 四. ...
- TensorFlow 入门之手写识别(MNIST) softmax算法 二
TensorFlow 入门之手写识别(MNIST) softmax算法 二 MNIST Fly softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...
- 分布式共识算法 (二) Paxos算法
系列目录 分布式共识算法 (一) 背景 分布式共识算法 (二) Paxos算法 分布式共识算法 (三) Raft算法 分布式共识算法 (四) BTF算法 一.背景 1.1 命名 Paxos,最早是Le ...
- 建模算法(一)——线性规划
一.解决问题 主要是安排现有资源(一定),取得最好的效益的问题解决,而且约束条件都是线性的. 二.数学模型 1.一般数学模型 2.MATLAB数学模型 其中c,x都是列向量,A,Aeq是一个合适的矩阵 ...
- 决策树-Cart算法二
本文结构: CART算法有两步 回归树的生成 分类树的生成 剪枝 CART - Classification and Regression Trees 分类与回归树,是二叉树,可以用于分类,也可以用于 ...
- Design2:数据层次结构建模之二
MSSql提供了一个新的数据类型 HierarchyID,用来处理层次结构的数据,这个数据类型是系统内置的CLR数据类型,不需要专门激活 SQL/CLR 功能即可使用.当需要表示各值之间的嵌套关系,并 ...
- Floyd算法(二)之 C++详解
本章是弗洛伊德算法的C++实现. 目录 1. 弗洛伊德算法介绍 2. 弗洛伊德算法图解 3. 弗洛伊德算法的代码说明 4. 弗洛伊德算法的源码 转载请注明出处:http://www.cnblogs.c ...
- Dijkstra算法(二)之 C++详解
本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...
随机推荐
- c++实现加密和解密算法以及JNI技术的应用实例
#include "jiami.h" #include "jni.h" #include "com_test_start_CommonClassLoa ...
- ubuntu显示桌面的快捷键,以及修改方法
在ubuntu下面,快速显示桌面,你可以这样做. 1,ctrl+alt+d (默认的) 2,alt+tab 可以切换到桌面 但是我想把它修改成和windows一样的,我该怎么做呢? 其实很简单. 系统 ...
- 入门必看--JavaScript基础
JavaScript他是一种描述性语言,其实他并不难学,只要用心学,一定会学好,我相信大家在看这篇文章的时候,一定也学过HTML吧,使用JavaScript就是为了能和网页有更好的交互,下面切入主题. ...
- Poj 1061 青蛙的约会(扩展GCD)
题目链接:http://poj.org/problem?id=1061 解题报告:两只青蛙在地球的同一条纬度线上,选取一个点位坐标轴原点,所以现在他们都在同一个首尾相连的坐标轴上,那么他们现在的位置分 ...
- [Effective JavaScript 笔记]第30条:理解prototype、getPrototypeOf和__ptoto__之间的不同
原型包括三个独立但相关的访问器.这三个单词都是对单词prototype做了一些变化. C.prototype用于建立由new C()创建的对象的原型 Object.getPrototypeOf(obj ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- Python socket 详解
socket()函数用于根据指定的地址族.数据类型和协议来分配一个套接口的描述字及其所用的资源.如果协议protocol未指定(等于0),则使用缺省的连接方式. 对于使用一给定地址族的某一特定套接口, ...
- HDFS 原理、架构与特性介绍--转载
原文地址:http://www.uml.org.cn/sjjm/201309044.asp 本文主要讲述 HDFS原理-架构.副本机制.HDFS负载均衡.机架感知.健壮性.文件删除恢复机制 1:当前H ...
- PeopleEditor允许客户端输入的同时验证输入的内容
如何判断PeopleEditor的值为空 在sharepoint开发中,我们经常会用到PeopleEditor这一控件,最近我在写程序的时候用到了,开始的时候不知道怎么用,后来问题解决啦,现在写出 ...
- MySQL的LIMIT与分页优化
在系统中需要进行分页操作的时候,我们通常会使用LIMIT加上偏移量的办法实现,同时加上合适的ORDER BY子句.如果有对应的索引,通常效率会不错,否则,MySQL需要做大量的文件排序操作. 一个非常 ...