求教一下,这样一个优化问题的代价函数应当怎样写?
- ljq29优化问题为:复制代码
- 购买n个产品,
- A = diag([价格1 价格2 价格3 …… 价格n]);
- x = [购买数量1 购买数量2 购买数量3 …… 购买数量n]';
- b = [比例1 比例2 比例3 …… 比例n]';sum(b) == 1;
- 求x使得 (A*x)/sum(A*x) -> b
- 就是使得 产品1……产品n的价格之间的比例趋近于b,且sum(A*x)趋近于money
- 约束条件: money*0.9 <= sum(A*x) <= money
- x(1:n) >= 1
- x为整数
现在代价函数我是这么写的:
cost = norm((A*x)/sum(A*x) - b)
采用ga函数进行优化,结果问题是优化出的x符合约束条件,但是
1.每次优化出的x数值不一样,总是在变动
2.优化出的比例与目标比例差距过大,比如我想要的比例b是
但是优化出的比例是0.375 0.375 0.25
根本说不通啊0.2356012 0.29297685 0.47142195 - 购买n个产品,
- sundong_3GA是啥?遗传算法?那个不保证是全局最优解 iOS fly ~
- ljq29回复2#sundong_3
对,是遗传算法,但是因为情况极其有限,暴力列举其实也是可以的。用ga的原因是:1.本身代价函数不是很确定是否为凸函数;
2.只有ga可以优化变量为整数的情况,如果用matlab的MILP解算器,不知道怎么构造函数。 - ljq29回复2#sundong_3
现在整理了一下问题:非线性整数规划问题.pdf(92.15 KB)
呃,用matlab里的ga优化的程序写出来了,现在问题是不太稳定,有时候能够优化出正确的结果(大于0的限制好像无效)。
尝试使用OPTI工具箱优化,但是这个工具箱对于优化变量的数目是要事先给定的,就是说要先用 a = 'ICCC' 的形式规定每个变量是 inter 还是 continuous,对于我这种开始不知道数量的很头疼。 - sundong_3
- ljq29
- wq_xenocide你这个代价函数是可解析的,直接求导,梯度下降啊
- ljq29
- wq_xenocide
- ljq29回复9#wq_xenocide
这个代价函数应该能得出唯一解,但是问题在于梯度下降法有整数,迭代出来之后取近似?我觉得这样不太好吧。其实因为能取的点不是特别多,遍历一遍也许可以,但是因为x的数量不确定,不好写这种程序。 - ageg写错了 应该是 cost = norm(Ax/(b*sum(Ax)-1)
- ljq29回复11#ageg
cost已经用了norm函数呀,现在问题在于,fmincon函数不支持整数优化,matlab支持整数优化的函数只有ga,然而由于遗传算法的原因,容易优化出局部最优(甚至不符合约束条件)。 - bigbear3000不是用gams来弄。我们这边都是用这个。
- partager试下lingo? iOS fly ~
- ljq29
- bigbear3000都可以,excel什么的都可以做,有自己的脚本
- ljq29
- ljq29
- 林有德产品1……产品n的价格之间的比例趋近于b
b是个矩阵? - ljq29回复20#林有德
b 是一个向量,长度和优化变量一样长,和是一 iOS fly ~ - ouyuu你的两个趋近于,之间需要一个系数来权衡,之后直接用整数规划求解即可。 iOS fly ~
- ljq29回复22#ouyuu
我没有用系数平衡,而是用了平方来解决,越远的平方不是越大吗?
规划里面留了一定比例的现金,这样就解决了趋近于资金上限的问题,如果想不留现金的话,把现金的比例给设为零就可以了。 iOS fly ~ - GleeU要不用pytorch写个得了
- ljq29回复24#GleeU
用什么语言写不是问题,难在有什么现成的优化库解决问题。 iOS fly ~ - ouyuu仍然是需要系数的。除非存在一个解让比例恰好为b,总和夜等于你预设值,否则都需要在两者间平衡。
此外,我没弄错的话,你的loss函数放弃了总和为预设值这一项。x等比例变化时,loss不变,但是总和却在变化。iOS fly ~ - ljq29
- ljq29回复26#ouyuu
因为实际上买股票或者其他什么东西,不可能恰好是一个确定的总数,所以要留出一定的现金来参与计算 iOS fly ~ - ouyuu看了下pdf。你把总和趋近于设为强约束了,即总和等于一个定值M。
整数优化倒是可以用GA求解,不适合梯度下降。我认为,你需要的解不一定恰好让总和等于M,反而可能是接近M的一个数值。 iOS fly ~ - ljq29回复29#ouyuu
是的,本来是要加两个最小值,第一个是个变量占的比例趋近于设定的K,另外一个是所需的钱数总和趋近于总量M,这种优化方式要规定两最小值的权重,感觉不太好调。
这个时候,就想到另外一种有好方法,就是说钱的总量是一定的,而且买的股票总不会超过钱的总数。这样就有一个很自然的想法,我假定要留一定比例的现金,把现金的比例也放进优化参数k里面,现金的数量作为自适应调整,是整个优化变量里面唯一可以不是整数的数字。 iOS fly ~ - ouyuu
- ljq29
- 林有德感觉你有两个优化条件,可以写成w1(x-x_0)^2+w2(y-y_0)^2的形式,x和y分别是比例和总价,w1和w2是权重
然后因为是整数规划的话,直接暴力搜索也没多大计算量,而且你已经给定b了,只要在b附近搜索就相当于剪枝了 - 林有德
- GleeU你是把pytorch看成python了吧
- ljq29回复35#GleeU
是啊,看错了,那这个是一个Matlab库吗? iOS fly ~ - am99
- ljq29
- am99
- am99p = 价格向量
q = 待求数量向量
b = 每类总价比例向量,合计为1
m = 总预算
有两个度量指标
1,与浮点最优解的欧式距离(在金额上)
d1=(sum((p*q-b*m)**2)**0.5,q>0
2,与总价超平面(如果三个股票,ax+by+cz=m,则是一个平面)的点面距离
d2=m-sum(p*q), 0<sum(p*q)<=m
我觉得梯度下降d1+d2就可以得到你的答案啦,或者仅使用d1带上两条约束应该也可以
其实我理解这个问题的简化到,n维空间里:
1,比例关系确定了一条线
2,总价关系确定了一个n维中的n-1超平面
3,浮点解就是求相交
4,使用距离构建代价查找浮点解附近的代价最小的整数解
——数学不太好半路出家的爱好者提供一下思路 - am99
- ljq29