投资问题的算法实现

编程入门 行业动态 更新时间:2024-10-06 20:31:18

投资问题的<a href=https://www.elefans.com/category/jswz/34/1770096.html style=算法实现"/>

投资问题的算法实现

投资问题的算法实现

    • 问题描述
    • 实例
    • 问题建模
    • 算法
      • 暴力求解
        • 算法思想
        • 代码
      • 动态规划
        • 算法思想
        • 代码
      • 输出
      • 总结

问题描述

m元钱,投资 n 个项目。效益函数 fi (x) 表示第 i 个项目投 x 元的效益( i =1, 2, …, n)。求如何分配每个项目的钱数使得总效益最大?

实例

5 万元,投资给 4 个项目,效益函数:

问题建模

输入:项目总数x;投资金额y;效益函数fi(k)
输出:最大利润maxProfit

算法

暴力求解

算法思想

对所有项目进行循环,通过限定条件:总投资金额=y,得到所有符合的答案,从中选取最大值,即为所求。

代码

使用C++语言实现:

#include<iostream>
using namespace std;//投资问题的暴力解法
int main(){int profitMatrix[4][6]={0,11,12,13,14,15,   //收益矩阵0,0,5,10,15,20,0,2,10,30,32,40,0,20,21,22,23,24};int x1,x2,x3,x4,x;int sum=0,maxProfit=0;int a[4]={0}; //输出最优向量for(x1=0;x1<6;x1++){for(x2=0;x2<6;x2++){for(x3=0;x3<6;x3++){for(x4=0;x4<6;x4++){x=x1+x2+x3+x4;if(x==5){ //限定条件,投资5万元sum=profitMatrix[0][x1]+profitMatrix[1][x2]+profitMatrix[2][x3]+profitMatrix[3][x4];if(sum>maxProfit){maxProfit=sum;a[0]=x1;a[1]=x2;a[2]=x3;a[3]=x4;}}}}}}cout<<"最大利润为:"<<maxProfit<<endl;cout<<"最优投资方案为:( ";for(int i=0;i<4;i++){cout<<a[i]<<" ";}cout<<")";
}

使用Python语言实现:

if __name__ == '__main__':profitMatrix=[[0,11,12,13,14,15],[0,0,5,10,15,20],[0,2,10,30,32,40],[0,20,21,22,23,24]]a=[0,0,0,0] #存放最优投资方案maxProfit=0sumMoney=0for x1 in range(6):for x2 in range(6):for x3 in range(6):for x4 in range(6):x=x1+x2+x3+x4if x==5:sumMoney=profitMatrix[0][x1]+profitMatrix[1][x2]+profitMatrix[2][x3]+profitMatrix[3][x4]if sumMoney>maxProfit:maxProfit=sumMoneya[0]=x1a[1]=x2a[2]=x3a[3]=x4print("最大利润为:"+str(maxProfit))print("最优投资方案为:"+str(a))

动态规划

算法思想

假设第x个项目投资m万元,则将x个项目的y万元投资问题分解为前x-1个项目投资y-m万元和第x个项目投资m万元。这样就可以将问题规模减小,直至仅有一个项目,此时的最佳投资方案就是其本身。
令outspace[x][y]表示前x个项目投资y万元得到的最大利润,令
profitMatrix[i][m]=fi(m),则动态方程为:
outspace[x][y]=profitMatrix[x][m]+outspace[x-1][y-m]
限定边界为outspace[0][k]=profitMatrix[0][k]

代码

使用C++语言实现:

#include<iostream>
using namespace std;int getProfit(int outspace[4][6],int profitMatrix[4][6],int maxProfit){for(int i=0;i<=5;i++){//当仅有一个项目时,此项目的收益即为最优,分开赋值是为了避免下面出现 -1 行outspace[0][i]=profitMatrix[0][i];}for(int i=1;i<4;i++){ //逐次加入第2,3,4个项目for(int j=0;j<=5;j++){//投资金额for(int m=0;m<=j;m++){//m代表最后一个项目投资金额if(outspace[i][j]<profitMatrix[i][m]+outspace[i-1][j-m]){outspace[i][j]=profitMatrix[i][m]+outspace[i-1][j-m];if(outspace[i][j]>maxProfit)maxProfit=outspace[i][j];}}}}return maxProfit;
}
int main()
{int maxProfit = 0;int outspace[4][6]={0};//初始化最大利润矩阵int profitMatrix[4][6]={0,11,12,13,14,15,   //收益矩阵0,0,5,10,15,20,0,2,10,30,32,40,0,20,21,22,23,24};int a=getProfit(outspace,profitMatrix,maxProfit);cout<<"最大收益为:"<<a<<endl;return 0;
}

使用Python语言实现:

def getProfit(profitMatrix,outspace,maxProfit):for i in range(6):outspace[0][i]=profitMatrix[0][i]for i in range(1,4):for j in range(6):for m in range(j+1):if outspace[i][j]<profitMatrix[i][m]+outspace[i-1][j-m]:outspace[i][j]=profitMatrix[i][m]+outspace[i-1][j-m]if maxProfit<outspace[i][j]:maxProfit=outspace[i][j]return maxProfitif __name__ =='__main__':profitMatrix=[[0,11,12,13,14,15],[0,0,5,10,15,20],[0,2,10,30,32,40],[0,20,21,22,23,24]]outspace=[]for i in range(4):outspace.append([])for j in range(6):outspace[i].append(0)maxProfit=0a=getProfit(profitMatrix,outspace,maxProfit)print("最大利润为:"+str(a))

输出

总结

令m为投资金额,n为项目数
则投资问题的暴力算法时间复杂度为O(mn) 空间复杂度为O(mn)
动态规划算法时间复杂度为O(nm2) 空间复杂度为O(mn)

更多推荐

投资问题的算法实现

本文发布于:2024-02-07 06:07:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1754457.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:算法

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!