穷举法求解0-1整数规划的matlab程序(原创)
Matlab求解线性规划和整数规划问题

Matlab求解线性规划和整数规划问题Matlab是一种强大的数学计算工具,可以用于求解线性规划和整数规划问题。
本文将详细介绍如何使用Matlab来求解这两类问题。
一、线性规划问题的求解方法线性规划问题是一类常见的数学优化问题,其目标是在一组线性约束条件下,找到使目标函数取得最大(或者最小)值的变量取值。
以下是求解线性规划问题的普通步骤:1. 定义目标函数和约束条件首先,需要明确线性规划问题的目标函数和约束条件。
目标函数是需要最大化或者最小化的函数,通常是一个线性函数。
约束条件是对变量的一组线性不等式或者等式限制。
例如,假设我们要最大化目标函数 f(x) = 3x1 + 4x2,同时满足以下约束条件:2x1 + x2 ≤ 10x1 + 3x2 ≤ 12x1, x2 ≥ 02. 构建模型将目标函数和约束条件转化为Matlab中的矩阵和向量形式。
可以使用矩阵A 表示约束条件的系数矩阵,向量b表示约束条件的右侧常数向量,向量c表示目标函数的系数向量。
在上述例子中,可以定义矩阵A、向量b和向量c如下:A = [2, 1; 1, 3]b = [10; 12]c = [-3; -4]3. 求解线性规划问题使用Matlab的线性规划求解函数linprog来求解线性规划问题。
该函数的基本语法如下:[x, fval, exitflag] = linprog(c, A, b)其中,x是最优解向量,fval是最优解的目标函数值,exitflag是求解器的退出标志。
继续以上述例子为例,可以使用以下代码求解线性规划问题:[x, fval, exitflag] = linprog(c, A, b)4. 结果解读最优解向量x即为线性规划问题的最优解。
最优解的目标函数值fval表示在最优解下目标函数的取值。
退出标志exitflag用于判断求解器是否成功找到最优解。
二、整数规划问题的求解方法整数规划问题是线性规划问题的一种扩展,其变量需要取整数值。
MATLAB求解编程

NIND=200;MAXGEN=2000;NV AR=55;max=5000000;P=0.3;M=3;N=5;L=7;A=[313000000 378000000 465000000] ;M=[20000 10000 30000 40000 40000] ;D=[165 150 200 100 150 300 200] ;f=[6000000;4000000;6000000;700000;5000000] ;V=[80;80;90;955;100] ;a=[15;20;24;20;15;20;20;15;20;24;20;15;24;20;15] ;C=[20;15;15;20;15;20;15;20;25;20;25;15;15;15;15;15;15;20;20;25;20;30;20;20;20;20;25;20;20;1 5;15;15;20;20;20;20] ;P=3;for i=l:NINDwhile 0<1for j=1:5chroml(i,j)=round(rand(i)) ;endif(sum(chroml(i,:),3)>=1)&(sum(chroml(i,:) ,3)<=P)breakendendendsumb=zeros(NIND,5) ;sumd=zeros(NIND,5);for i=l:NINDfor j=l:5if chrom1(i,j)=0chrom3(i,(2*(j-1)+1):(3*j))=0;chrom3(i, (7*(j-l)+1):(8*j))=0;elsewhile chroml(i,j)=l chrom3(i,(3*(j-1)+1):(3*j)=rand(i,3).* min(A[M(j)M(j)]);sumb(i,j)=sum(chrom3(i,(3*(j-l)+1):(3*j)),3);chrom3(j,(7*(j-1)+1):(7*j))=rand(1,7).*(rep([M(j)],[11]));sumd(i,j)=sum(chrom3(i,(7*(j-l)+1):(7*j)),3);chrom3(i,(7*(j-l)+1):(7*j))=(sumb(i,j)/sumd(i,j))*chrom3(i,(7*(j-l)+1):(7*j));if sumb(i,j)<=1.0*M(j)breakendendendendendchrom=[chroml chrorn2 chrom3];%产生初始种群[objvalue]=calobjvaluc(chrom,M,N,L,A,C, V,f);[fitvalue,restriction]=calfitvalue(objvalue,chrom,max,M,N,L,A,M,D,P); [bestindividual,bestfit,bestrestriction,nopos]=best(chrom,fitvalue,restriction);gem=0;while gen<MAXGEN,[objvalue]=calobjvalue(chrom,M,N,L,A,C,V,D);[fitvalue,restriction]=calfitvalue(objvalue,chrom,max,M,N,L,A,M,D,P); [bestindividuall,bestfitl,bestrestrictionl,noposl]=best(chrom,fitvalue,restriction);if bestrestriction>bestrestrictionlbestindividual=bestindividual l;besttit=-bestfitl;bestrestriction=bestrestriction l;endif bestrestriction =bestrcstrictionl)&(bestfit<bestfitl)bestindividual=beStindividual l;besttit=-bestfitl;bestrestriction=bestrestrictionl:endchrom(noposl,:)=bestindividual;[newchrom]=selection(chrom,fitvalue);[newchrom]=crossover(newchrom,M,N,1);[newchrom]=mutation(newchrom,P,M,N,1);[bestindividual2,bestfit2,bestrestrietion2,nopos2]=best(newchrom,fitvalue, restrietion); If bestrestriction>bestrestriction2bestindividual=bestindividual2;bestfit=bestfit2;bestrestriction=bestrestriction2;endif(bestrestriction=bestrestriction2)&(bestfit<bestfit2)bestindividual=bestindividual2;bestfit =-bestfit2;bestrestriction =bestrestriction2;endchrom=newchrom;gen=gen+1;endbestindividual,bestfit,bestrestriction%目标函数Function[objvalue]=ealobjvalue(chrom,M,N,L,A, V,f)Chrom1= chrom(:,1:N);Chrom2=chrom(:,(N+1):(N+M*N));chrom3= chrom (:,(N+M*N+1):(N+M*N+N*L));[NIND,NV AR]=size(chrom);for i=l:NINDfor j=l:Nu(i,j)=7300*sum(chrom2(i,(2*(j-l)+1):(2*j)),2);endendobjvalue=chrom2*a*7300+chrom3*c*3650+sqrt(u).* chroml*V+chroml*f; %适应度计算和约束判断Function[fitvalue restrection]=ealfitvalue(objvalue,chrom, max,M,N,l,A,M,D,P)Global gen;[NIND,NV AR]=size(chrom);Chroml=chrom (:,1:N);chrom2=Chrom(:,(N+1):(N+M*n));chrom3=Chrom(:,(N+M*N*N+1):(N+M*N+N*1));restriction=zeros(NIND,1);r=zeros(NIND,M);s=zeros(NIND,N);t=zeros(NIND,1);u=zeros(NIND,3);p=zeros(NIND,n);for i=l:NINDfor j=l:Mr(i,j)=A(j)-sum((chrom2(i,j:m:m*}n)),2);if r(i,j)<0restriction(i,1)=restriction(i,1)+1;endendfor j=l:lt(i,j)=sum((chrom3(i,j:l:n*1)),2)-D(j);if t(i,j)<0restriction(i,1)=-restriction(i,l)+1;endendfor j=l:ns(i,j)=chroml(i,j)*M(j)-sum(chrom2(i,(M*(j-1)+1):(M*j)),2);p(i,j)=abs(sum(chrom3(i,(1*(j-1)+1):(1*j)),2)-sum(chrom2(i,(M*(j-1)+1):(M*j)),2));if s(i,j)<0restrietion(i,1)=restriction(i,1)+l;endif p(i,j)>=l e-3restriction(i,1)=restriction(i,l)+l;endendu(i,1)=P-sum(chroml(i,:),2);if u(i,1)<0restriction(i,1)=restriction(i,l)+1;endu(i,2)=sum(chroml(i,:),2)-1;if u(i,2)<0restrigtion(i,1)=restriction(i,1)+l;endif(objvalue(i,1)<max)fitvaluc(i,1)=max-objvaluc(i,1);elsefitvalue(i,1)=0.0;endend%找出最优个体和最差个体function[bestindividual,bestfit,bestrestriction,nopos]=best(chrom,fitvalue,restriction); [NIND,NV AR]=size(chrom);pos=l;for i=l:NINDif restriction(pos,1)>restriction(i,1)pos=i;endif(restriction(pos,1)=restriction(i,1))&(fitvalue(pos,1)<fitvalue(i,1)) pos=i;endendbestindividual=chrom(pos,:);bestfit=fitvalue(pos);bestrestriction= restriction (pos,:);nopos=1;for i=l:NINDif restriction(nopos,1)<restriction(i,1)nopos=i;endif(restriction(nopos,1)=restriction(i,1))&(fitvalue(nopos,1)>fitvalue(i,1)) nopos=i;endend%选择Function[newchrom]=selection(chrom,fitvalue)totalfit=sum(fitvalue);fitvalue=:fitvalue/totalfit;fitvalue=cumsum(fitvalue);[NIND,NV AR]=size(chrom);ms=sort(rand(NIND,1));fitin=1;newin=1;while newin<=NINDif(ms(newin))<fitvalue(fitin)temp(newin,:)=chrom(fitin,:);newin=newin+1;elsefitin=fitin+1;endif fitin>=NINDfitin=NIND;endendnewchrom=temp;%交叉Function[newchrom]=crossover(chrom,M,N,1)global gen;[NIND,SVAR]=size(chrom);chrom1=chrom(:,l:n);chrom2=chrom(:, (N+1) : (N+M*N)) ;chrom3=chrom(:, (N+m*n+1) : (N+M*N+N*1)) ; newchrom=zeros(NIND,NV AR) ;P=0.75;for i=l:2:NIND-1if(rand<P)point=ceil(rand*(N-1));ifpoint<5newchrom(i,:)=[chroml(i,l:point)chromI(i+1,point+1:n) ... chrom2(i,l:M*point)chrom2(i+l,M*point+1:M*N) ... chrom3(i,1:l*point)chrom3(i+l,1*point+l:N*1)]; newchrom(i+l,:)=[chroml(i+l,1:point)chroml(i,point+l:n) ... chrom2(i+l,l:m*point)chrom2(i,M*point+l:M*N) ...chrom3(i+1,1:l*point)chrom3(i,1*point+l:N*1)];elsenewchrom(i,:)=chrom(i,:);newchrom(i+1,:)=chrom(i+l,:);endelsenewchrom(i,:)=chromo,:);newchrom(i+l,:)=chrom(i+l,:);endend%变异Function[newchrom]=mutation(chrom,P,M,N,L)global gen;FieldDR=[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0;20000 20000 10000 10000 30000 30000 40000 40000 40000 40000];RANGE=[0 0 0 0 0 0 0;165 150 200 100 150 300 200];[NIND,NV AR]=size(chrom);chroml=chrom(:,l:N);chrom2=chrom(:, (N+1):(N+M*N));chrom3=chrom(:, (N+M*N+1):(N+M*n+ 1));newchrom=zeros(NIND,NV AR);newchroml=zeros(NIND,N);newchrom2=zeros(NIND,M*N);newchrom3=zeros(NIND,N*1);for i=1:NINDfor j=l:Nif chrom l(i,j)=0newchrom2(i,(M*(j-1)+1):(M*j))=0;newchrom3(i,1*(j-l)+1):(1*j)=0;elseif round(rand)=0newchrom2(i,(M*(j-1)+1):(M*j))=chrom2(i,(M*(j-1)+1):(M*j)+ ...(FieldDR(2,(M*(j-1)+1):(M*j))=chrom2(i,(M*(j-1)+1):(M*j)))*(1-rand^((1-gen/2000)^10));newchrom3(i,(1*(j-1)+1):(1*j)=chrom3(i,(1*(j-1)+1):(1*j) + ...([165 150 200 100 150 300 200]-chrom3(i,(1*(j-1)+1):(1*j)))*(1-rand^((1*gen/2000)^10));elseif round(rand)=lnewChrom2(i,(M*(j-1)+1):(M*j) ) = Chrom2 (i,(M*(j-1)+1):(M*j)) ...(chrom2(i,(M*(j-1)+1):(M*j))-[00])*(1-rand^((1-gen/2000)^10));newchrom3(i,(1*(j-1)+1):(1*j)):chrom3(i,(1*(j-1)+1):(1*j)) ...(chrom3(i,(1*(j-1)+1):(N))-[0 0 0 0 0 0 0 0])*(1-rand^((1*gen/2000)^10));endendendendnewchrom1=chrom1;newchrom=[newchrom1 newchrom2 newchrom3];endendnewchrom1=chrom1;newchrom=[newchrom1 newchrom2 newchrom3];bestindividualbestindividual=columms 1 through 171.0000 1.0000 0 0 1.000 80.3686 20.6636 0 0 23.7458 50.7648 63.57695 0 0 123.6753 39.7648 19.5769 0 0 289.6753 columms 18 through 3419.5849 50.7648 45.7985 64.2875 19.9768 53.6843 135.6752 32.6437 24.5342 27.9485 9.9873 24.7638 125.7958 27.8745 columms 35 through 510 0 0 0 0 0 00 0 0 0 0 0 0columms 52 through 5595.7482 35.9862 83.4768 28.4769 74.5867 113.4786 44.4873。
穷举法求解0-1整数规划的matlab程序(原创)

穷举法求解0-1整数规划的matlab程序(原创)0-1整数规划有很广泛的应用背景,比如指派问题,背包问题等等,实际上TSP 问题也是一个0-1问题,当然这些问题都是NP问题,对于规模较大的问题用穷举法是没有办法在可接受的时间内求得最优解的,本程序只不过是一个练习,得意之处是用递归法把所有解都排列出来。
另:胡运权所著的《运筹学基础及应用(第三版)》第97页的例3,我用本程序求解得到的结果是:最优解是x*=(1,0, 0, 0, 0),最优值是f(x*)=8,但书求得最优解是x*=(1,0, 1, 0, 0),最优值是f(x*)=4,是不是书中写错了,请大家验证。
以下是源程序,大家可以任意使用无版权问题,另外,如果大家有大规模的0-1规划的问题也希望提供给我,谢谢。
%%% 用隐穷举法求解0-1线性规划%%% min c'x%%% s.t. Ax<=bfunction [y,fval]=qiongju(c,A,b)guimo=length(c);suoyoujie=lingyi(guimo);?? % 所有可能解的排列[m,n]=size(A);opt_solution=inf; % 解的上界for i=1:2^guimoyueshu=A*suoyoujie(i,:)';for j=1:mif yueshu(j)>b(j)?? % 不满足某约束条件,则不是解break;endendif j==m?? % 满足所有约束,则计算该的目标值,并与当前最优解相比较val=c'*suoyoujie(i,:)';if val<=opt_solutionopt_solution=val;y=suoyoujie(i,:);endendendfval=opt_solution;function y=lingyi(k)if k==3y=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0;1 1 1];elselc=2^(k-1);xinlie1=zeros(lc,1);xinlie2=ones(lc,1);xinlie=[xinlie1;xinlie2];pre_lingyi=lingyi(k-1);pre_lingyi=[pre_lingyi;pre_lingyi];y=[xinlie,pre_lingyi];endFeedback忘了说了,变量个数至少是3个,要不然没办法运行了。
Matlab程序0-1整数线性规划

Matlab程序0-1整数线性规划0-1整数线性规划Matlab程序x = bintprog(f)x = bintprog(f, A, b)x = bintprog(f, A, b, Aeq, beq)x = bintprog(f, A, b, Aeq, beq, x0)x = bintprog(f, A, b, Aeq, Beq, x0, options)[x, fval] = bintprog(...)[x,fval, exitflag] = bintprog(...)[x, fval, exitflag, output] = bintprog(...)这里x是问题的解向量f是由目标函数的系数构成的向量A是一个矩阵,b是一个向量A,b和变量x={x1,x2,…,xn}一起,表示了线性规划中不等式约束条件A,b是系数矩阵和右端向量。
Aeq和Beq表示了线性规划中等式约束条件中的系数矩阵和右端向量。
X0是给定的变量的初始值options为控制规划过程的参数系列。
返回值中fval是优化结束后得到的目标函数值。
exitflag=0表示优化结果已经超过了函数的估计值或者已声明的最大迭代次数;exitflag>0表示优化过程中变量收敛于解X,exitflag<0表示计算不收敛。
output有3个分量,iterations表示优化过程的迭代次数,cgiterations表示PCG迭代次数,algorithm表示优化所采用的运算规则。
在使用linprog()命令时,系统默认它的参数至少为1个,但如果我们需要给定第6个参数,则第2、3、4、5个参数也必须给出,否则系统无法认定给出的是第6个参数。
遇到无法给出时,则用空矩阵“[]”替代。
例如max=193*x1+191*x2+187*x3+186*x4+180*x5+185*x6; %f 由这里给出st.x5+x6>=1;x3+x5>=1;x1+x2<=1;x2+x6<=1;x4+x6<=1;%a、b由不等关系给出,如没有不等关系,a、b取[]x1+x2+x3+x4+x5+x6=1; %aep、bep由等式约束给出代码如下f=[-193;-191;-187;-186;-180;-185;];a=[0 0 0 0 -1 -1;0 -1 0 0 -1 0;1 1 0 0 0 0;0 1 0 0 0 1;0 0 0 1 0 1]; b=[-1,-1,1,1,1]';aeq=[1 1 1 1 1 1];beq=[3];x=bintprog(f,a,b,aeq,beq)注意目标值为最大值时应乘以-1化为求最小值;不等约束为>=时应乘以-1化为<=;。
Matlab求解线性规划和整数规划问题

Matlab求解线性规划和整数规划问题Matlab是一种功能强大的数学软件,可以用于求解线性规划和整数规划问题。
在本文中,我将详细介绍如何使用Matlab来解决这些问题。
首先,让我们来了解一下线性规划和整数规划的概念。
线性规划是一种数学优化方法,用于在给定的一组线性约束条件下,寻觅使目标函数最优化的变量取值。
整数规划是线性规划的一种扩展,要求变量的取值必须为整数。
在Matlab中,我们可以使用优化工具箱来求解线性规划和整数规划问题。
优化工具箱提供了一系列函数和工具,可以匡助我们定义问题、设置约束条件和求解最优解。
首先,我们需要定义目标函数和约束条件。
目标函数是我们希翼最小化或者最大化的函数,约束条件是对变量的限制条件。
在Matlab中,我们可以使用符号变量来定义目标函数和约束条件。
例如,假设我们有一个线性规划问题,目标函数为最小化函数f(x) = 2x1 + 3x2,约束条件为2x1 + x2 >= 10,x1 + 3x2 >= 15,x1 >= 0,x2 >= 0,其中x1和x2是变量。
在Matlab中,我们可以使用sym函数来定义符号变量。
代码示例如下:```matlabsyms x1 x2f = 2*x1 + 3*x2;constraint1 = 2*x1 + x2 >= 10;constraint2 = x1 + 3*x2 >= 15;```接下来,我们需要将目标函数和约束条件转换为优化工具箱可以理解的形式。
我们可以使用matlabFunction函数将目标函数和约束条件转换为Matlab函数。
代码示例如下:```matlabf = matlabFunction(f);constraint1 = matlabFunction(constraint1);constraint2 = matlabFunction(constraint2);```现在,我们可以使用优化工具箱中的linprog函数来求解线性规划问题。
0-1规划1

0-1型整数线性规划0-1型整数线性规划是一类变量仅取0或1的特殊的整数规划;一般描述如下⎩⎨⎧===10),,1(..min 或取n i A t s f i x bx cx 其中),,(,)(,),,(),,,(111'=='==⨯m n m ij n n b b a A x x c c b x c 。
此时的决策变量称为0-1变量或二进制变量。
在实际问题中,如果引进0-1变量,就可以把各种需要分别讨论的线性(或非线性)规划问题统一在一个问题中讨论。
13.6.2 求解0-1线性规划的隐牧举法分枝定界法就是一种解整数规划的隐牧举法,0-1规划可以通过增加限定10≤≤i x 的整数规划来求解。
对于n 个变量的0-1规划,如果使用穷举法,则需要检查2n 个取值组合,这显然不是聪明的办法。
这里所说的隐牧举法,是根据0-1规划的特点,设计的一些方法,只检查变量组合的一部分,而不是全部。
值得说明的是,对于有些问题(例如一部分变量是0-1变量的混合线性规划)隐牧举法有时是不适用的,还得使用穷举法。
隐牧举法原理与算法步骤:(ⅰ)记∞=f f 0,将n 个决策变量构成的x 的2n 个取值组合按二进制(或某种顺序)排列;(ⅱ)按上述顺序对x 的取值首先检验0f f cx ≤=是否成立,若不成立则放弃该取值的x ,按次序换(ⅰ)中下一x 的取值重复上述过程;若成立,则转下一步;(ⅲ)对x 逐一检验b x A ≤中的m 个条件是否满足,一旦某一条件不满足便停止检验后面的条件,而放弃这一x 的取值,按次序换(ⅰ)中下一x 的取值执行(ⅱ),若m 个条件全满足,则转下一步;(ⅳ)记),,min(00f f f = 按次序换(ⅰ)中下一x 的取值,执行(ⅱ); (ⅴ)最后一组满足b x cx A f f ≤≤=和0的x 即为最优解。
求解0-1型整数线性规划的MATLAB 程序Ⅰ、转换十进制数为二进制数的程序如下是枚举和隐枚举程序中要调用的把十进制数转换为二进制数的程序。
第2章 0-1规划

用自编函数itgm: [r1,r2,ex1,ex2]=itgm(g,a,b,aq,bq) 定出决策变量x1,x2,x3的取值范围: x1:0~3 x2:0~2 x3:0~2
下面用枚举法求解:
k=1; for x1=0:3 for x2=0:2 for x3=0:2 q=[x1 x2 x3]';p=a*q; if p<=b z(k)=f*q; v(k,:)=q'; k=k+1; end end end end [zm,mi]=max(z); x=v(mi,:); zv=[z',v];
解得: ex =1 fv =53
x= 0 1 0 1 0 0 0 0 1
则当x1=0,x2=1,x3=0,x4=1,x5=0, x6=0,x7=0,x8=0,x9=1时,目标函数取 得最小值53。
例2-4 新产品研制,某工厂计划试制4种新产品A1、A2、 A3、A4。现有科研经费40万元,科技人员60名。各新产 品的试制费用、所需科技人员及预期的年利润如表2-1所 示。如果研制产品A2必须先研制产品A1,但产品A1的研 制与产品A2无关。另外该厂想至少研制其中的两种新产 品。问决策者应如何决定研制计划,使该厂获得利润最 大?
表2-6
货物编号i
1
2
3
单位重量(t)
3
4
5
单位价值ci
4
5
6
解:设第i种货物装载件的数量为xi(i=1,2,3),则所述 问题可表为:
max z 4x1 5x2 6x3
s.t.
3x1 4x2 5x3 10
xi
0, xi为整数(i=1,2,3)
f=[4,5,6]; a=[3,4,5]; b=10;
MATLAB枚举法求解0-1规划源程序及应用实例

M文件function [intx,intf] = ZeroOneprog(c,A,b,x0)%目标函数系数向量,c%不等式约束矩阵,A%不等式约束右端向量,b%初始整数可行解,x0%目标函数取最小值时的自变量值,intx%目标函数的最小值,intfsz = size(A);if sz(2) < 3[intx,intf] = Allprog(c,A,b); %穷举法else[intx,intf] = Implicitprog(c,A,b,x0); %隐枚举法endfunction [intx,intf] = Allprog(c,A,b);sz_A = size(A);rw = sz_A(1);col = sz_A(2);minf = inf;for i=0:(2^(col)-1) %枚举空间x1 = myDec2Bin(i,col); %十进制转化为二进制if A*x1 >= b %是否满足约束条件f_tmp = c*x1;if f_tmp < minfminf = f_tmp;intx = x1;intf = minf;elsecontinue;endelsecontinue;endendfunction [intx,intf] = Implicitprog(c,A,b,x0)%隐枚举法sz_A = size(A);rw = sz_A(1);col = sz_A(2);minf = c*x0;A = [A;-c];b = [b;-minf]; %增加了一个限制分量for i=0:(2^(col)-1)x1 = myDec2Bin(i,col);if A*x1 >= bf_tmp = c*x1;if f_tmp < minfminf = f_tmp;b(rw+1,1) = -minf; %隐枚举法与穷举法的区别在于此句 intx = x1;intf = minf;elsecontinue ;endelsecontinue ;endendfunction y = myDec2Bin(x,n) %十进制转化为二进制str = dec2bin(x,n);for j=1:ny(j) = str2num(str(j));endy = transpose(y);求解实例求解下面0-1规划()⎪⎩⎪⎨⎧=≥++++≥++++++++=105224287453232min 54321543215432154321或,x ,x ,x ,x x x x x x x x x x x x ,s.t.x x x x x x f在MATLAB 命令框在输入下列命令:>> c=[1 2 3 1 1];>> A=[2 3 5 4 7;1 1 4 2 2];>> b=[8;5];>> x0=[1;1;1;1;1]’;>> [intx,intf]=ZetoOneprog(c,A,b,x0)所得结果如下:intx =111 intf =3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
穷举法求解0-1整数规划的matlab程序
(原创)
0-1整数规划有很广泛的应用背景,比如指派问题,背包问题等等,实际上TSP 问题也是一个0-1问题,当然这些问题都是NP问题,对于规模较大的问题用穷举法是没有办法在可接受的时间内求得最优解的,本程序只不过是一个练习,得意之处是用递归法把所有解都排列出来。
另:胡运权所著的《运筹学基础及应用(第三版)》第97页的例3,我用本程序求解得到的结果是:最优解是x*=(1,0, 0, 0, 0),最优值是f(x*)=8,但书求得最优解是x*=(1,0, 1, 0, 0),最优值是f(x*)=4,是不是书中写错了,请大家验证。
以下是源程序,大家可以任意使用无版权问题,另外,如果大家有大规模的0-1规划的问题也希望提供给我,谢谢。
%%% 用隐穷举法求解0-1线性规划
%%% min c'x
%%% s.t. Ax<=b
function [y,fval]=qiongju(c,A,b)
guimo=length(c);
suoyoujie=lingyi(guimo);?? % 所有可能解的排列
[m,n]=size(A);
opt_solution=inf; % 解的上界
for i=1:2^guimo
yueshu=A*suoyoujie(i,:)';
for j=1:m
if yueshu(j)>b(j)?? % 不满足某约束条件,则不是解
break;
end
end
if j==m?? % 满足所有约束,则计算该的目标值,并与当前最优解相比较
val=c'*suoyoujie(i,:)';
if val<=opt_solution
opt_solution=val;
y=suoyoujie(i,:);
end
end
end
fval=opt_solution;
function y=lingyi(k)
if k==3
y=[0 0 0;
0 0 1;
0 1 0;
0 1 1;
1 0 0;
1 0 1;
1 1 0;
1 1 1];
else
lc=2^(k-1);
xinlie1=zeros(lc,1);
xinlie2=ones(lc,1);
xinlie=[xinlie1;xinlie2];
pre_lingyi=lingyi(k-1);
pre_lingyi=[pre_lingyi;pre_lingyi];
y=[xinlie,pre_lingyi];
end
Feedback
忘了说了,变量个数至少是3个,要不然没办法运行了。
^_^ Matlab的求解线性规划的函数linprog不适应于0-1规划。
我们采用穷举法编写了如下程序可以实现0-1规划的求解。
%0-1 program:linprog01.m
%%% min c'x
%%% s.t. Ax<=b
%%% Aeqx=beq
%%% Aieq~=bieq
function [x,fval]=linprog01(c,A,b,Aeq,beq,Aieq,bieq)
iVal=size(c,1);
xVal=zeros(size(c));
x=xVal;
opt_solution=c'*xVal;
for i=1:2^iVal-1
strBin_i=dec2bin(i);
xVal=zeros(size(c));
for k=1:length(strBin_i)
xVal(k)=str2num(strBin_i(k));
end
constrA=A*xVal<=b;
constrAeq=Aeq*xVal==beq;
constrAieq=Aieq*xVal~=bieq;
if all(constrA) & all(constrAeq) & all(constrAieq) objVal=c'*xVal;
if objVal<=opt_solution
opt_solution=objVal;
x=xVal;
end
end
end
fval=opt_solution;。