lingo入門——河北省第三屆研究生建模競賽B題

2020-08-12 16:29:07

一、題幹

1.1 題目

投資建模(河北省第三屆研究生建模競賽B題)
        從2021年年初開始到2050年前,未來教育基金會(FFE)向M國部分高等院校捐助一筆經費以幫助貧困學生,將現有的8000萬美元資金進行債務投資。
相關投資要求:

  1. 醫藥健康債券購買金額不能少於購買總金額的20%,交通運輸、科技研發、裝備製造以及國民福利的債券購買金額不能少於購買總金額的10%。
  2. 所購買債券的平均風險等級不得低於2.5,等級數位越大,風險越低。
  3. 所購買的債券的平均到期年限不超過10年。
  4. 要求捐助活動結束後FFE繼續保留8000萬美元資金。

        如上所示爲各個基金的一些資訊,值得注意的是,其對風險等級的約束很小,而收益率又定義爲固定值,所以這個模型相對實際問題已經做了很大的簡化。

1.2 問題

  • 若 SEB 債券投資只允許在第一年初進行,分配8000萬美元使收益最大。
  • 假定可以進行重複投資,使得 2050 年末的一次性捐款金額達到最大。
  • FFE 改變捐助方式,計劃從 2021 開始,在未來 30 年內每年年初捐助一筆每年金額固定的經費。允許重複投資。使得每年捐助的金額達到最大。
  • FFE 爲了幫助疫情防控,決定在每年捐助給高校的金額儘量不低於第 3 問 的金額的前提下,投資儘量向醫藥健康和科技研發上傾斜。原則上規定:醫藥健康的投資額,儘量與科技研發相等,儘量是交通運輸的 1.2 倍,儘量是裝備製造 的 1.5 倍,儘量是國民福利的 2 倍。允許重複投資。
    在这里插入图片描述

二、模型的建立

        第一問沒啥寫的價值,直接寫第二、三、四問。

2.1 符號

符號 意義
money_inimoney\_in_i ii年在收入狀態後的總資金
money_outimoney\_out_i ii年在支出狀態後的總資金
xi,jx_{i,j} ii年對第jj個債券的購買量
aia_i ii個產品在一輪週期後的利潤率
bib_i ii個產品一輪週期時常
cic_i ii個產品增值稅率
did_i ii個產品風險等級
pp 每年的捐款數量

2.2、思路

2.2.1、思路1

        觀察這道題目在投資時的資金流轉過程,可以發現它每年都有這麼兩組操作:

  • 繼承一年剩下的資產、獲取前幾年投資所帶來的利潤
  • 進行各類債券進行投資、對外捐贈(第三問)

        所以我們可以考慮對該問約束時進行狀態分離,即先進行moneyinimoneyin_i操作,再進行moneyoutimoneyout_i操作。其間的等量關係大致如下,其他的具體情況在正式做的時候再具體討論:
money_ini=money_outi1+j=115[xibi,j+xibi,jai(1ci)]money_ini=money_outi+p+j=115xi,j money\_in_i=money\_out_{i-1}+\sum_{j=1}^{15}{[x_{i-b_i,j}+x_{i-b_i,j}a_i(1-c_i)]}\\ money\_in_i=money\_out_i+p+\sum_{j=1}^{15}{x_{i,j}}

2.2.2、思路2

        首先根據一個很明顯的構想:如果你當下有錢,且時間足夠充裕到你得到收益,那麼你必然會去拿這筆錢去投資。甭管投啥,反正會投(而投啥其實就是我們要去求解的內容)。因爲如果你今年不投,今後再投的話,在收益上除了時間線的後移外沒有任何變化。所以這裏本質上是一個帶約束的貪心問題。
        我們可以粗略的建立一個等量關係,其他的具體情況在正式做的時候再具體討論:
j=115xi,j=j=115[xibi,j+xibi,jai(1ci)] \sum_{j=1}^{15}{x_{i,j}}=\sum_{j=1}^{15}{[x_{i-b_i,j}+x_{i-b_i,j}a_i(1-c_i)]}

2.3 確定等量關係

        思考了上面兩個思路後,發現他們本身其實是並不衝突的,但問題在於以上的貪婪演算法並沒有考慮留每天的捐款的情況。只是表現的形式不一樣。所以可以將他們結合起來,建立如下等量關係。
{money_ini=money_outi1+j=115[xibi,j+xibi,jai(1ci)]money_ini=money_outi+p+j=115xi,j \begin{cases} money\_in_i=money\_out_{i-1}+\sum\limits_{j=1}^{15}{[x_{i-b_i,j}+x_{i-b_i,j}a_i(1-c_i)]}\\ money\_in_i=money\_out_i+p+\sum\limits_{j=1}^{15}{x_{i,j}}\\ % p+\sum\limits_{j=1}^{15}{x_{i,j}}=\sum\limits_{j=1}^{15}{[x_{i-b_i,j}+x_{i-b_i,j}a_i(1-c_i)]} \end{cases}
        然後基於我們對於題目的分析與各類情況的思考,可以得到以下幾點:

  • 當剩餘天數少於該債券週期的話,那麼必然不買這個債券。
  • 因爲債券最小週期爲2天,且採用貪心策略,所以前兩天必定是全部花費。(在第三問及第四問中,應留下用於每天捐贈的錢)
  • 因爲是貪心策略,所以money_outimoney\_out_i只有在最後一天不爲0(該特性爲第二問獨有,第三問與第四問需考慮給捐款存錢的情況)

將其轉化爲符號語言即爲:
{j=115i=31bj30xi,j=0j=115x1,j+x2,j=2p \begin{cases} \sum\limits_{j=1}^{15}{\sum\limits_{i=31-b_j}^{30}{x_{i,j}}}=0\\ \sum\limits_{j=1}^{15}{x_{1,j}+x_{2,j}}=2p \end{cases}

2.4、明確約束

        首先根據常識,可以得到如下幾條約束:
{xi,j>=0p>=0money_ini>=money_outi>=0 \begin{cases} x_{i,j}>=0\\ p>=0\\ money\_in_i>=money\_out_i>=0 \end{cases}
        然後根據那四條投資要求,可得出以下四個約束:
{j=115(bji=130xi,j)10j=115i=130xi,jj=115(dji=130xi,j)2.5j=115i=130xi,ji=130(xi,1+xi,2+xi,3)>0.2j=115i=130xi,ji=130(xi,3k+xi,3k1+xk,3j2)>0.1j=115i=130xi,j(k{2,3,4,5}) \begin{cases} \sum\limits_{j=1}^{15}{(b_j\sum\limits_{i=1}^{30}{x_{i,j}})}≤10\sum\limits_{j=1}^{15}{\sum\limits_{i=1}^{30}{x_{i,j}}}\\ \sum\limits_{j=1}^{15}{(d_j\sum\limits_{i=1}^{30}{x_{i,j}})}≥2.5\sum\limits_{j=1}^{15}{\sum\limits_{i=1}^{30}{x_{i,j}}}\\ \sum\limits_{i=1}^{30}(x_{i,1}+x_{i,2}+x_{i,3})>0.2\sum\limits_{j=1}^{15}{\sum\limits_{i=1}^{30}{x_{i,j}}}\\ \sum\limits_{i=1}^{30}(x_{i,3k}+x_{i,3k-1}+x_{k,3j-2})>0.1\sum\limits_{j=1}^{15}{\sum\limits_{i=1}^{30}{x_{i,j}}},(k\in\{2,3,4,5\}) \end{cases}
        暫時想到這些。

三、編寫程式

3.1、第二問

3.2、第三問

3.3、第四問

四、總結