首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最小不服从约束,不最小化目标函数

最小不服从约束,不最小化目标函数
EN

Stack Overflow用户
提问于 2022-02-01 10:22:06
回答 1查看 250关注 0票数 1

我有以下代码:

代码语言:javascript
复制
import numpy as np
from scipy.optimize import minimize

def U(contributions, sizes, l):
    return sizes*l*np.log(np.sum(contributions)) - contributions**2/sizes

def min_Ui(vars, sizes,l, number):
    return -U(vars, sizes, l)[number]


sizes = np.array([1,1/4])
l = 4
number = 1       # 1 refers to nation 2

    
m_N = sizes**2 * np.sqrt(l/(2*np.sum(sizes**2)))
U_N = U(m_N, sizes, l)
    
constr = []
for i in range(len(sizes)):
    if i != number:
        constr.append({'type':'eq', 'fun': lambda x, sizes,l, U_N: U(x,sizes,l)[i] - U_N[i], 'args': (sizes,l, U_N)})
            
    
res = minimize(min_Ui, m_N, method='SLSQP', constraints=constr, args=(sizes,l, number))
    
print(res)

在这一守则中,有几个国家为公益事业作出了贡献。他们每个人都有一个效用函数(由U计算),它正依赖于所做的总贡献,而负地依赖于他们自己的贡献。每个国家都有其特定的大小(用大小来描述),参数l对于所有国家来说都是常见的。现在,我希望最大限度地利用其中一个国家的效用(用‘number’表示),同时保持其他国家的效用保持在初始值(U_N)不变。这意味着一个国家可以选择所有其他国家的贡献,以最大限度地发挥其自身的效用,但前提是它们并不比起点差。

在所示的代码中,我对大小为1和1/4的两个国家这样做,参数l取值4,国家2最大化其效用(我使用这些值是因为我知道这种情况的解决方案:贡献应该是1.70297443和0.17713154)。但是,代码应该适用于n个国家和任何正参数值。

但是,最小化函数没有给出正确的结果。结果中国家2的效用通常是它的初始效用,而国家1的效用取决于我给出的初始猜测。然而,在这个问题中,约束条件是,国家1的效用应该是它的初始值,而国家2的效用是最大的。

有人能解释我做错了什么或者为什么不起作用吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-01 18:45:39

在通过循环中的lambda表达式定义约束时,需要捕获循环变量i,有关详细信息,请参阅这里。定义约束如下

代码语言:javascript
复制
constr = []
for i in range(len(sizes)):
    if i != number:
        constr.append({'type':'eq', 'fun': lambda x, sizes,l, U_N, i=i: U(x,sizes,l)[i] - U_N[i], 'args': (sizes,l, U_N)})

产生您期望的解决方案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70938899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档