我需要找到函数的最大最小值点。
有 2 个矩阵
M_A
和 M_B
,其中 M_A < M_B
和 I > M_B
(逐元素比较),其中 I
是全 1 的矩阵。
我需要找到最大
x
值(0 到 1 之间):
x*M_A+(1-x)*I >= M_B
(逐元素比较)
为此,我试图找到以下表达式
x*M_A+(1-x)*I - M_B
的根。为此,我通过取上述表达式的所有负项之和来定义标量函数 (x*M_A+(1-x)*I - M_B
)。目标是找到 x
值使得 my_f(x)=0
。然而,满足这个条件的x
有无限多个,例如my_f(0)=0
。我想获得最大的x
。
def my_f(x):
matrix_comb = x*M_A + (1-x)*np.ones((n, n))
matrix_diff = matrix_comb - M_B
summ = 0
for i in range(0, len(matrix_diff)):
for j in range(0, len(matrix_diff)):
if matrix_diff[i,j] <= 0:
summ = summ + matrix_diff[i,j]
return -summ
my_f(scipy.optimize.fminbound(my_f, 0, 1))
代码返回 0.85。然而,还有其他更大的
x
值满足条件。
我从字面上解释你的问题;也就是说,你确实在寻找最大的
x
,但受你的不平等的影响;我忽略了为了做到这一点,我......之后的一切。因为寻根无助于实现这个目标。
import numpy as np
import scipy
rand = np.random.default_rng(seed=0)
m = 13
n = 7
M_A = rand.uniform(low=-1, high=1, size=(m, n))
M_B = rand.uniform(low=M_A, high=1, size=(m, n))
'''
Maximize x s.t.
0 <= x <= 1
x*M_A + (1-x)*ones >= M_B
x(MA - 1) >= MB - 1
'''
result = scipy.optimize.milp(
c=-1, # maximize
integrality=0, # continuous
bounds=scipy.optimize.Bounds(lb=0, ub=1),
constraints=scipy.optimize.LinearConstraint(
A=M_A.reshape((m*n, 1)) - 1,
lb=M_B.ravel() - 1,
)
)
assert result.success, result.message
print('x =', result.x)