constr = optimconstr(N)
创建一个由空优化约束组成的 N
×1 数组。使用 constr
初始化用于创建约束表达式的循环。当问题比较复杂,约束较多,而写约束矩阵很麻烦的时候,使用这种方法比较方变,相当于把约束放在一个数组里,数组里的值可以自行定义,大部分情况下是用循环进行遍历。这里直接上代码。
example1问题模型可以参考基于求解器那一部分,我相信大家都能看明白
% example 1
%基于求解器
f=[1;1;1;1;1;1];%价值向量的定义
intcon1=[1,2,3,4,5,6];%整数索引规定
A=[1,0,0,0,0,1;
1,1,0,0,0,0;
0,1,1,0,0,0;
0,0,1,1,0,0;
0,0,0,1,1,0;
0,0,0,0,1,1];%这是约束矩阵,手打输入比较麻烦
A=-A;
b=[35;40;50;45;55;30];b=-b;
[x,y]=intlinprog(f,intcon1,A,b,[],[],zeros(6,1));
x,y=y
%基于问题求解
%
prob=optimproblem;%创建问题对象,默认求目标函数最小值。
x=optimvar('x',6,1,'Type','integer','LowerBound',0);%创建变量类型和变量取值范围
prob.Objective = sum(x);%创建目标函数
con = optimconstr(6);%c创建约束数组
a = [35,40,50,45,55,30];
con(1) = (x(1)+x(6)>=35);%对数组中的每一个元素进行定义,可以理解为往数组里添加逻辑值,约束的逻辑值,因为约束使用逻辑运算符组成的逻辑表达式。
for i=1:5%利用for循环构建约束条件,比基于求解器更加方便
con(i+1) = (x(i)+x(i+1)>=a(i+1));%当然也可以不用加括号,因为程序中逻辑运算符比赋值运算符优先级高,加括号便于理解
end
show(con);%输出约束数组
prob.Constraints.con=con;%将约束数组传给求解器进行求解。
[sol,fval,flag] = solve(prob),sol.x%得到结果
输出约束数组的结果如下,这比手写约束矩阵方便很多:
(1, 1)
x(1) + x(6) >= 35
(2, 1)
x(1) + x(2) >= 40
(3, 1)
x(2) + x(3) >= 50
(4, 1)
x(3) + x(4) >= 45
(5, 1)
x(4) + x(5) >= 55
(6, 1)
x(5) + x(6) >= 30
example2问题引用的是mathwork中的例子:
为库存模型创建约束。每个周期开始时的货物库存等于上一周期结束时的库存。在每个周期中,库存按 buy
增加,按 sell
减少。变量 stock
表示周期结束时的库存。
% example 2
N = 12;
stock = optimvar('stock',N,1,'Type','integer','LowerBound',0);
buy = optimvar('buy',N,1,'Type','integer','LowerBound',0);
sell = optimvar('sell',N,1,'Type','integer','LowerBound',0);
initialstock = 100;
stockbalance = optimconstr(N,1);
for t = 1:N
if t == 1
enterstock = initialstock;
else
enterstock = stock(t-1);
end
stockbalance(t) = stock(t) == enterstock + buy(t) - sell(t);
end
show(stockbalance)