主要内容

查看或修改优化问题

审查问题使用显示要么

创建优化问题后,您可以通过使用审核其配方显示。对于大问题,使用反而。例如,

概率= optimproblem;x = Optimvar('x',2,'低行',0);prob.objective = x(1) -  2 * x(2);prob.constraints.cons1 = x(1)+ 2 * x(2)<= 4;prob.constraints.cons2 = -x(1)+ x(2)<= 1;展示(prob)
优化问题:求解:x最小化:x(1) -  2 * x(2)对CONS1:x(1)+ 2 * x(2)<= 4受到CONS2的影响:-X(1)+ x(2)<= 1可变界限:0 <= x(1)0 <= x(2)

此评论显示问题的基本元素,例如问题是最小化或最大化,以及可变界限。审查显示了变量中使用的索引名称(如果有)。审核不显示变量是否为valize。

更改默认求解器或选项

要尝试提高解决方案或速度,检查和更改默认求解器或选项。

要查看默认求解器和选项,请使用Optimoptions(prob)。例如,

rng默认x = Optimvar('x',3,'低行',0);expr = sum((rand(3,1)。* x)。^ 2);prob = OptimProblem('目标',expr);prob.constraints.lincon = sum(sum(randn(size(x))。* x))<= RANDN;选项= Optimoptions(prob)
选项= LSQLIN选项:当前算法('内部点')使用的选项:(其他可用算法:'信任区域反光')设置属性:无选项集。默认属性:算法:'内部点'约束特许:1.0000E-08显示:'最终'linearsolver:'auto'最大值:200个最优法:1.0000E-08步进:1.0000E-12显示当前算法未使用的选项('内部点')

此问题的默认解算器是Lsqlin.,您可以看到默认选项。

要更改求解器,请设置'求解'名称值对解决。要查看不同的求解器的适用选项,请使用优化选择将当前选项传递给不同的求解器。例如,继续问题,

选项= Optimoptions('Quadprog',选项)
选项= quadprog选项:当前算法使用的选项('Interion-point-convex'):(其他可用算法:'信任区域 - 反射')设置属性:约束特许:1.0000E-08最大值:200最优法:1.0000E-08 STEMTOLERANCE:1.0000E-12默认属性:算法:'内部点凸'显示:'最终'linearsolver:'auto'显示当前算法不使用的选项('internal-point-convex')

要更改选项,请使用优化选择或点符号设置选项,并将选项传递给解决在里面'选项'名称值对。看常用选项:调整和故障排除。继续这个例子,

options.display ='iter';sol =解决(prob,'选项',选项,'solver','quadprog');
ITER FVAL PRIMAL INFEAS双INFEAS互补0 1.500359E + 00 3.068423E-01 2.275437E-01 2.500000E-01 1 1.728717E-01 0.000000E + 00 7.719860E-03 3.637874C-02 2 2.6041080-02 0.00000000E + 000.000000E + 00 5.245260E-03 3 7.822161E-03 0.000000E + 00 2.775558E-17 1.407918C-03 4 2.909218E-03 0.000000E + 00 6.938894C-18 2.07078999S-18 2.07078999S-18 2.0707894E-18 2.07078999S-18 2.070784E-04 5 1.931264E-03 1.931264E-03 0.000000E +00 1.734723E-18 2.907724E-05 6 1.797508C-03 0.000000E + 00 2.602085E-18 4.083167E-18 4.083167E-14 0.775398E-03 0.000000E + 00 4.336809E-19 5.19024530-07 8 1.772971E-03 0.000000E+00 2.632684E-19 3.064243E-08 9 1.772848E-03 0.000000E + 00 5.228973E-19 4.371356E-11最低限度,满足约束。优化完成,因为目标函数在可行的方向上不降低,到在最优性公差的值内,并且对约束公差的值满足约束。

纠正错过的问题

要检查您的问题是否正确,请查看其所有方面。例如,通过运行此脚本来创建优化问题以解决数独问题。

x = optimvar (9 ' x ', 9日,9日下界,0,' UpperBound ', 1);Cons1 = sum(x,1) == 1;Cons2 = sum(x,2) == 1;con3 = sum(x,3) == 1;概率= optimproblem;prob.Constraints。cons1 = cons1;prob.Constraints。cons2 = cons2;prob.Constraints。cons3 = cons3;mul = 1 (1, 1, 9);mul = cumsum (mul 3); prob.Objective = sum(sum(sum(x,1),2).*mul); cons4 = optimconstr(3,3,9); for u = 1:3 for v = 1:3 arr = x(3*(u-1)+1:3*(u-1)+3,3*(v-1)+1:3*(v-1)+3,:); cons4(u,v,:) = sum(sum(arr,1),2) <= ones(1,1,9); end end prob.Constraints.cons4 = cons4; B = [1,2,2; 1,5,3; 1,8,4; 2,1,6; 2,9,3; 3,3,4; 3,7,5; 4,4,8; 4,6,6; 5,1,8; 5,5,1; 5,9,6; 6,4,7; 6,6,5; 7,3,7; 7,7,6; 8,1,4; 8,9,8; 9,2,3; 9,5,4; 9,8,2]; for u = 1:size(B,1) x.LowerBound(B(u,1),B(u,1),B(u,1)) = 1; end

这个脚本有一些错误,您可以通过检查变量、目标和约束来发现这些错误。首先,检查变量X

X
x = 9×9×9优化Variable阵列具有属性:数组范围特性:名称:'X'类型:'连续'索引序列:{{} {} {}}元素属性:下行:[9×9×9双]上行:[9×9×9双]看到变量显示。看到展示的边界。

此显示表明,变量的类型是连续的。变量应该是整数值。更改类型。

x.type ='整数'
x = 9×9×9优化Variable阵列具有属性:数组范围属性:名称:'x'类型:'整数'索引Name:{{} {}}}元素属性:低行:[9×9×9双]上行:[9×9×9双]看到变量显示。看到展示的边界。

检查界限。应该有21个下限,值1,每行一个B.。因为X是一个大的数组,将界限写入文件,而不是在命令行上显示它们。

写作(x,'xbounds.txt'

搜索文件xbounds.txt.适用于所有实例1 <=。只有九个下限,在变量中具有值1,在变量中x(1,1,1)x(2,2,2),......,x(9,9,9)。要调查此差异,请检查设置下限的代码:

u = 1:尺寸(B, 1) x.LowerBound (B (u, 1), B (u, 1), B (u, 1)) = 1;结尾

循环内的线应该说X.LowerBound(B(U,1),B(U,2),B(U,3))= 1;。将所有下限重置为零,然后运行更正的代码。

x.lowerbound = 0;对于U = 1:尺寸(b,1)x.lowerbound(b(u,1),b(u,2),b(u,3))= 1;结束写入(x,'xbounds.txt')

xbounds.txt.现在具有正确的下限条目数为1。

检查目标函数。目标函数表达式很大,因此将表达式写入文件。

写(prob.objective,'objectivedescription.txt'
x(1,1,1)+ x(2,1,1)+ x(3,1,1)+ x(4,1,1)+ x(5,1,1,1)+ x(6,1那1) + x(7, 1, 1) + x(8, 1, 1) + x(9, 1, 1) + x(1, 2, 1) + x(2, 2, 1) + x(3, 2, 1) + x(4, 2, 1) + x(5, 2, 1) + x(6, 2, ... 9*x(7, 8, 9) + 9*x(8, 8, 9) + 9*x(9, 8, 9) + 9*x(1, 9, 9) + 9*x(2, 9, 9) + 9*x(3, 9, 9) + 9*x(4, 9, 9) + 9*x(5, 9, 9) + 9*x(6, 9, 9) + 9*x(7, 9, 9) + 9*x(8, 9, 9) + 9*x(9, 9, 9)

目标函数看起来合理,因为它是标量表达的总和。

将约束写入文件以进行检查。

写(prob.constraints.cons1,'cons1.txt')写(prob.constraints.cons2,'cons2.txt')写(prob.constraints.cons3,'cons3.txt')写(prob.constraints.cons4,'cons4.txt'

审查cons4.txt.而且你看到了一个错误。所有约束都是不平等而非平等。更正创建此约束的代码行,并在问题中置于纠正的约束。

cons4 = optimconstr(3、3、9);为u = 1:3 v = 1:3 arr = x (3 * (u-1) + 1:3 * (u-1) + 3, 3 *(它们)+ 1:3 *(它们)+ 3:);CONS4(U,V,:)= SUM(SUM(ARR,1),2)== ONE(1,1,9);结束end prob.constraints.cons4 = cons4;

在这些更改后,您可以成功解决问题。

sol =解决(prob);x =圆形(sol.x);y = y =(尺寸(x));对于k = 2:9 y(:,:,k)= k;每个深度k结束s = x的%乘法器。* y;%乘以其深度S = SUM(S,3);%s是9-by-9并握住求助的拼图拉丝

重复变量名称

如果重新创建一个变量,但是已经有一个使用旧变量的表达式,那么在将表达式合并到单个问题中时可能会出现错误。看禁止重复名称的变量

也可以看看

|||||||

相关的话题