求教一下,这样一个优化问题的代价函数应当怎样写?

  • l
    ljq29
    优化问题为:

    1. 购买n个产品,
    2. A = diag([价格1 价格2 价格3 …… 价格n]);
    3. x = [购买数量1 购买数量2 购买数量3 …… 购买数量n]';
    4. b = [比例1 比例2 比例3 …… 比例n]';sum(b) == 1;
    5. 求x使得 (A*x)/sum(A*x) -> b
    6. 就是使得 产品1……产品n的价格之间的比例趋近于b,且sum(A*x)趋近于money
    7. 约束条件: money*0.9 <= sum(A*x) <= money
    8. x(1:n) >= 1
    9. 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
    根本说不通啊
  • s
    sundong_3
    GA是啥?遗传算法?那个不保证是全局最优解 iOS fly ~
  • l
    ljq29
    回复2#sundong_3


    对,是遗传算法,但是因为情况极其有限,暴力列举其实也是可以的。用ga的原因是:1.本身代价函数不是很确定是否为凸函数;
    2.只有ga可以优化变量为整数的情况,如果用matlab的MILP解算器,不知道怎么构造函数。
  • l
    ljq29
    回复2#sundong_3


    现在整理了一下问题:非线性整数规划问题.pdf(92.15 KB)
    呃,用matlab里的ga优化的程序写出来了,现在问题是不太稳定,有时候能够优化出正确的结果(大于0的限制好像无效)。

    尝试使用OPTI工具箱优化,但是这个工具箱对于优化变量的数目是要事先给定的,就是说要先用 a = 'ICCC' 的形式规定每个变量是 inter 还是 continuous,对于我这种开始不知道数量的很头疼。
  • s
    sundong_3
    回复4#ljq29
    老哥你这是纯整数规划吧,只有购买数量是自变量,数量不是固定的吗?

    还有你这问的不是地方,可以去我爱matlab论坛看看 iOS fly ~
  • l
    ljq29
    回复5#sundong_3


    其实就是买的etf,在再平衡过程中想要用算法得出精确的仓位。
  • w
    wq_xenocide
    你这个代价函数是可解析的,直接求导,梯度下降啊
  • l
    ljq29
    回复7#wq_xenocide


    但是,这个x需要整数(其实是动的话得100股一下)
  • w
    wq_xenocide
    回复8#ljq29

    整数什么关系,取近似,还有迭代优化就是这个用的。还有,你这个肯定不是全局唯一最优解的,要么随机起点,要么代价函数再加上一些惩罚项
  • l
    ljq29
    回复9#wq_xenocide


    这个代价函数应该能得出唯一解,但是问题在于梯度下降法有整数,迭代出来之后取近似?我觉得这样不太好吧。其实因为能取的点不是特别多,遍历一遍也许可以,但是因为x的数量不确定,不好写这种程序。
  • a
    ageg
    写错了 应该是 cost = norm(Ax/(b*sum(Ax)-1)
  • l
    ljq29
    回复11#ageg


    cost已经用了norm函数呀,现在问题在于,fmincon函数不支持整数优化,matlab支持整数优化的函数只有ga,然而由于遗传算法的原因,容易优化出局部最优(甚至不符合约束条件)。
  • b
    bigbear3000
    不是用gams来弄。我们这边都是用这个。
  • p
    partager
    试下lingo? iOS fly ~
  • l
    ljq29
    回复13#bigbear3000


    这是个软件啊,能写出来外部调用的脚本吗?
  • b
    bigbear3000
    都可以,excel什么的都可以做,有自己的脚本
  • p
    partager
    试了两种损失函数,班门弄斧,供参考




    iOS fly ~
  • l
    ljq29
    回复17#partager


    用lingo写的啊,之前没用过,学习一下。但是matlab就没办法解决这样的问题吗?现在用ga(遗传算法)只能偶尔得到正确的解。
  • l
    ljq29
    回复17#partager


    对于这个优化(我留了一定比例的现金,方便优化):


    我写了这样的lingo程序:




    优化结果和ga优化对的情况时一样。
  • 林有德
    产品1……产品n的价格之间的比例趋近于b
    b是个矩阵?
  • l
    ljq29
    回复20#林有德
    b 是一个向量,长度和优化变量一样长,和是一 iOS fly ~
  • o
    ouyuu
    你的两个趋近于,之间需要一个系数来权衡,之后直接用整数规划求解即可。 iOS fly ~
  • l
    ljq29
    回复22#ouyuu
    我没有用系数平衡,而是用了平方来解决,越远的平方不是越大吗?
    规划里面留了一定比例的现金,这样就解决了趋近于资金上限的问题,如果想不留现金的话,把现金的比例给设为零就可以了。 iOS fly ~
  • G
    GleeU
    要不用pytorch写个得了
  • l
    ljq29
    回复24#GleeU
    用什么语言写不是问题,难在有什么现成的优化库解决问题。 iOS fly ~
  • o
    ouyuu
    仍然是需要系数的。除非存在一个解让比例恰好为b,总和夜等于你预设值,否则都需要在两者间平衡。

    此外,我没弄错的话,你的loss函数放弃了总和为预设值这一项。x等比例变化时,loss不变,但是总和却在变化。iOS fly ~
  • l
    ljq29
    回复26#ouyuu
    可能主楼没有表示清楚,我在四楼放了一个PDF你可以看一下。

    代价函数是,x1占总数的比例除以k1,再做平方,直到xn都这样操作再求和。
    没有问题吧 iOS fly ~
  • l
    ljq29
    回复26#ouyuu
    因为实际上买股票或者其他什么东西,不可能恰好是一个确定的总数,所以要留出一定的现金来参与计算 iOS fly ~
  • o
    ouyuu
    看了下pdf。你把总和趋近于设为强约束了,即总和等于一个定值M。

    整数优化倒是可以用GA求解,不适合梯度下降。我认为,你需要的解不一定恰好让总和等于M,反而可能是接近M的一个数值。 iOS fly ~
  • l
    ljq29
    回复29#ouyuu
    是的,本来是要加两个最小值,第一个是个变量占的比例趋近于设定的K,另外一个是所需的钱数总和趋近于总量M,这种优化方式要规定两最小值的权重,感觉不太好调。

    这个时候,就想到另外一种有好方法,就是说钱的总量是一定的,而且买的股票总不会超过钱的总数。这样就有一个很自然的想法,我假定要留一定比例的现金,把现金的比例也放进优化参数k里面,现金的数量作为自适应调整,是整个优化变量里面唯一可以不是整数的数字。 iOS fly ~
  • o
    ouyuu
    回复30#ljq29
    整数规划的值可能在M变化时有较大变化,不妨试试不同M值的影响。

    此外,整数规划的求解器比GA快很多。 iOS fly ~
  • l
    ljq29
    回复31#ouyuu
    matlab确实自带整数规划器,但问题在于我构造不出来要求的fx的形式,毕竟你看我的cost函数里面比较复杂iOS fly ~
  • 林有德
    感觉你有两个优化条件,可以写成w1(x-x_0)^2+w2(y-y_0)^2的形式,x和y分别是比例和总价,w1和w2是权重
    然后因为是整数规划的话,直接暴力搜索也没多大计算量,而且你已经给定b了,只要在b附近搜索就相当于剪枝了
  • 林有德
    回复25#ljq29


    MIPS的话试试Gurobi?不追求速度的话可以用开源的库(CPLEX之类的?)
  • G
    GleeU
    你是把pytorch看成python了吧
  • l
    ljq29
    回复35#GleeU
    是啊,看错了,那这个是一个Matlab库吗? iOS fly ~
  • a
    am99
    回复1#ljq29


    我想到了一个手算办法,你给个样本数据我试一下
  • l
    ljq29
    回复37#am99



    19楼就有一个例子,但是手算,,,股票多起来之后该怎么算呢?
  • a
    am99
    回复38#ljq29


    有了手算逻辑就可以写程序 啊,其实这里的“手算”是我笔误,相对于机器学习而言的
  • a
    am99
    p = 价格向量
    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,使用距离构建代价查找浮点解附近的代价最小的整数解


    ——数学不太好半路出家的爱好者提供一下思路
  • a
    am99
    回复38#ljq29


    解决没,看一下我的回复
  • l
    ljq29
    回复41#am99


    太难了liao,没看懂