前言
本文大部分是对于数学建模清风老师的课程学习总结归纳而来,我的理解可能有错误,大家发现错误可以在评论区批评指正,课程地址:《数学建模清风》
前置文章请了解:
一、最大最小化模型概述
对策论中,我们常遇到这样的问题:在不利的条件下,寻求最有利的策略。
在实际问题中也有许多求最大值的最小化问题,例如急救中心选址问题,就是要规划其到所有地点最大距离的最小值,在投资规划中要确定最大风险的最低限度等。
为此,对每个
x
∈
R
n
x\in R^n
x∈Rn,我们先求每个目标值
f
i
(
x
)
f_i(x)
fi(x)的最大值,然后再求这些最大值中的最小值。
二、模型标准型
最大最小化问题的一般数学模型:
m
i
n
x
{
m
a
x
[
f
1
(
x
)
,
f
2
(
x
)
,
⋯
,
f
m
(
x
)
]
}
s
.
t
.
{
A
x
≤
b
A
e
q
⋅
x
=
b
e
q
C
(
x
)
≤
0
C
e
q
(
x
)
=
0
V
L
B
≤
X
≤
V
U
B
min_x\{max[f_1(x),f_2(x),\cdots,f_m(x)]\} \\ s.t.\begin{cases} Ax\leq b\\ Aeq·x=beq\\ C(x)\leq0\\ Ceq(x)=0\\ VLB\leq X \leq VUB \end{cases}
minx{max[f1(x),f2(x),⋯,fm(x)]}s.t.⎩
⎨
⎧Ax≤bAeq⋅x=beqC(x)≤0Ceq(x)=0VLB≤X≤VUB
m
a
t
l
a
b
matlab
matlab标准型:
[
x
,
f
v
a
l
]
=
f
m
i
n
i
m
a
x
(
@
F
u
n
,
x
0
,
A
,
b
,
A
e
q
,
b
e
q
,
l
b
,
u
b
,
@
n
o
n
l
f
u
n
,
o
p
t
i
o
n
)
[x,fval]=fminimax(@Fun,x_0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
[x,fval]=fminimax(@Fun,x0,A,b,Aeq,beq,lb,ub,@nonlfun,option)
PS:目标函数用一个函数向量表示。
三、经典例题
选址问题:设某城市有某种物品的10个需求点,第
i
i
i个需求点
p
i
p_i
pi的坐标为
(
a
i
,
b
i
)
(a_i,b_i)
(ai,bi)(见表4-2),道路网与坐标轴平行,彼此正交。现打算建一个该物品的供应中心,且由于收到城市某些条件的限制,该供应中心只能设在
x
x
x界于
[
3
,
8
]
[3,8]
[3,8],
y
y
y界于
[
4
,
10
]
[4,10]
[4,10]的范围之内。
问该中心应建在何处为好?
解题思路:
解题代码:
%% 最大最小化模型 : min{max[f1,f2,···,fm]}
x0 = [6, 6]; % 给定初始值
lb = [3, 4]; % 决策变量的下界
ub = [8, 10]; % 决策变量的上界
[x,feval] = fminimax(@Fun,x0,[],[],[],[],lb,ub)
max(feval)
% x =
% 8.0000 8.5000
% feval =
% 13.5000 5.5000 5.5000 12.5000 8.5000 8.5000 5.5000 13.5000 9.5000 0.5000
% 结论:
% 在坐标为(8,8.5)处建立供应中心可以使该点到各需求点的最大距离最小,最小的最大距离为13.5单位。
function f = Fun(x)
a=[1 4 3 5 9 12 6 20 17 8];
b=[2 10 8 18 1 4 5 10 8 9];
% 函数向量
f=zeros(10,1);
for i = 1:10
f(i) = abs(x(1)-a(i))+abs(x(2)-b(i));
end
% f(1) = abs(x(1)-a(1))+abs(x(2)-b(1));
% f(2) = abs(x(1)-a(2))+abs(x(2)-b(2));
% f(3) = abs(x(1)-a(3))+abs(x(2)-b(3));
% f(4) = abs(x(1)-a(4))+abs(x(2)-b(4));
% f(5) = abs(x(1)-a(5))+abs(x(2)-b(5));
% f(6) = abs(x(1)-a(6))+abs(x(2)-b(6));
% f(7) = abs(x(1)-a(7))+abs(x(2)-b(7));
% f(8) = abs(x(1)-a(8))+abs(x(2)-b(8));
% f(9) = abs(x(1)-a(9))+abs(x(2)-b(9));
% f(10) = abs(x(1)-a(10))+abs(x(2)-b(10));
end