【发布时间】:2018-06-26 07:50:01
【问题描述】:
我在 python 中有一个函数,如下所示:
import numpy as np
def fun(Gp,Ra,Mr,Pot,Sp,Mc,Keep):
if(Keep==True):
return(Pot*np.tanh((Gp+Ra+Mr+ Mc)*Sp ))
假设以下数据:
import pandas as pd
dt_org = pd.DataFrame({"RA": [0.5, 0.8, 0.9],
"MR": [0.97, 0.95, 0.99],
"POT": [0.25, 0.12, 0.05],
"SP": [0.25, 0.12, 0.15],
"MC": [50, 75, 100],
"COUNTRY": ["GB", "IR", "GR"]
})
我总共有 100 GP 我想正确分配所有这些
为了最大化objective_function:
在all这3个元素都是正
的限制下根据this 发布scipy.optimize 将是要走的路,但我很困惑如何写下问题
更新:我的尝试
from scipy.optimize import minimize
y = {'A': {'RA': 0.5, 'MR': 0.97, 'POT': 0.25, 'SP': 0.25, 'MC': MC_1, 'keep': True},
'B': {'RA': 0.8, 'MR': 0.95, 'POT': 0.12, 'SP': 0.12, 'MC': MC_2, 'keep': True},
'C': {'RA': 0.9, 'MR': 0.99, 'POT': 0.05, 'SP': 0.15, 'MC': MC_3, 'keep': True}}
def objective_function(x):
return(
-(fun(x[0], Ra=y['A']['RA'], Mr=y['A']['MR'],
Pot=y['A']['POT'], Sp=y['A']['SP'],
Mc=y['A']['MC'], Keep=y['A']['keep']) +
fun(x[1], Ra=y['B']['RA'], Mr=y['B']['MR'],
Pot=y['B']['POT'], Sp=y['B']['SP'],
Mc=y['B']['MC'], Keep=y['B']['keep']) +
fun(x[2], Ra=y['C']['RA'], Mr=y['C']['MR'],
Pot=y['C']['POT'], Sp=y['C']['SP'],
Mc=y['C']['MC'], Keep=y['C']['keep']))
)
cons = ({'type': 'ineq', 'fun': lambda x: x[0] + x[1] + x[2] - 100})
bnds = ((0, None), (0, None), (0, None))
minimize(objective_function, x0=[1,1,1], args=y, method='SLSQP', bounds=bnds,
constraints=cons)
现在的问题是我得到了错误ValueError: Objective function must return a scalar,而fun 函数的输出是一个标量
更新 2(@Cleb 评论后) 所以现在我改变了函数:
def objective_function(x,y):
temp = -(fun(x[0], Ra=y['A']['RA'], Mr=y['A']['MR'],
Pot=y['A']['POT'], Sp=y['A']['SP'],
Mc=y['A']['MC'], Keep=y['A']['keep']) +
fun(x[1], Ra=y['B']['RA'], Mr=y['B']['MR'],
Pot=y['B']['POT'], Sp=y['B']['SP'],
Mc=y['B']['MC'], Keep=y['B']['keep']) +
fun(x[2], Ra=y['C']['RA'], Mr=y['C']['MR'],
Pot=y['C']['POT'], Sp=y['C']['SP'],
Mc=y['C']['MC'], Keep=y['C']['keep']))
print("GP for the 1st: " + str(x[0]))
print("GP for the 2nd: " + str(x[1]))
print("GP for the 3rd: " + str(x[2]))
return(temp)
cons = ({'type': 'ineq', 'fun': lambda x: x[0] + x[1] + x[2] - 100})
bnds = ((0, None), (0, None), (0, None))
现在有两个问题:
1.x[0],x[1],x[2]的值真的很接近
-
x[0],x[1],x[2]的总和超过100
【问题讨论】:
-
阅读他们的教程(scipy.optimize; tutorial != API docs; 它非常好)并尝试一下。您可能会感到困惑,但不尝试并显示任何东西总是看起来像:为我编写代码。
-
请看更新
-
这是代码,但没有说明它存在的潜在问题。
-
我可能会错过一些东西,但在您的
objective_function中,您只通过x而不是y;在fun你只传递参数但没有x(这个函数似乎独立于x,这看起来很时髦)。我也同意 sascha:一个实际的问题会帮助你:) -
@Cleb 我在
minimize函数的args参数中传递了y。现在的问题是我得到了错误ValueError: Objective function must return a scalar,而fun函数的输出是一个标量
标签: python python-3.x numpy optimization scipy