matlab 基于问题求解器optimproblem中的optimconstr

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)

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值