python - 在给定python约束的情况下最大化方程的值
问题描述
有四个
(S1, S2, S3, S4)
带有约束
的变量(S1+S2+S3+S4=100)
。有四个给定的常数(C1, C2, C3, C4)
。我想最大化(S1/C1 + S2/C2 + S3/C3 + S4/C4)
. 这是我在python中的代码:
#!/usr/bin/env python3
import numpy as np
from scipy.optimize import minimize
S0 = [25, 25, 25, 25]
C = [89415,8991,10944,15164]
def objective(S, C):
total = 0
for index in range(4):
total = total + S[index]/C[index]
return -total
def constraint(S):
return (100 - S[0] - S[1] - S[2] - S[3])
b = (0.0, 100.0)
boundaries = (b,b,b,b)
con = ({'type':'eq', 'fun':constraint})
solution = minimize(objective,S0,args=(C),method='SLSQP',bounds=boundaries,constraints=con)
print (solution)
我的代码只是返回 S 的初始猜测作为最终结果
fun: -0.0069931517268763755
jac: array([-1.11838453e-05, -1.11222384e-04, -9.13742697e-05, -6.59456709e-05])
message: 'Optimization terminated successfully.'
nfev: 6
nit: 1
njev: 1
status: 0
success: True
x: array([25., 25., 25., 25.])
我哪里错了?
解决方案
看起来函数输出值的差异在优化器在迭代之间停止优化函数的默认容差范围内。将您的容差设置为较小的值1e-12
有助于解决此问题:
solution = minimize(objective,S0,args=(C),method='SLSQP',bounds=boundaries,constraints=con, tol=1e-12)
结果:
fun: -0.01112223334445557
jac: array([ -1.11837871e-05, -1.11222267e-04, -9.13742697e-05,
-6.59456709e-05])
message: 'Optimization terminated successfully.'
nfev: 192
nit: 32
njev: 32
status: 0
success: True
x: array([ 0.00000000e+00, 1.00000000e+02, 3.01980663e-14,
0.00000000e+00])
这大约等于绝对最大解 [0,100,0,0]。
推荐阅读
- sql - 最小分区 by with Case When
- c++ - GDB 中的“读取变量错误:无法访问地址处的内存”
- xml - 如何在 Xamarin 中的 .xml 文件中包含 .xaml 脚本?
- windows - 为什么 Windows 随机化 PEB 和 TEB?
- google-apps-script - 使用谷歌脚本发送电子邮件
- c++ - C++ 部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- javascript - 如何从 DOM 元素和选择器的混合中创建 JQuery 容器
- python - Django 休息框架视图集 get_queryset() 不返回正确的查询集
- javascript - 从 localStorage 加载 var n 并循环 n 次
- css - 使父元素“调整大小”以等于最大子元素的宽度(响应式开关切换)