我可以在约束函数中使用if语句在MATLAB中使用ga进行优化吗?

时间:2017-10-30 06:30:45

标签: matlab optimization constraints genetic-algorithm

我有一个约束函数,它调用另一个函数(inverse_kinematics)来计算一些约束,如果不满足c(1)和c(2),inverse_kinematics()会给出错误,我怎样才能确保c(1) )在调用inverse_kinematics()函数之前,是否满足c和(2)?我可以通过在约束函数中使用if条件来解决它吗?下面是我的优化函数的代码,

function [c, ceq] = simple_constraint(l1,l2,l3)

c(1) = l3^2 + 200*l3*cos(30) + 10000 - (l1 + l2)^2;
c(2) = (100- l3*cos(30))^2 + (100*sin(30))^2 - (l1-l2)^2;

thetas = inverse_kinematics(l1,l2,l3); % Gives error when c(1) and c(2) are not satisfied

c(3) = thetas(4,1) - 160;
c(4) = thetas(4,2) - 160;
c(5) = thetas(4,3) - 160;
c(6) = 20 - thetas(4,1);
c(7) = 20 - thetas(4,2);
c(8) = 20 - thetas(4,3);
c(9) = thetas(5,1) - 340;
c(10) = thetas(5,2) - 340;
c(11) = thetas(5,3) - 340;
c(12) = 200 - thetas(5,1);
c(13) = 200 - thetas(5,2);
c(14) = 200 - thetas(5,3);
c(15) = thetas(6,1) - 340;
c(16) = thetas(6,2) - 340;
c(17) = thetas(6,3) - 340;
c(18) = 200 - thetas(6,1);
c(19) = 200 - thetas(6,2);
c(20) = 200 - thetas(6,3);
ceq = [];
end 

提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用trycatch

来检查约束

例如

c(1) = l3^2 + 200*l3*cos(30) + 10000 - (l1 + l2)^2;
c(2) = (100- l3*cos(30))^2 + (100*sin(30))^2 - (l1-l2)^2;
    try
        thetas = inverse_kinematics(l1,l2,l3);
    catch
        warning('C1 and C2 is wrong'); % Or you can change any parameter here
    end