我必须使用matlab数学工具箱中的函数linprog
来解决一个简单的问题。问题是我不知道如何格式化我的方程,所以这个函数解决了这个问题。
这是我想要最小化的函数(a_i
是一些给定的系数,x
在R ^ 5中):
x = argmax min{a1*x1 + a2*x2, a2*x2 + a3*x3 + a4*x4, a4*x4 + a5*x5}
受制于:
sum(x_i) = 3000
all x_i >= 0
这可以改为:
(x, lambda) = argmin(-lambda)
受制于:
a1*x1 + a2*x2 >= lambda
a2*x2 + a3*x3 + a4*x4 >= lambda
a4*x4 + a5*x5 >= lambda
sum(x_i) = 3000
all x_i >= 0
我只能找到最小化简单线性函数的例子,其中没有min / max参数。你能给我一个提示,告诉我如何将我的结构作为linprog
函数的参数吗?
答案 0 :(得分:1)
我不相信你可以提出这个问题,因为你把它称为linprog问题。 “MIN”操作是问题所在。由于目标函数不能被表述为
y = f'x.
即使你的约束是线性的,你的目标函数也不是。
也许有些诡计你可以线性化它。但如果是这样,那就是数学问题。请参阅:https://math.stackexchange.com/
答案 1 :(得分:1)
让我们尝试以下方法
您的x
向量现在是
[x1 x2 x3 x4 x5 lambda]
目标载体
f = [0 0 0 0 0 -1]
平等约束:
Aeq = [1 1 1 1 1 0] beq = 3000
不平等约束:
A = [-a1 -a2 0 0 0 1; 0 -a2 -a3 -a4 0 1; 0 0 0 -a4 -a5 1] b = [0;0;0]
下限:
lb = [0 0 0 0 0 -inf]
现在尝试
linprog(f,A,b,Aeq,beq,lb)
一些参数的转置应该可以解决问题。