如何跟踪一个列表中元素排序后的索引?

Ps1,Ps2,Ps3,Ps4,Ps5和F是给定的值。我需要找到a,b,c,d和e的值,使这个等式的结果最大化。

60 + a (Ps1-F) + b (Ps2-F) + c (Ps3-F) + d (Ps4-F) + e (Ps5-F) = 0。

约束条件是:a、b、c、d、e之和永远不能小于20,且每个元素只能是0或10。

这就是我目前所做的。

a = 0
b = 0
c = 0
d = 0
e = 0

values = [a, b, c, d, e]


def roll_over(f, p1, p2, p3, p4, p5):
    counter = 0
    constants = [p1 - f, p2 - f, p3 - f, p4 - f, p5 - f]

    for i in constants:
        if i >= 0:
            values[counter] = 10
        else:
            values[counter] = 0
        counter = counter + 1

在这之后,我需要处理列表常量中只有负值的情况(因此上面的代码只给我0的列表值)。理想的策略是取列表常量中最大的两个元素(即使是负值),并将数字10赋给列表值中指数相同的两个元素,同时将其他元素保留为0。

但是,我卡在了那里,因为如果我通过不断地对列表进行排序,发现例如Ps4-F和Ps2-F是两个最大的数字,我就找不到办法回到它们在值中对应的元素(分别是d和b)。

谢谢您!请问您是如何解决这个问题的?

解决方案:

鉴于你只有5个变量,每个变量有2个可能的值,因此只有32种可能的组合,你可以用蛮力的方法来处理这个问题,检查每一个有效的组合,得到结果最大的那个。

def fn(a,b,c,d,e):
    Ps1,Ps2,Ps3,Ps4,Ps5,F = 1.5, 2.3, 1.0, 0.8, 4.9, 1.9 # your given values
    return 60 + a*(Ps1-F) + b*(Ps2-F) + c*(Ps3-F) + d*(Ps4-F) + e*(Ps5-F)


from itertools import product

candidates = (values for values in product(*[(0,10)]*5) if sum(values)>=20)
a,b,c,d,e  = max( candidates, key=lambda values:fn(*values))

输出。

print(a,b,c,d,e, "=", fn(a,b,c,d,e))
# 0 10 0 0 10 = 94.4

给TA打赏
共{{data.count}}人
人已打赏
未分类

通过列表值获取字典键

2022-9-8 3:29:33

未分类

使用react-admin从API响应的数据中下载文件。

2022-9-8 3:40:36

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索