使用没有问题np.matmul
或任何其他允许对象而不仅仅是数值的函数。需要对象是因为b
是计算自动微分导数所需的 Gekko 类型值的数组。您还可以使用新的@
简化表达式的运算符。您最初的问题陈述不完整,缺少许多定义。我添加了一些示例值,以便脚本可以运行而不会出现定义错误。这里有帮助重现错误的指南 https://stackoverflow.com/help/minimal-reproducible-example.
N = 2
n = 3
qb_index_range = [0,2]
rb_index_range = [0,2]
wr_index_range = [0,2]
info_df = pd.DataFrame({'cost':np.ones(n)})
budget = 100
sigma_post = np.random.rand(n,n)
这是一个使用的例子np.matmul()
这也可以是点积np.dot()
.
sigma_1 = np.matmul(np.matmul(b,sigma_post), b.T)
这也可以用矩阵乘法运算符来编写。
sigma_1 = b@[email protected] /cdn-cgi/l/email-protection
这是完整的脚本。
from gekko import GEKKO
import numpy as np
import pandas as pd
m = GEKKO(remote=False)
m.options.max_iter=1000
N = 2
n = 3
b = m.Array(m.Var,(N,n), lb=0, ub=1, integer=True)
qb_index_range = [0,2]
rb_index_range = [0,2]
wr_index_range = [0,2]
info_df = pd.DataFrame({'cost':np.ones(n)})
budget = 100
sigma_post = np.eye(n)
for i in range(N):
for j in range(n):
if j in [qb_index_range[0], rb_index_range[0], wr_index_range[0]]:
b[i][j].value = 1
else:
b[i][j].value = 0
# CONSTRAINT: Each Lineup must be less than budget
z = [None]*N
for i in range(N):
z[i] = m.Intermediate(sum(b[i, :]*list(info_df['cost'])))
m.Equations([z[i] <= budget for i in range(N)])
# CONSTRAINT: Each Lineup has one QB
z_1 = [None]*N
for i in range(N):
z_1[i] = m.Intermediate(sum(b[i, qb_index_range[0]: qb_index_range[1]+1]))
m.Equations([z_1[i] == 1 for i in range(N)])
# CONSTRAINT: Each Lineup has one RB
z_2 = np.array([None]*N)
for i in range(N):
z_2[i] = m.Intermediate(sum(b[i, rb_index_range[0]: rb_index_range[1]+1]))
m.Equations([z_2[i] == 1 for i in range(N)])
# CONSTRAINT: Each Lineup has one WR
z_3 = np.array([None]*N)
for i in range(N):
z_3[i] = m.Intermediate(sum(b[i, wr_index_range[0]: wr_index_range[1]+1]))
m.Equations([z_3[i] == 1 for i in range(N)])
#OBJECTIVE: maximize with two lineups
#sigma_1 = np.matmul(np.matmul(b,sigma_post), b.T)
sigma_1 = b@[email protected] /cdn-cgi/l/email-protection
m.Maximize(sigma_1[0][0] + sigma_1[1][1]- 2*sigma_1[1][0])
m.options.SOLVER = 1
m.solve(debug=0,disp=False)
print(b)
这产生了一个成功的解决方案。由于原始问题陈述不完整,无法验证正确的解决方案。
[[[1.0] [0.0] [0.0]]
[[1.0] [0.0] [0.0]]]