线性规划
代码
%%%%%%%%%%%
% min
% [x, fval] = linprog(f,a,b,aeq,beq,lb,ub);
% max = 2*x1 + 3*x2
% x1 + 2*x2 <=8
% 4*x1 <= 16
% 4*x2 <= 12
% x1, x2 >=0
%%%%%%%%%%
f = [-2 -3]';
a = [1 2; 4 0;0 4];
b = [8 16 12]';
[x,z] = linprog(f, a, b, [],[],zeros(2,1));
x, z=-z
%因为题目要求是求最大值,而linprog为求最小值,所以要把f变为[-2 ;-3];而且在最后结果的时候要把z = -z
结果
非线性规划
代码
%%%%%%%%%%%%%%%%%%%
% minf(x) = x1^2 + x2^2 + x3^2 + 8
%
% x1^2 - x2 + x3^2 >=0
% x1 + x2^2 + x3^3 <=20
% -x1 -x2^2 + 2 = 0
% x2 + 2x3^2 = 3
% x1, x2, x3 >=0
%%%%%%%%%%%%%%%%%%%%
[x, y] = fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun2')
%相关函数如下
fun1.m
function f = fun1(x)
f = sum(x.^2) + 8;
end
fun2.m
function [g,h] = fun2(x)
g = [-x(1)^2 + x(2) - x(3)^2
x(1) + x(2)^2 + x(3)^3 - 20]; %非线性不等式约束
h = [-x(1) - x(2)^2 + 2
x(2) + 2*x(3)^2 - 3]; %非线性等式约束
结果
01规划
就是变量只能取0 or 1
指派矩阵的含义:比如4个人做4件事情,这4个人都会做这4件事情。但是每个人做不同事情花费的时间不一样。要求:每个人只能做一件事,每件事都必须要有人做,如何分配任务,才能使总的花费时间最少?
代码
clc,clear
disp('输入指派矩阵');
c = input('c = ');
% c = [8 13 18 23; 10 14 16 27;2 10 21 26; 14 22 26 28];
%c = [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10];
[m, n] = size(c);
%把c转为按列项排列为列矩阵
c = c(:);
a = zeros(m+n,m*n); % 10行 25列
%表示从第1个变量到第25个变量都是必须是整数
intcon = 1:m*n;
for i = 1:m
a(i,(i-1)*m+1:m*i) = 1;
a(m+i, i:m:m*n) = 1;
end
b = ones(m+n,1);
lb = zeros(m*n, 1);
ub = ones(m*n,1);
[x,z] = intlinprog(c, intcon,[],[],a,b, lb, ub);
x = reshape(x,[m,n])
z
结果
输入指派矩阵为: [3 8 2 10 3;8 7 2 9 7;6 4 2 7 5;8 4 2 3 5;9 10 6 9 10]
结果如下: