加载中…
个人资料
疏影横斜
疏影横斜
  • 博客等级:
  • 博客积分:0
  • 博客访问:1,231
  • 关注人气:24
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

yalmip中有关约束条件set的设置

(2015-07-22 19:54:25)
分类: 编程之旅

网上例子: 

假设我们要用matlab解决如下线性规划问题:

max 4x1 + 2x2 + x3
s. t. 2x1 + x2 <= 1
x1 + 2x3 <= 2
x1 + x2 + x3 = 1
x1 >= 0
x1 <= 1
x2 >= 0
x2 <= 1
x3 >= 0
x3 <= 2

如果用yalmip的话,只需要如下简单几句:

  >> x = sdpvar(3, 1);
  >> f = [4 2 1] * x;
  >> F = set(2*x(1) + x(2) <= 1);
  >> F = F + set(x(1) + 2 * x(3) <= 2);
  >> F = F + set(x(1) + x(2) + x(3) == 1);
  >> F = F + set(0 <= x(1) <= 1) + set(0 <= x(2) <= 1) + set(0 <= x(3) <= 2);
  >> ops = sdpsettings('solver', 'lpsolve', 'verbose', 2);
  >> result = solvesdp(F, -f, ops);

  如果你想用 cplex 求解器求解,只需要将以上的‘solver’参数的‘lpsolve’改成‘cplex’,其他任何地方都不需要做改动。

  除此以外,yalmip还支持几乎所有其他的求解算法,在matlab下输入yalmiptest命令可以得到所有支持的算法以及它们的安装状态(其中cplex和lpsolve是我安装的,其他status为found的表示默认支持,not found表示支持但matlab中还未安装):



运行这个代码,会在set处提示错误,查阅认为,可能新版yalmip不再用set函数,所以将原代码改为

x = sdpvar(3, 1);

f = [4 2 1] * x;

F = [2*x(1) + x(2) <= 1,x(1) + 2 * x(3) <= 2];    %%%不再用set

F = [F,x(1) + x(2) + x(3) == 1];

F = [F, 0 <= x(1) <= 1, 0 <= x(2) <= 1,0 <= x(3) <= 2];

ops = sdpsettings('solver', 'cplex', 'verbose', 2);

result = solvesdp(F, -f, ops);

double(f)     %%显示结果

double(x)

运行成功,这个例子的结果是:


目标函数
  f =
    2.5000
变量
  x =
      0.5000
           0
      0.5000





具体有关约束条件F的设置,参见http://users.isy.liu.se/johanl/yalmip/pmwiki.php?n=Commands.set

Set

set is obsolete and should not be used.

Simply use additions or concatenations to define constraints.

F = [x >= 0, x <= 32];
F = [F, x^2 <= 1];
F = F + [y <= 10[x y;y 1] >= 0];
F = F + [1 <= z <= 5]
F = [F, [x z;z x+y] >= 0norm([x;y]) <= z]
C = [];
for i 1:5
 C = [C, x+y(i)+z(6-i) == i];
end
D = [F,C]
..




 

 

 

其他具体函数用法(可以忽略set):

(网址:http://www.cnblogs.com/kane1990/p/3428129.html

1. 创建决策变量:


  >> x = sdpvar(m, n [, option]):创建m*n的连续型决策变量矩阵,option是对矩阵的一些参数指定。
  相应的,如果要创建整型或二值型决策变量,matlab语句分别为:  
  >> x = intvar(m, n, [option])
  >> x = binvar(m, n, [option])

2. 添加约束:


  >> F = set(constraint [, tag]):创建一个以constraint指定的约束,可选参数tag可以给该约束指定一个字符串标记。重要的是constraint的表达也非常简单,例如如果有 x1 + x2 + x3 <= 3 的约束,直接写:
  >> x = sdpvar(3, 1);
  >> F = set(x(1) + x(2) + x(3) <= 3, 'cost bound1');
  如果要继续添加约束也非常简单,支持用+直接相连:
  >> F = F + set(constraint1 [, tag1]);
  >> F = F + set(constraint2 [, tag2]);……
  例如,如果继续限制 x 只能取[0, 1]之间的值,则:
  >> F = F + set(0 <= x <= 1, ‘upper and lower bound’);
  一句话就搞定了,是不是非常简单。!

3. 参数配置


  这个比较简单,语句如下:
  >> ops = sdpsettings(option1, value1, option2, value2, ……)
  例如语句
  >> ops = sdpsettings('solver', 'lpsolve', 'verbose', 2);
  'solver' 参数指定程序用lpsolve求解器(如果已经安装,否则会报错),如果不指定 ‘solver’ 参数,他会根据决策变量类型自动挑选已安装的、最适合的求解器;'verbose' 指定显示冗余度(冗余度越大,你就可以看到越详细的求解过程信息)。

4. 求解


  这个也只有一句话:
  >> result = solvesdp(F, f, ops) 求解一个数学规划(最小化)问题,该问题的目标函数由 f 指定,约束由 F 指定,ops指定求解参数,最后的结果存储在result结构体中。



 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有