首页 > 代码库 > 建模算法(二)——整数规划
建模算法(二)——整数规划
一、概述
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; endend
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=[]; endif nargin<9, x0=[]; endif nargin<8, ub=inf*ones(size(f)); endif 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 endv1=find(ifint==1); %找到需要整数规划的变量的下标temp=x(v1);%如果不是要求整数规划的就可以返回了。if isempty(temp) returnendv2=find(checkint(temp)==0);if isempty(v2) %都是整数,得到最众解 returnendk=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 ; %表示都是整数endif 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; endend
建模算法(二)——整数规划
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。