用纸浆蟒蛇求解模型

如何解决用纸浆蟒蛇求解模型

我一直在努力解决以下问题: 我将一些值存储在变量 returns 中,我想将它们乘以权重( x_vars ),以求乘积的总和并获得变量 target_return 。如下式:

$$\sum_{i=0}^{n}(returns_i\cdot x_var_i)  = target_return$$

我正在为返回的答案而苦苦挣扎,因为它说x_13 =1。但这是不正确的。我已经尝试使用常规约束和弹性来做到这一点,但我没有正确的答案。我可以容忍误差为0.01%。

有猜到吗?

谢谢

import pulp as plp
# Name model
# set variables   
target_return = 0.0204185791833761
returns = [0.025865338474480914,0.031617753987556174,0.017530329404997325,-0.0008543358059154293,0.010510143115372461,0.012048338516174262,0.04959181591738604,0.06059545751936519,0.05926623356137273,0.058971753714631814,0.03442022388647947,0.013688974565667422,0.02104075216985901,-0.0021299262578251543,0.017882182143459602,0.018964184657020766,0.005792320704504306,0.018823216764509265,-0.0015860431556348198,0.008352716776521163,0.030728674721250515,0.016529301951210496,0.0184734317514465,-0.0008822232596910062,0.010912806711330658,0.023530497410194418,0.0378090116601979,0.009456335242604919,0.005556382185357922,0.020013334218681678,0.05852489326632937,0.047988175193893645,0.016134386609760742,0.014350880108888964,0.006756782462879585]

# Initialize model
prob=plp.LpProblem("Find Weights Model",plp.LpMinimize)
x_vars=plp.LpVariable.dicts("x",range(0,len(returns)),1)
for index in range(len(returns)):
    x_vars[index].setInitialValue(0.5)

#Set problem
prob += plp.lpSum([x_vars[i] for i in x_vars]) == 1

#Set constrain
constrain=plp.LpConstraint(plp.lpSum(
    [returns[i]*x_vars[i] for i in range(0,len(returns))]),rhs=target_return)
# To use standard constrain uncomment following line
#prob.addConstraint(constrain)
# To use elastic constrain uncomment following line
elastic_constrain=constrain.makeElasticSubProblem(penalty = 500000,proportionFreeBoundList  =[0.001,0.0001])
prob.extend(elastic_constrain) 


prob.solve(plp.PULP_CBC_CMD(msg=True,warmStart=True))
final_weights={}
for v in prob.variables():
    final_weights[v.name]=v.varValue

print("Status:",plp.LpStatus[prob.status])

final_weights

可能的解决方案:

solution1 = [0.00962135141677065,0.00962135141677065,0.0277264834687149,0.0297957188693739,0.0324961558793471,0.030826881062523,0.0306009427392119,0.0250863577897657,0.0234700849350161,0.0236653284777789,0.0237085827820698,0.0273148420035226,0.0303599573647406,0.0292800893464517,0.0326835213770196,0.0297440370126145,0.0295851066643113,0.0315198597719625,0.0296058126214705,0.0326036329340179,0.0311437752841399,0.0278570759221869,0.0299427552142207,0.0296571910611703,0.0325002521378998,0.0307677356659276,0.0289143823239777,0.0268170787933395,0.0309816698637205,0.0315545156635921,0.0294310019878726,0.023774220455596,0.0253219090166822,0.0300007623180508,0.0302627332639599]

solution2 = [0.0291039150753347,0.0291039150753347,0.028739103831572,0.0296325128619877,0.0307984495156388,0.0300777243941537,0.0299801757193628,0.027599206714805,8.34695965451632E-05,0.0269856659961344,0.0270043421537945,0.0285613748092319,0.0298761263170002,0.0294098868961038,0.0308793458966854,0.0296102001652331,0.0295415791679557,0.0303769265588311,0.0295505206943934,0.0308448536374279,0.0302145485146196,0.0287954885757358,0.0296959977222549,0.0295727013961937,0.030800217918514,0.0300521885203749,0.0292519883685474,0.0283464607865791,0.0301445556616913,0.030391887092054,0.0294750434895131,0.0270326804365011,0.0277009088398652,0.0297210421051448,0.0298341506415484]

在excel中,我使用以下配置获得了解决方案:

enter image description here

解决方法

我认为您从纸浆(CBC)中获得的解决方案是正确的,只是与Excel中的解决方案不同。要确认遵守约束条件,您可以执行以下操作:

solution3 = [x.value() for x in x_vars.values()]

# objective: 0.0204185791833761
sum(val*returns[i] for i,val in enumerate(solution1))
# 0.02053629325573023
sum(val*returns[i] for i,val in enumerate(solution3))
# 0.02039816058427895

# constraint:
sum(val for i,val in enumerate(solution1))
# 0.9782431569057903
sum(val for i,val in enumerate(solution3))
# 0.999999999

实际上,纸浆的解离目标更近,并且对sum()= 1的约束要尊重得多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-