应该是一个混合整数规划问题。目前matlab还没有相关的函数求解此问题。
本人开发了一个“混合(非)线性规划软件包”,其说明如下:(恕Word中有些显示不出)
本软件包的主程序有两个,一个是处理混合的线性规划,一个是处理非线性的。
1. 混合的线性规划(MixIntDiscLineProg.m)
2.混合的非线性规划问题(MixIntDiscNLProg)
其中 为自变量, 为向量 的上下界, 分别为线性约束条件中等式约束条件的系数矩阵和常数项, 分别为线性约束条件中不等式约束条件的系数矩阵和常数项, 和 分别为非线性约束条件中等式约束条件和不等式约束条件。 为离散非整数变量,取值范围为 , 为整数变量,其余为连续变量。
我们可以用一个xstatus 的数组 来设定离散或者整数变量的状态,其中xstatus(1,:) 是自变量中离散或整数变量的下标;xstatus(2,:) 中的每个元素取值为1或2,若为1则表示 中对应列的自变量为整数型变量,若为2则表示 中对应列的变量为离散变量; 是 中对应列的离散变量的取值范围的序号,若变量为整数则为零。于是 就可以表示为:
兹举4个例子以示说明,其余参见后面的说明。
例1 . 所有变量都是整数.
两个程序中分别修改
isAllInteger=1;
其余离散变量取值范围及 不必设置。
例2 . x2,x4,x7是整数,其余都是连续变量。
两个程序中分别修改
isAllInteger=0;
修改如下:
主程序中凡调用“checkIntDisc“的格式都变为“checkIntDisc(...,xstatus)”
例3 . x2,x4,是整数,x3、x7、x9取自D1集合中,其余都是连续变量。
两个程序中分别修改
isAllInteger=0;
修改如下:
主程序中凡调用“checkIntDisc“的格式都变为“checkIntDisc(...,xstatus,D1)”
例4 . x2,x4,是整数,x3和x9取自D1集合中,x7取值D2,其余都是连续变量。
两个程序中分别修改
isAllInteger=0;
修改如下:
主程序中凡调用“checkIntDisc“的格式都变为“checkIntDisc(...,xstatus,D1,D2)”
使用两个程序的具体步骤:
在Matlab环境下,使用“File/set path…”添加路径“\...”
根据你的实际问题,修改一系列的参数和文件如下6步
1) the parameters are given by the requirement of the function fmincom.m
A,B,Aeq,Beq,LB,UB,X0
2) 'obj_fun.m' 是目标函数源文件
3) 'nl_con_fun.m' 是非线性约束条件源文件(不含整数或离散要求)
4) 设置是否所有分量都是整数要求
isAllInteger=1; 所有分量都是整数
isAllInteger=0 并不是所有分量都是整数
5) 修改离散变量的取值范围参数D1—Dm
D1=[2.5,3,4,6,8,10,12,16]; % discrete requirement of x(1),x(2),x(3)
D2=[2.5,3,4,6,8,10,12.2,16.6]; % discrete requirement
若需要,修改“checkIntDisc(...,xstatus,D1)” to “checkIntDisc(...,xstatus,D1,..,Dm)“
6) 修改 的数组
欲知详情:可发:spjin@whut.edu.cn