约束问题的直接解法,像是在无约束问题的直接解法中加入了约束条件的判断。
随机方向法对应着坐标轮换法,而复合形法对应着单纯形法。
复合形法
复合形法与第二种单纯形法的相似度极高,请参见工程优化设计与Matlab实现——无约束问题的直接解法(二)中的第二种单纯形法。
复合形法的基本思路是在可行域内构造一个具有N个顶点的复合形,找出各顶点中的最坏点(函数值最大的点),再沿某一方向找到函数值下降的点来替换最坏点,得到新的复合形
有了单纯形法的基础,直接上流程图:

举栗子
利用复合形法求目标函数在约束条件下的极小值点和极小值


主程序如下:
clc;
clear all;
close all;
G1 = inline('6 - x(1) - x(2)','x');
G2 = inline('x(1)','x');
G3 = inline('x(2)','x');
lb = [0;0]; %下界
ub = [6;6]; %上界
weishu = 2; %维数
E = 1e-8;
t1 = datetime;
[FuHeXingFa_x, FuHeXingFa_xf, FuHeXingFa_n] = FuHeXingFa(E, weishu, lb, ub, G1, G2, G3);
t2 = datetime;
fprintf('复合形法(根据上下界随机生成初始点)n')
fprintf('开始时间:%sn结束时间:%sn',t1,t2)
fprintf('极值点为:[%f, %f]n',FuHeXingFa_x)
fprintf('极值为:%fn',FuHeXingFa_xf)
fprintf('迭代次数为:%dnn',FuHeXingFa_n)
目标函数定义如下:
function f = func(x)
f = 1 - 2 * x(1) - x(2)^2;
复合形法函数定义如下:
function [FuHeXingFa_x, FuHeXingFa_xf, FuHeXingFa_n] = FuHeXingFa(E, weishu, lb, ub, G1, G2, G3)
N = 2 * weishu