主要内容

审查或修改优化问题

审查问题使用显示

创建优化问题后,可以使用显示.对于大问题,使用代替。例如,

概率= optimproblem;x = optimvar (' x ' 2下界,0);概率。客观= x(1) - 2*x(2);prob.Constraints。con1 = x(1) + 2*x(2) <= 4;prob.Constraints。con2 = -x(1) + x(2) <= 1;显示(概率)
优化问题:求解:x最小化:x(1) - 2*x(2)受制于con1: x(1) + 2*x(2) <= 4受制于con2: -x(1) + x(2) <= 1变量边界:0 <= x(1) 0 <= x(2)

这个回顾展示了问题的基本元素,例如问题是最小化还是最大化,以及变量的边界。回顾显示了变量中使用的索引名(如果有的话)。检查不显示变量是否为整数值。

更改默认解算器或选项

要试图提高解决方案或解决方案的速度,请检查并更改默认求解器或选项。

要查看默认的求解器和选项,请使用optimoptions(概率).例如,

rng default x = optimvar('x',3,'LowerBound',0);expr =总和((兰德(3,1)。* x) ^ 2);概率= optimproblem(“目标”,expr);prop . constraints .lincon = sum(sum(randn(size(x)).*x)) <= randn;选项= optimoptions(概率)
options = lsqlin options:当前算法('interior-point')使用的选项:(其他可用算法:'trust-region- reflection ')设置属性:没有设置选项。默认属性:算法:'interior-point' constraintolerance: 1.0000e-08显示:'final' LinearSolver: 'auto' MaxIterations: 200 OptimalityTolerance: 1.0000e-08 StepTolerance: 1.0000e-12显示当前算法未使用的选项('interior-point')

这个问题的默认求解器是lsqlin,您可以看到默认选项。

要更改求解器,请设置“规划求解”名称-值对的解决.若要查看不同求解器的适用选项,请使用optimoptions将当前选项传递给不同的求解器。例如,继续这个问题,

选项= optimoptions(“quadprog”选项)
options = quadprog options:当前算法('interior-point-凸')使用的选项:(其他可用算法:'trust- area - reflection ')设置属性:ConstraintTolerance: 1.0000e-08 MaxIterations: 200 OptimalityTolerance: 1.0000e-08 StepTolerance: 1.0000e-12默认属性:算法:' internal -point-凸'显示:'final'线性求解器:'auto'显示当前算法('interior-point-凸')不使用的选项

要更改选项,请使用optimoptions或者点表示法来设置选项,并将选项传递给解决“选项”名称-值对。看到常用选项:调优和故障排除.继续这个示例,

选项。显示=“iter”;索尔=解决(问题,选项,选择,“解决”,“quadprog”);
Iter Fval primary Infeas Dual Infeas互补性0 1.500359e+00 3.068423e-01 2.275437e+00 1.728717e-01 0.000000e+00 7.719860e-03 3.637874e-02 2 2.604108e-02 0.000000e+00 2.775558e-17 1.405260e -03 3 7.822161e-03 0.000000e+00 2.775558e-17 1.407915e-03 4 2.909218e-03 0.000000e+00 6.938894e-18 2.070784e-04 5 1.931264e-03 0.000000e+00 1.734723e-18 2.907724e-05 6 1.797508e-03 0.000000e+00 2.602085e-18 4.083167e-06 7 1.77539e +00 4.336809e-19 5.102453e-07 8 1.772971e-030.000000e+00 2.632684e-19 3.064243e-08 9 1.772848e-03 0.000000e+00 5.228973e-19 4.371356e-11最小发现满足约束。由于目标函数在可行方向上不减少,优化完成,在最优性公差的值内,约束满足在约束公差的值内。

纠正错误指定的问题

为了检查你的问题是否正确,回顾它的所有方面。例如,通过运行这个脚本创建一个优化问题来解决一个Sudoku问题。

x = optimvar (9 ' x ', 9日,9日下界,0,' UpperBound ', 1);con1 = sum(x,1) == 1;con2 = 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
arraywide properties: Name: 'x' Type: 'continuous' IndexNames: {{} {} {} Elementwise properties: LowerBound: [9×9×9 double] UpperBound: [9×9×9 double]参见variables with show。参见带showbounds的bounds。

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

x.Type =“整数”
arraywide properties: Name: 'x' Type: 'integer' IndexNames: {{} {} {} Elementwise properties: LowerBound: [9×9×9 double] UpperBound: [9×9×9 double]参见variables with show。参见带showbounds的bounds。

检查范围。应该有21个值为1的下界,每一行对应一个B.因为x是一个大数组,请将边界写入文件,而不是在命令行中显示它们。

writebounds (x,“xbounds.txt”

搜索文件xbounds.txt对于所有1 < =.变量中只有9个下界值为1x (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;结束writebounds (x, xbounds.txt)

xbounds.txt现在有了正确的下界数,即1。

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

写(概率。目标,“objectivedescription.txt”
x (1 1 1) + (2, 1, 1) + x(3、1,1)+ (4 1 1)+ x(5、1、1)+ (6,1,1)+ x (7, 1, 1) + (8, 1, 1) + x (9, 1, 1) + x(1、2、1)+ (2 2 1)+ x (3,2,1) + x(4、2、1)+ (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:);con4 (u,v,:) = sum(sum(arr,1),2) == ones(1,1,9);结束prob.Constraints结束。cons4 = cons4;

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

索尔=解决(问题);x =圆(sol.x);y = 1(大小(x));对于k = 2:9 y(:,:,k) = k;%乘数为每个深度k结束S = x.*y;%将每个条目乘以它的深度S = sum(S,3);% S是9乘9的,包含已解决的谜题drawSudoku(S)

重复的变量名

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

另请参阅

|||||||

相关的话题

Baidu
map