簡體   English   中英

Gekko 返回不正確的成功解決方案

[英]Gekko returning incorrect successful solution

以下代碼返回Successful Solution Objective: 0. 但這不是最佳解決方案。 最佳解決方案是-6 通過閱讀其他問題,我認為在目標 function 中使用非 Gekko 函數是一個問題,但我使用的唯一非 Gekko function 是np.matmul np.matmul是否適用於 gekko arrays? 注意sigma_post是一個 nxn numpy 單位矩陣。

m = GEKKO(remote=False)
m.options.max_iter=1000
#m.options.ipopt_integer_tol=1
#m.solver_options = ['minlp_integer_tol 50']
#m.solver_options = ['minlp_max_iter_with_int_sol 1000',
#                    'minlp_branch_method 1']
                    

N = 2
b = m.Array(m.Var,(N,n), lb=0, ub=1, integer=True)

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

print('b: ', b)

# CONSTRAINT: Each Lineup must be less than budget
z = np.array([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 = np.array([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.array([[None]*N for i in range(N)])
sig = np.matmul(np.matmul(b, sigma_post), b.T)

for i in range(N):
    for j in range(N):
        sigma_1[i][j] = m.Intermediate(sig[i][j])
        
        
m.Obj(-(sigma_1[0][0] + sigma_1[1][1]- 2*sigma_1[1][0]))

m.options.SOLVER = 1 

m.solve(debug=0)

編輯:為了透明,理想情況下,我關心的目標 function 在下面,但上面詳述的更簡單的目標 function 會導致問題,所以我決定在那里開始故障排除。 以下目標拋出Warning: no more possible trial points and no integer solution Maximum iterations mumu不存在於約束中。 非常感謝您的任何建議!

pi = 3.14159
eps = 1.0E-6

def normal_cdf(x, m):
    return 1/(1+m.exp(-1.65451*x))
    
def normal_pdf(x, m):
    return (1/((2*pi)**(.5)))*m.exp((x**2)/2)
    
def theta(s, m):
    return m.sqrt(s[0][0]+s[1][1] - 2*s[0][1])

# OBJECTIVE: Maximize 
mu_1 = np.array([None]*N)
for i in range(N):
    mu_1[i] = m.Intermediate(np.matmul(b[i, :], mu))


inter = m.if2(theta(sigma_1, m)-eps, .5*mu_1[0]+.5*mu_1[1], 
             (mu_1[0]*normal_cdf((mu_1[0]-mu_1[1])/theta(sigma_1, m), m) + \
              mu_1[1]*normal_cdf((mu_1[1]-mu_1[0])/theta(sigma_1, m), m) + \
              theta(sigma_1, m)*normal_pdf((mu_1[0]-mu_1[1])/theta(sigma_1, m), m)))

m.Obj(-inter)

使用np.matmul或任何其他允許對象而不是僅數值的 function 沒有問題。 需要對象,因為b是一個 Gekko 類型值的數組,需要這些值來計算具有自動微分的導數。 您還可以使用簡化表達式的新@運算符。 您最初的問題陳述不完整,缺少許多定義。 我添加了一些示例值,以便腳本可以在沒有定義錯誤的情況下運行。 以下是幫助重現錯誤的指南

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@sigma_post@b.T

這是完整的腳本。

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@sigma_post@b.T
                
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]]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM