基于MATLAB的非线性0-1规划的求解

合集下载

MATLAB优化应用非线性规划

MATLAB优化应用非线性规划

MATLAB优化应用非线性规划非线性规划是一类数学优化问题,其中目标函数和约束条件都是非线性的。

MATLAB作为一种强大的数值计算软件,提供了丰富的工具和函数,可以用于解决非线性规划问题。

本文将介绍如何使用MATLAB进行非线性规划的优化应用,并提供一个具体的案例来演示。

一、MATLAB中的非线性规划函数MATLAB提供了几个用于解决非线性规划问题的函数,其中最常用的是fmincon函数。

fmincon函数可以用于求解具有等式约束和不等式约束的非线性规划问题。

其基本语法如下:x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)其中,fun是目标函数,x0是变量的初始值,A和b是不等式约束的系数矩阵和右端向量,Aeq和beq是等式约束的系数矩阵和右端向量,lb和ub是变量的上下界,nonlcon是非线性约束函数,options是优化选项。

二、非线性规划的优化应用案例假设我们有一个工厂,需要生产两种产品A和B,目标是最大化利润。

产品A 和B的生产成本分别为c1和c2,售价分别为p1和p2。

同时,我们需要考虑两种资源的限制,分别是资源1和资源2。

资源1在生产产品A和B时的消耗分别为a11和a12,资源2的消耗分别为a21和a22。

此外,产品A和B的生产量有上下限限制。

我们可以建立以下数学模型来描述这个问题:目标函数:maximize profit = p1 * x1 + p2 * x2约束条件:c1 * x1 + c2 * x2 <= budgeta11 * x1 + a12 * x2 <= resource1a21 * x1 + a22 * x2 <= resource2x1 >= min_production_Ax2 >= min_production_Bx1 <= max_production_Ax2 <= max_production_B其中,x1和x2分别表示产品A和B的生产量,budget是预算,min_production_A和min_production_B是产品A和B的最小生产量,max_production_A和max_production_B是产品A和B的最大生产量。

matlab求解非线性优化问题

matlab求解非线性优化问题

[x,fval]
=fmincon(fun,x0,A,b,Ae,be,lb,ub,nonlcon)
输入参数: fun 表示优化目标函数,x0 表示优化的初始值
A,b 表示满足线性关系式 Ax b 的系数矩阵和右端项 Ae,be 表示线性等式约束 Ae x be 的系数矩阵和右端项 lb,ub 表示取值范围 lb x ub 的上限和下限 nonlcon 表示需要参数满足的非线性关系式 c( x) 0 和 ce( x) 0
X = 0.5000 0.5000 fval =0.5000
非线性无约束优化问题
fminunc
使用格式与fminsearch类似: [x,fval]= fminunc(@f,x0)
其中f为待求最值的向量函数,x0为搜索过程开始时自 变量的初始值。
例:fminunc(@f,[1,2])含义为:从点[1,2]开始搜寻函 数f的最小值。
10
非线性优化问题的求法
多元函数极值的求法 多元函数的无约束最小值问题,在Matlab中有2
个经常使用的函数: 1、fminsearch 2、fminunc
注意:
(1)在使用这两个函数时,必须首先用M文件 的形式存储待求最值的函数,该函数需以向量函数 的形式表达;
( 2)最大值问题需转化为最小值问题。
非线性无约束优化问题
x1 2x2 2
x1 0, x2 0
① 写成标准形式:
min
z
1 2
( x1,
x2
)
2 2
2 4
x1 x2
2 6
T
x1 x2
1
s.t
1
1 x2
6
二次规划问题
② 输入命令:

遗传算法解决非线性规划问题的Matlab程序

遗传算法解决非线性规划问题的Matlab程序

遗传算法解决非线性规划问题的Matlab程序首先,让我们来了解一下什么是非线性规划问题。

非线性规划问题是指目标函数或约束条件中至少有一个是非线性函数的规划问题。

与线性规划问题不同,非线性规划问题的求解往往没有通用的解析方法,需要借助数值优化算法来找到最优解或近似最优解。

遗传算法是一种基于自然选择和遗传机制的随机搜索算法。

它模拟了生物进化的过程,通过对种群中个体的选择、交叉和变异操作,逐步优化个体,从而找到问题的最优解。

在解决非线性规划问题时,遗传算法将问题的解编码为染色体,通过适应度函数来评估染色体的优劣,然后通过遗传操作不断进化种群,直到找到满意的解。

接下来,我们开始介绍如何在 Matlab 中实现遗传算法来解决非线性规划问题。

首先,我们需要定义问题的目标函数和约束条件。

假设我们要解决的非线性规划问题是:\\begin{align}&\min f(x) = x_1^2 + x_2^2 2x_1x_2 + 2x_1 4x_2 + 5\\&\text{st } x_1 + x_2 \leq 5\\&-2 \leq x_1 \leq 2\\&-3 \leq x_2 \leq 3\end{align}\在 Matlab 中,我们可以定义目标函数如下:```matlabfunction f = objective(x)f = x(1)^2 + x(2)^2 2x(1)x(2) + 2x(1) 4x(2) + 5; end```约束条件可以通过定义一个函数来判断:```matlabfunction c, ceq = constraints(x)c =;ceq =;if x(1) + x(2) > 5c = x(1) + x(2) 5;endend```然后,我们需要设置遗传算法的参数。

这些参数包括种群大小、最大迭代次数、交叉概率、变异概率等。

```matlabpopSize = 50; %种群大小maxGen = 100; %最大迭代次数pc = 08; %交叉概率pm = 01; %变异概率```接下来,我们需要对个体进行编码。

Matlab非线性规划

Matlab非线性规划

Matlab⾮线性规划⾮线性规划在matlab⾮线性规划数学模型可以写成⼀下形式:minf(x)\\ s.t.\begin{cases} Ax \le B \\ Aeq·x = Beq\\ C(x) \le 0\\ Ceq(x) = 0 \end{cases}f(x)为⽬标函数,A,B,Aeq,Beq为线性约束对应的矩阵和向量,C(x),Ceq(x)为⾮线性约束。

Matlab求解命令为:X = fmincon(fun, x0, A, B, Aeq, Beq, LB, UB, NONLCON, OPTIONS) fun为⽬标函数,x0为初值,A,B,Aeq,Beq为线性约束对应的矩阵和向量,LB,UB分别为x的下限和上限,NONLCON为⾮线性约束(需要写⾃定义函数),OPTIONS为优化参数。

【例】求下列⾮线性规划问题minf(x) = x^2_1+x^2_2+8\\ s.t.\begin{cases} x_1^2-x_2 \ge 0\\ -x_1-x_2^2+2=0\\ x_1,x_2 \ge 0 \end{cases}编写函数⽂件:fun1.m,fun2.mfunction f = fun1(x)f = x(1)^2 + x(2)^2 + 8;endfunction [g,h] = fun2(x)g = -x(1)^2 + x(2);%g代表不等式约束,即代表约束条件-x(1)^2 + x(2) <= 0。

matlab默认g<=0,所以题⽬中的条件被改成了相反数。

%如果有多个不等式约束,写成g(1) = 关于x的函数; g(2) = 关于x的函数;······h = -x(1) - x(2)^2 + 2;%h代表等式约束,即代表约束条件 -x(1) - x(2)^2 + 2 = 0。

%如果有多个等式约束,写成h(1) = 关于x的函数; h(2) = 关于x的函数;······end注:在写fun2时,可以把线性和⾮线性约束的等式和不等式约束都按照这种格式写到这个函数⾥⾯,这样的话fun2就包含了所有约束条件,在后⾯运⾏fmincon()时不需要再写A,B,Aeq,Beq,直接⽤[]略过。

遗传算法解决非线性规划问题的Matlab程序

遗传算法解决非线性规划问题的Matlab程序

非线性整数规划的遗传算法Matlab程序(附图)通常,非线性整数规划是一个具有指数复杂度的NP问题,如果约束较为复杂,Matlab 优化工具箱和一些优化软件比如lingo等,常常无法应用,即使能应用也不能给出一个较为令人满意的解。

这时就需要针对问题设计专门的优化算法。

下面举一个遗传算法应用于非线性整数规划的编程实例,供大家参考!模型的形式和适应度函数定义如下:这是一个具有200个01决策变量的多目标非线性整数规划,编写优化的目标函数如下,其中将多目标转化为单目标采用简单的加权处理。

function Fitness=FITNESS(x,FARM,e,q,w)%% 适应度函数% 输入参数列表% x 决策变量构成的4×50的0-1矩阵% FARM 细胞结构存储的当前种群,它包含了个体x% e 4×50的系数矩阵% q 4×50的系数矩阵% w 1×50的系数矩阵%%gamma=0.98;N=length(FARM);%种群规模F1=zeros(1,N);F2=zeros(1,N);for i=1:Nxx=FARM{i};ppp=(1-xx)+(1-q).*xx;F1(i)=sum(w.*prod(ppp));F2(i)=sum(sum(e.*xx));endppp=(1-x)+(1-q).*x;f1=sum(w.*prod(ppp));f2=sum(sum(e.*x));Fitness=gamma*sum(min([sign(f1-F1);zeros(1,N)]))+(1-gamma)*sum(mi n([sign(f2-F2);zeros(1,N)]));针对问题设计的遗传算法如下,其中对模型约束的处理是重点考虑的地方function [Xp,LC1,LC2,LC3,LC4]=MYGA(M,N,Pm)%% 求解01整数规划的遗传算法%% 输入参数列表% M 遗传进化迭代次数% N 种群规模% Pm 变异概率%% 输出参数列表% Xp 最优个体% LC1 子目标1的收敛曲线% LC2 子目标2的收敛曲线% LC3 平均适应度函数的收敛曲线% LC4 最优适应度函数的收敛曲线%% 参考调用格式[Xp,LC1,LC2,LC3,LC4]=MYGA(50,40,0.3)%% 第一步:载入数据和变量初始化load eqw;%载入三个系数矩阵e,q,w%输出变量初始化Xp=zeros(4,50);LC1=zeros(1,M);LC2=zeros(1,M);LC3=zeros(1,M);LC4=zeros(1,M);Best=inf;%% 第二步:随机产生初始种群farm=cell(1,N);%用于存储种群的细胞结构k=0;while k %以下是一个合法个体的产生过程x=zeros(4,50);%x每一列的1的个数随机决定for i=1:50R=rand;Col=zeros(4,1);if R<0.7RP=randperm(4);%1的位置也是随机的Col(RP(1))=1;elseif R>0.9RP=randperm(4);Col(RP(1:2))=1;elseRP=randperm(4);Col(RP(1:3))=1;endx(:,i)=Col;end%下面是检查行和是否满足约束的过程,对于不满足约束的予以抛弃 Temp1=sum(x,2);Temp2=find(Temp1>20);if length(Temp2)==0k=k+1;farm{k}=x;endend%% 以下是进化迭代过程counter=0;%设置迭代计数器while counter%% 第三步:交叉%交叉采用双亲双子单点交叉newfarm=cell(1,2*N);%用于存储子代的细胞结构Ser=randperm(N);%两两随机配对的配对表A=farm{Ser(1)};%取出父代AB=farm{Ser(2)};%取出父代BP0=unidrnd(49);%随机选择交叉点a=[A(:,1:P0),B(:,(P0+1):end)];%产生子代ab=[B(:,1:P0),A(:,(P0+1):end)];%产生子代bnewfarm{2*N-1}=a;%加入子代种群newfarm{2*N}=b;%以下循环是重复上述过程for i=1:(N-1)A=farm{Ser(i)};B=farm{Ser(i+1)};P0=unidrnd(49);a=[A(:,1:P0),B(:,(P0+1):end)];b=[B(:,1:P0),A(:,(P0+1):end)];newfarm{2*i-1}=a;newfarm{2*i}=b;endFARM=[farm,newfarm];%新旧种群合并%% 第四步:选择复制FLAG=ones(1,3*N);%标志向量,对是否满足约束进行标记%以下过程是检测新个体是否满足约束for i=1:(3*N)x=FARM{i};sum1=sum(x,1);sum2=sum(x,2);flag1=find(sum1==0);flag2=find(sum1==4);flag3=find(sum2>20);if length(flag1)+length(flag2)+length(flag3)>0FLAG(i)=0;%如果不满足约束,用0加以标记endendNN=length(find(FLAG)==1);%满足约束的个体数目,它一定大于等于N NEWFARM=cell(1,NN);%以下过程是剔除不满主约束的个体kk=0;for i=1:(3*N)if FLAG(i)==1kk=kk+1;NEWFARM{kk}=FARM{i};endend%以下过程是计算并存储当前种群每个个体的适应值SYZ=zeros(1,NN);syz=zeros(1,N);for i=1:NNx=NEWFARM{i};SYZ(i)=FITNESS2(x,NEWFARM,e,q,w);%调用适应值子函数endk=0;%下面是选择复制,选择较优的N个个体复制到下一代while k minSYZ=min(SYZ);posSYZ=find(SYZ==minSYZ);POS=posSYZ(1);k=k+1;farm{k}=NEWFARM{POS};syz(k)=SYZ(POS);SYZ(POS)=inf;end%记录和更新,更新最优个体,记录收敛曲线的数据minsyz=min(syz);meansyz=mean(syz);pos=find(syz==minsyz);LC3(counter+1)=meansyz;if minsyz Best=minsyz;Xp=farm{pos(1)};endLC4(counter+1)=Best;ppp=(1-Xp)+(1-q).*Xp;LC1(counter+1)=sum(w.*prod(ppp));LC2(counter+1)=sum(sum(e.*Xp));%% 第五步:变异for i=1:Nif Pm>rand%是否变异由变异概率Pm控制AA=farm{i};%取出一个个体POS=unidrnd(50);%随机选择变异位R=rand;Col=zeros(4,1);if R<0.7RP=randperm(4);Col(RP(1))=1;elseif R>0.9RP=randperm(4);Col(RP(1:2))=1;elseRP=randperm(4);Col(RP(1:3))=1;end%下面是判断变异产生的新个体是否满足约束,如果不满足,此次变异无效 AA(:,POS)=Col;Temp1=sum(AA,2);Temp2=find(Temp1>20);if length(Temp2)==0farm{i}=AA;endendendcounter=counter+1end%第七步:绘收敛曲线图figure(1);plot(LC1);xlabel('迭代次数');ylabel('子目标1的值');title('子目标1的收敛曲线'); figure(2);plot(LC2);xlabel('迭代次数');ylabel('子目标2的值');title('子目标2的收敛曲线'); figure(3);plot(LC3);xlabel('迭代次数');ylabel('适应度函数的平均值');title('平均适应度函数的收敛曲线'); figure(4);plot(LC4);xlabel('迭代次数');ylabel('适应度函数的最优值');title('最优适应度函数的收敛曲线');贴出一幅运行得到的收敛曲线。

matlab中的非线性规划求解fmincon函数

matlab中的非线性规划求解fmincon函数

这个函数的基本形式为x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)其中fun为你要求最小值的函数,可以单写一个文件设置函数,如以上给的例子中。

1.如果fun中有N个变量,如x y z, 或者是X1, X2,X3, 什么的,自己排个顺序,在fun 中统一都是用x(1),x(2)....x(n) 表示的。

2. x0, 表示初始的猜测值,大小要与变量数目相同3. A b 为线性不等约束,A*x <= b, A应为n*n阶矩阵,学过线性代数应不难写出A和b4 Aeq beq为线性相等约束,Aeq*x = beq。

Aeq beq同上可求5 lb ub为变量的上下边界,正负无穷用 -Inf和Inf表示, lb ub应为N阶数组6 nonlcon 为非线性约束,可分为两部分,非线性不等约束 c,非线性相等约束,ceq可按下面的例子设置function [c,ce] = nonlcon1(x)c = -x(1)+x(2)^2-4;ce = []; % no nonlinear equality constraints7,最后是options,可以用OPTIMSET函数设置,见上例具体可见OPTIMSET函数的帮助文件。

对于优化控制,MATLAB提供了18个参数,这些参数的具体意义为:options(1)-参数显示控制(默认值为0)。

等于1时显示一些结果。

&nbsp;&nbsp;&nbsp;&nbsp;options(2)-优化点x的精度控制(默认值为1e-4)。

options = optimset('TolX',1e-8)&nbsp;&nbsp;&nbsp;&nbsp;options(3)-优化函数F的精度控制(默认值为1e-4)。

options = optimset('TolFun',1e-10)&nbsp;&nbsp;&nbsp;&nbsp;options(4)-违反约束的结束标准(默认值为1e-6)。

MATLAB非线性规划问题

MATLAB非线性规划问题

一.非线性规划课题实例1 表面积为36平方米的最大长方体体积。

建立数学模型:设x、y、z分别为长方体的三个棱长,f为长方体体积。

max f = x y (36-2 x y)/2 (x+y)实例2 投资决策问题某公司准备用5000万元用于A、B两个项目的投资,设x1、x2分别表示配给项目A、B的投资。

预计项目A、B的年收益分别为20%和16%。

同时,投资后总的风险损失将随着总投资和单位投资的增加而增加,已知总的风险损失为2x12+x22+(x1+x2)2.问应如何分配资金,才能使期望的收益最大,同时使风险损失为最小。

建立数学模型:max f=20x1+16x2-λ[2x12+x22+(x1+x2)2]s.t x1+x2≤5000x 1≥0,x2≥0目标函数中的λ≥0是权重系数。

由以上实例去掉实际背景,其目标函数与约束条件至少有一处是非线性的,称其为非线性问题。

非线性规划问题可分为无约束问题和有约束问题。

实例1为无约束问题,实例2为有约束问题。

二.无约束非线性规划问题:求解无约束最优化问题的方法主要有两类:直接搜索法(Search method)和梯度法(Gradient method),单变量用fminbnd,fminsearch,fminunc;多变量用fminsearch,fminnuc 1.fminunc函数调用格式:x=fminunc(fun,x0)x=fminunc(fun,x0,options)x=fminunc(fun,x0,options,P1,P2)[x,fval]=fminunc(…)[x,fval, exitflag]=fminunc(…)[x,fval, exitflag,output]=fminunc(…)[x,fval, exitflag,output,grad]=fminunc(…)[x,fval, exitflag,output,grad,hessian]=fminunc(…)说明:fun为需最小化的目标函数,x0为给定的搜索的初始点。

非线性规划及matlab应用

非线性规划及matlab应用

非线性规划及matlab 应用目录1.概念 ............................................................................................................................................... 1 2.二次规划........................................................................................................................................ 1 3.一般非线性规划 ............................................................................................................................ 2 4. 案例:供应与选址 . (4)1.概念定义:如果目标函数或约束条件中至少有一个是非线性函数时的最优化问题就叫做非线性规划问题.其它情况: 求目标函数的最大值或约束条件为小于等于零的情况,都可通过取其相反数化为上述一般形式.2.二次规划用MATLAB 软件求解,其输入格式如下: 1. x=quadprog(H,C,A,b); 2. x=quadprog(H,C,A,b,Aeq,beq); 3. x=quadprog(H,C,A,b,Aeq,beq,VLB,VUB); 4. x=quadprog(H,C,A,b, Aeq,beq ,VLB,VUB,X0); 5. x=quadprog(H,C,A,b, Aeq,beq ,VLB,VUB,X0,options); 6. [x,fval]=quadprog(...); 7. [x,fval,exitflag]=quaprog(...); 实例1:2212121122121212min (,)2622..2220,0=--+-++≤-+≤≥≥f x x x x x x x x s tx x x x x x写成标准形式标准型为: Min Z= 21X T HX+c T Xs.t. AX<=b beq X Aeq =⋅ VLB ≤X ≤VUB111222 1 -12min (,) 1 26Tx x z x x x x ⎛⎫⎛⎫⎛⎫⎛⎫-=+ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪--⎝⎭⎝⎭⎝⎭⎝⎭1212 1 121 2200x x x x ⎛⎫⎛⎫⎛⎫≤ ⎪ ⎪ ⎪ ⎪-⎝⎭⎝⎭⎝⎭⎛⎫⎛⎫≤ ⎪ ⎪ ⎪⎝⎭⎝⎭Matlab 命令H=[1 -1; -1 2]; c=[-2 ;-6]; A=[1 1; -1 2]; b=[2;2]; Aeq=[]; beq=[]; VLB=[0;0]; VUB=[];[x,z]=quadprog(H,c,A,b,Aeq,beq,VLB,VUB)运算结果为:x =0.6667 1.3333 z = -8.22223.一般非线性规划标准型为:min ()..()0()0≤≤=≤≤F X s t AX bG X Ceq X VLB X VUB其中X 为n 维变元向量,G(X)与Ceq(X)均为非线性函数组成的向量,其它变量的含义与线性规划、二次规划中相同.非线性规划求解的函数是fmincon,命令的基本格式如下: ● x=fmincon(‘fun’,X0,A,b)● x=fmincon(‘fun’,X0,A,b,Aeq,beq)● x=fmincon(‘fun’,X0,A,b, Aeq,beq,VLB,VUB)● x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’)● x=fmincon(‘fun’,X0,A,b,Aeq,beq,VLB,VUB,’nonlcon’,options) ● [x,fval]= fmincon(...)● [x,fval,exitflag]= fmincon(...)● [x,fval,exitflag,output]= fmincon(...) 1.fun 为目标函数2.x0为初始值3.A 是不等式约束AX<=b 的系数矩阵4.b 是不等式约束AX<=b 的常数项4.Aeq 是等式约束AeqX=beq 的系数矩阵,5.beq 是等式约束AeqX=beq 的常数项,6.lb 是X 的下限,7.ub 是X 的上限,8.nonlcon 为非线性不等式约束 9.option 为设置fmincon 的参数 注意:fmincon 函数提供了大型优化算法和中型优化算法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

4 1 基于MATLAB的非线性0-1规划的求解 学 生:易棉生 指导教师:宋来忠 三峡大学理学院

摘要:本文主要研究非线性0-1整数规划的解法。首先,通过对传统求解方法的研究,提出从0-1整数规划的变量只取值0和1这个特点来求解,为利用好这个特点,构造了一种数据结构——组合树,还根据目标函数和约束条件所含的变量是否被包含在解中取值为1的变量集中,将0-1整数规划的解细分为目标特殊解和约束特殊解。然后,把这个特点具体化为4条性质。根据这些性质,设计出合理的算法,并用MATLAB实现该算法。实验表明,该算法是有效的。

Abstract: In this paper, the problem about solving nonlinear 0-1 integer programming is studied. Firstly the view that we can use the feature that the variables of 0-1 integer programming only have two values 0 and 1 is raised after discussing some traditional algorithms. To express the feature, a new tree structure, called combination tree in the paper is given and also object-satisfied solution and constrain-satisfied solution is defined, based on whether the variables with the value 1 in objective function and constrained condition belong to the variables with the value 1 in solution. Then it can be specified by 4 properties. According to these properties, a new algorithm is designed and implemented with MATLAB language. From the experiment, it is proved that the algorithm is effective.

关键词:0-1规划 非线性 组合树 解的标记 MATLAB key words: 0-1 integer programming; nonlinear; combination tree; the mark of solution; MATLAB 前言 本文研究的模型可是:

111

min()..()0()0{0,1}fxAxbAxbstCxCxx,,,,

(1) 其中,()fx都是非线性函数,A、b、1A、1b是矩阵,1()()CxCx、非线性矩阵函数。可以看到,本模型实际上代表了一般的0-1整数规划问题。显然,如果一个算法能求解非线性0-1整数规划,也必然能求解一般的0-1整数规划。要完满地解决这个问题,一个算法应具备两个基本条件:1.求解速度较快,即能在较短的时间内计算出答案;2.能够判断出所求解的0-1整数规划的解的情况,即计算出的答案要么是无解要么是全局最优解。 但是,目前对这类问题的许多研究都只局限于线性0-1整数规划,利用线性性质来设计一些算法,如隐枚举法和匈牙利法等(详见参考文献5 ~16);有些算法虽然可以求解任何0-1整数规划,但是不能肯定所求的解是全局最优解,如遗传算法和模拟退火算法等。求解非线性0-1整数规划的算法,肯定不能再依赖于具体函数的性质了,因为非线性函数的性质是无法预料的。从理论上将,穷举法不依赖于目标函数和约束条件的性质,能够获得全局最优解,但实际上却不可行。这就给我们指明了一个方向,求解非线性0-1整数规划的算法可以基于穷举法,但需要对其做大量的优化。

1 解的定义 4 2 由于每个变量的取值为0或1,因此可把解向量中取值为1的变量取出来组合成一列,记作121112(.)(1)niiinxxxiiin,这个组合能够标记一个解,称为解的标记(或者标记),简

写为112(.,,,)niii,解向量称为解的标记的对应解,特别地当所有变量取值为0时把这个解的标记记作(.)。解的标记中所含有元素的个数称为解的标记的长度。显然解的标记可以确定一个解,并且的对应解与解的标记中元素的排列顺序无关。长度为k的解的标记所能确定解的个数为knc个。而解的标记的长度可以为0,1,2,,n,则所有组合可确定的解个数为012nnnnnccc。另一方面,解空间中不同解的总数为2n,因此,解的标记与解是一一对应的。当穷尽搜索所有解的标记时也就穷尽搜索完了整个解空间。 实际上,解的标记就是1到n的所有组合。通过上述定义我们可以看到0-1整数规划的解空间与组合的空间是对应的,可以通过下面的树形数据结构来形象地列举所有的组合:

.2.12.5.4.3.1.

.45.35.34.25.24.23.15.14.13.123.124.125.134.135.145.234.235.245.1234.1245.1345.2345.1235.345

.12345 图1 5元组合树

这棵树列举出了1到5的所有组合,也即列举了含有5个变量的0-1整数规划所有解的标记,其特点是:孩子节点都含有父亲节点的元素并且比父亲节点多一个元素,节点有孩子节点则必有右兄弟节点;同层节点所含有的元素个数相同,并且从左到右升序排列,每个节点内部的元素也都升序排列,从而使得每个节点都不同;第k层将所有长为k的解的标记全部列举出来,故第k层的节点数为5kc个。由于这种树形结构列举出了所有的组合,不妨称这样的树为组合树。一般地,称n个变量对应的组合树称为n元组合树。 为便于把0-1整数规划的特点与组合树的特点结合起来,先作如下定义: 在0-1整数规划中,如果一个解中取值为1的变量包含目标函数所含的变量,则称这个解为目标特殊解;如果一个解中取值为1的变量包含某一约束条件所含的变量,则称这个解为该约束条件的约束特殊解,该约束条件位对应解的特殊约束条件。既不是目标特殊解,又不是约束特殊解的解称为一般解。

2 基本性质 结合组合树,很容易发现0-1整数规划有下列性质:由组合树的特点,很容易发现0-1整数规划有下列性质: 性质1 在组合树中,如果节点的对应解是目标特殊解,则以该节点为根的子树中的每一个节点的对应解都是目标特殊解; 性质2 在组合树中,如果节点的对应解是目标特殊解,则以该节点为根的子树中的每一个节点的对应解的目标函数值都相等。 性质3 在组合树中,如果节点的对应解是约束条件的约束特殊解,则以该节点为根的子树中的每一个节点的对应解都是该约束条件约束的约束特殊解; 性质4 在组合树中,如果节点的对应解是约束条件的约束特殊解,若解不满足该约束条件,则以该节点为根的子树都不满足该约束条件;反之亦然。 因为这些性质是以1为标志出现的,不妨称上述性质为0-1整数规划1的继承性。 4 3 3 性质的证明 下面对上述性质一一证明。对于根节点,性质1,2,3,4显然是成立的。对于非根节点,设组合树中节点121112(.)(1)niiinxxxiiin,记为A。

若A的对应解是目标特殊解,则A的对应解中取值为1的变量包含目标函数所含有的全部变量,由于在以A为根的子树节点都含有A的元素,则其对应解中取值为1的变量都含有 A的对应解中取值为1的变量,从而也包含目标函数所含有的变量。因此以A为根的子树节点的对应解都是目标特殊解,性质1成立。因为目标特殊解中取值为1的变量都包含目标函数所含有的变量,这就是说目标函数中的变量都取值1,故目标特殊解的函数值相等;再由性质1知,A的对应解是目标特殊解,则以A节点为根的子树的每一个节点的对应解都是目标特殊解,从而其目标函数值必都相等,即性质2成立。类似可以证明性质3,4。 通过把组合树的特点与0-1整数规划相结合,以上4条性质很好地体现了0-1整数规划中变量只取值0和1的特点,更为重要的是这些性质不受目标函数和约束条件的非线性限制。

4 算法 对组合树进行遍历,就是穷举法。为利用上述性质,应对组合树进行深度优先遍历。在遍历过程中,如果出现了目标函数值比当前最优值还劣,直接舍去该解,即定界;在出现目标特殊解或者有解不满足特殊约束条件时,停止对解对应节点的子树进行遍历,即剪枝。具体算法如下(初始节点为根节点): 1. 计算节点的对应解的函数值,判断该解是否为目标特殊解。在函数值比当前最优解优时,若该解是目标特殊解,标记此解。在函数值比当前最优解劣时,若该解是目标特殊解转4(剪枝);若该解不是目标特殊解,转3。 2. 依次检验每个约束条件,如下: a. 若该约束条件被标记,检验下一个约束条件; b. 解满足约束条件时,若约束条件是该解的特殊约束条件,对其作标记,检验下一个约束条件; c. 解不满足此条件时,若约束条件是该解的特殊约束条件,转4(剪枝)否则,转3; d. 若解均满足约束条件,即此解为可行解也为当前最优解,替换当前解。若解被标记,转4(剪枝),否则,转3。 3. 若该节点有孩子节点,对其最左孩子节点的对应解作上述计算,转1;否则,转4。 4. 取消对当前节点的对应解的特殊约束条件的标记。若当前节点有右兄弟,对其右兄弟节点的对应解进行上述计算,转1;若当前节点没有右兄弟,则取消对其父亲节点的对应解的特殊约束条件的标记,并对其父亲节点的右兄弟节点的对应解进行上述计算,转1(回溯);若其父亲节点没有右兄弟节点,算法结束。 由于篇幅有限,算法流程图和程序略。

5 算法评价及改进 设0-1整数规划含有n个变量,在目标函数中含有1n个变量,第i个约束条件含有im个变量(1im,m为约束条件的个数)。则在整个解空间中,目标特殊解有12nn个,第i个约束条件的约束特殊解有2nmi个。这说明,在最好的情况下,即约束特殊解都不满足对应的特殊约束条件,

要检验的解个数为:11222mnninnmi。由此可以看到1n、im越小,我们要检验的解个数就越少,从而算法的执行效率就越高。因此,在用此算法计算前如果能对目标函数和约束条件进行简单变形,减少各自所含的变量数将有助与提高算法效率。另外,对约束条件进行'1xx的变换使

相关文档
最新文档