一道离散最优化算法问题,诚心请教各位(来者有分^_^)

xxbppy 2005-03-09 02:40:15
一个商人有一定数量的钱,准备投资购买N种商品,对每种商品有M种投资方案,方案是给出的(主要来源于历史经验和个人评估),问商人怎样投资可以获得最大收益

举例:商人有5000元钱,现在有3种商品可以投资购买,具体方案如下表:

商品一 商品二 商品三
投资|收益 投资|收益 投资|收益
方案一:0 | 0 0 | 0 0 | 0
方案二:1000|2000 1000|1500 1000|1800
方案三:2000|5000 2000|3500 2000|4100
方案四:NA |NA 3000|5500 NA |NA

当商品数和方案数较少的时候,很容易通过穷举得出结果,如上例最佳方案为(3,2,3)就是对三种商品分别采取购买方案3,2,3,总投资5000,总收益10600。
请问求当N较大时的最优化算法?(小弟实际中遇到的问题,诚心请教)
...全文
249 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongxve 2005-03-11
  • 打赏
  • 举报
回复
仔细一想
上面这种方法还是错误的,
不知道怎么晕了头,
胡说八道起来。

我的关于动态规划法的建议都是错误的,
还请各位明鉴.
hongxve 2005-03-11
  • 打赏
  • 举报
回复
[:统一缩小100倍] 是不通用的,

[求f[i]的时候仅仅需要知道 f[i-1]] 倒是可以做到
如果按这样做,对先前定义的M[][]和L[][]也可以进行压缩,具体如下:

针对楼主的例子,
定义矩阵M[1][3][2],
M[0][i][0]表示,按从左到右的先后顺序,
处理到当前的物品,
选取第i种方案时,
获得的最大收益,
而相应的M[0][i][1]则表示耗费的资金,

定义List *N[1][3],
存储当M[0][i][]计算出来时,相应的前i种物品的选取策略顺序表,
以便取得所需要的结果。

上述的M[1][3][2]和N[1][3],
最终可改成M[3][2]和N[3]
pcboyxhy 2005-03-10
  • 打赏
  • 举报
回复
注意到投资都是100的倍数,
统一缩小100倍就可以了。

况且 3*5000也不是很大啊 才15k个数据而已。

动态规划的状态是可以压缩的。

最简单的压缩方法:
求f[i]的时候仅仅需要知道 f[i-1]

可以使用滚动数组。

hongxve 2005-03-10
  • 打赏
  • 举报
回复
针对楼主的例子,
定义矩阵M[4][3],
M[i][j]表示进行到第i种物品,并对其选择j方案时,
不超过原始资金限制的情况下,能够取得的最大收益。
同时,
定义List *N[4][3],
存储当M[i][j]计算出来时,相应的前i种物品的选取策略顺序表,
以便取得所需要的结果。
hongxve 2005-03-10
  • 打赏
  • 举报
回复
动态规划是可以解决,
但如果使用像f[i][j]表示投资j元到i种商品的存储方式,
在实用上存在问题,
如果像楼主给出的例子,
则需要[3][5000]的存储空间
xxbppy 2005-03-09
  • 打赏
  • 举报
回复
动态规划可以解决,不知道这个问题可以用模拟退火算法,或者遗传算法、神经网络来解决吗?
pcboyxhy 2005-03-09
  • 打赏
  • 举报
回复
动态规划,
前i种商品投资j元获利的最大值表示为 f[i][j]
w[i][j]表示商品i投资j元的获利。

状态转移方程是:
f[i][j]=max{ f[i-1][j], f[i-1][k]+w[i][j-k] (k<=j && k>=0) }
hongxve 2005-03-09
  • 打赏
  • 举报
回复
可以用整数0-1规划来做:

注:以下sum为求和运算

令物品i选择第j种方案为Vij( Vij=0或1, sum(Vij)=1, j=1,2,...,M, i=1,2,...N)
其相应付出为Wij(为i物品选择j方案时的权值)
其相应获得为Gij(为i物品选择j方案时的收益)
则满足约束 sum(sum(Wij*Vij))<=商人有的钱
目标函数 为sum(sum(Gij*Vij))
liujingfu123 2005-03-09
  • 打赏
  • 举报
回复
ding
zhousqy 2005-03-09
  • 打赏
  • 举报
回复
背包类型的问题,可以用贪心法和动态规划
Flood1984 2005-03-09
  • 打赏
  • 举报
回复
背包问题是0-1问题,选与不选,
那你可以将M种选法转化一下,
对每件商品,
依次选第1-M
SnakeYangNan 2005-03-09
  • 打赏
  • 举报
回复
背包类型的问题,可以用贪心法和动态规划
dongpy 2005-03-09
  • 打赏
  • 举报
回复
搜一下以前的帖子
Dong 2005-03-09
  • 打赏
  • 举报
回复
回复人: Flood1984(峰子)(时刻准备投身革命) ( ) 信誉:107 2005-03-09 14:47:00 得分: 0


你搜索一下背包问题的解法看看
-----------------------------------------------
顶,本来就是这样的!
我也写过两个这样的程序,你在这里搜索或查找可以找到你需要的
xxbppy 2005-03-09
  • 打赏
  • 举报
回复
可惜这和0-1背包问题不同,背包问题中对于每个物体只有两种选择,装和不装,而这个问题对于每种商品有M种方案
hofer_song 2005-03-09
  • 打赏
  • 举报
回复
沙发,帮顶
Flood1984 2005-03-09
  • 打赏
  • 举报
回复
你搜索一下背包问题的解法看看

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧