- 在线时间
- 4 小时
- 最后登录
- 2019-6-13
- 注册时间
- 2019-5-12
- 听众数
- 2
- 收听数
- 0
- 能力
- 0 分
- 体力
- 11 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 5
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 3
- 主题
- 1
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级 0% 该用户从未签到
|
本人是建模和lingo新手,最近遇到一个最优化问题,可能建模不合理,导致变量太多,用lingo11跑了一天一夜都没有算出结果,求各位达人帮忙指点一下,谢谢!
问题如下:
有一笔资金M,可以存到4家银行,这4家银行提供的定存利率(年化利率)都不相同,利率跟金额和存期有关系,附件提供一个例子。
约束条件:1. 平均存期不超过N,例如100元存30天,200元存60天,那平均存期就是(100*30+200*60)/300.
2. 存到各个银行的比例不超过25%。
本人自己建模是这样的:
设第i个银行第i种定存产品的金额为x1i,存期为y1i,存款利率为f(x1i,y1i)
将4家银行的定存产品拆分开来,例如
f(x11,y11)=2%, if x11∈(0, 100),y11∈(0, 30)
f(x12,y12)=3%, if x12∈[100, 200),y12∈(0, 30)
f(x13,y13)=4%, if x13∈[200, 无穷),y13∈(0, 30)
...
目标函数: max z=f(x1i, y1i) * x1i + f(x2i, y2i) * x2i + f(x3i, y3i) * x3i + f(x4i, y4i) * x4i
约束条件:
∑x1i +∑x2i +∑x3i+∑x4i <= M
∑x1i <= 25%M
∑x2i <= 25%M
∑x3i <= 25%M
∑x4i <= 25%M
∑(x1i*y1i) + ∑(x2i*y2i) + ∑(x3i*y3i) + ∑(x4i*y4i) <= N
x和y同时等于0或同时不等于0
lingo11 代码如下:
max = 0 + x_ICB1M * @if(y_ICB1M#EQ#0, 0, @if(y_ICB1M#LT#30, 0, @if(y_ICB1M#GE#60, 0, @if(x_ICB1M#GE#0, 0.017584, 0))))+
x_ICB1W * @if(y_ICB1W#EQ#0, 0, @if(y_ICB1W#LT#7, 0, @if(y_ICB1W#GE#14, 0, @if(x_ICB1W#GE#0, 0.0168643, 0))))+
x_ICB2M * @if(y_ICB2M#EQ#0, 0, @if(y_ICB2M#LT#60, 0, @if(x_ICB2M#GE#0, 0.0177393, 0)))+
x_ICB2W * @if(y_ICB2W#EQ#0, 0, @if(y_ICB2W#LT#14, 0, @if(y_ICB2W#GE#30, 0, @if(x_ICB2W#GE#0, 0.0175857, 0))))+
x_ICBON * @if(y_ICBON#EQ#0, 0, @if(y_ICBON#NE#1, 0, @if(x_ICBON#GE#0, 0.001625, 0)))+
x_SCB1M * @if(y_SCB1M#EQ#0, 0, @if(y_SCB1M#LT#30, 0, @if(y_SCB1M#GE#60, 0, @if(x_SCB1M#GE#0, 0.014, 0))))+
x_SCB1W * @if(y_SCB1W#EQ#0, 0, @if(y_SCB1W#LT#7, 0, @if(y_SCB1W#GE#14, 0, @if(x_SCB1W#GE#0, 0.007, 0))))+
x_SCB2M * @if(y_SCB2M#EQ#0, 0, @if(y_SCB2M#LT#60, 0, @if(x_SCB2M#GE#0, 0.016, 0)))+
x_SCB2W * @if(y_SCB2W#EQ#0, 0, @if(y_SCB2W#LT#14, 0, @if(y_SCB2W#GE#30, 0, @if(x_SCB2W#GE#0, 0.008, 0))))+
x_SCBON * @if(y_SCBON#EQ#0, 0, @if(y_SCBON#NE#1, 0, @if(x_SCBON#GE#0, 0.005, 0)));
100000000 >= 0 + x_ICB1M+ x_ICB1W+ x_ICB2M+ x_ICB2W+ x_ICBON+ x_SCB1M+ x_SCB1W+ x_SCB2M+ x_SCB2W+ x_SCBON;
4000000000 >= 0 + x_ICB1M * y_ICB1M+ x_ICB1W * y_ICB1W+ x_ICB2M * y_ICB2M+ x_ICB2W * y_ICB2W+ x_ICBON * y_ICBON+ x_SCB1M * y_SCB1M+
x_SCB1W * y_SCB1W+ x_SCB2M * y_SCB2M+ x_SCB2W * y_SCB2W+ x_SCBON * y_SCBON;
60000000.0 >= 0 + x_ICB1M+ x_ICB1W+ x_ICB2M+ x_ICB2W+ x_ICBON;
40000000.0 >= 0 + x_SCB1M+ x_SCB1W+ x_SCB2M+ x_SCB2W+ x_SCBON;
y_ICB1M = @if(x_ICB1M#EQ#0, 0, y_ICB1M);x_ICB1M = @if(y_ICB1M#EQ#0, 0, x_ICB1M);
y_ICB1W = @if(x_ICB1W#EQ#0, 0, y_ICB1W);x_ICB1W = @if(y_ICB1W#EQ#0, 0, x_ICB1W);
y_ICB2M = @if(x_ICB2M#EQ#0, 0, y_ICB2M);x_ICB2M = @if(y_ICB2M#EQ#0, 0, x_ICB2M);
y_ICB2W = @if(x_ICB2W#EQ#0, 0, y_ICB2W);x_ICB2W = @if(y_ICB2W#EQ#0, 0, x_ICB2W);
y_ICBON = @if(x_ICBON#EQ#0, 0, y_ICBON);x_ICBON = @if(y_ICBON#EQ#0, 0, x_ICBON);
y_SCB1M = @if(x_SCB1M#EQ#0, 0, y_SCB1M);x_SCB1M = @if(y_SCB1M#EQ#0, 0, x_SCB1M);
y_SCB1W = @if(x_SCB1W#EQ#0, 0, y_SCB1W);x_SCB1W = @if(y_SCB1W#EQ#0, 0, x_SCB1W);
y_SCB2M = @if(x_SCB2M#EQ#0, 0, y_SCB2M);x_SCB2M = @if(y_SCB2M#EQ#0, 0, x_SCB2M);
y_SCB2W = @if(x_SCB2W#EQ#0, 0, y_SCB2W);x_SCB2W = @if(y_SCB2W#EQ#0, 0, x_SCB2W);
y_SCBON = @if(x_SCBON#EQ#0, 0, y_SCBON);x_SCBON = @if(y_SCBON#EQ#0, 0, x_SCBON);
|
-
银行利率示例
zan
|