我正在尝试为数组找到最低预期成本的最佳顺序。
输入是:
input = [[390, 185, 624], [686, 351, 947], [276, 1023, 1024], [199, 148, 250]]
这是一个包含四个选项的数组,第一个数字是成本,第二个数字是获得结果的概率,第一个([i][1]
)是分子,第二个是{{1 }}是分母。
目标是找到这些价值/概率对的最佳顺序,以最低的总成本提供结果。
[i][2]
运行:
def answer(input):
from itertools import permutations
length = len(input)
best_total = 999
for combination in permutations(input):
# print combination
total = 0.0
for i in range(0, length):
current_value = 1.0
for j in range(0, i):
current_value = current_value * (1.0 - \
(float(combination[j][1]) / float(combination[j][2])))
total = total + (float(combination[i][0]) * current_value)
if total > best_total:
i = length
# print total
if total <= best_total:
best_total = total
best_combination = combination
answer = map(input.index, best_combination)
return answer
应该返回
print answer(input)
用于给定的输入。
这显然是一次详尽的搜索,只要有四个以上的选择就会很快变得很慢。我已经考虑过二叉搜索树,因为它们的输入非常相似,但我无法弄清楚如何实现它。
我已经为此工作了四天,似乎无法提出适用于任何输入的快速版本(假设成本和概率都是正确的)。
这不是作业或其他任何东西,只是我一直想弄清楚的谜题。
答案 0 :(得分:1)
我将确定原始数组中每个案例的值,存储这些值,然后对列表进行排序。这是在python 3中,所以我不知道这是否会影响你。
确定原始数组中每个案例的值并存储它们:
inputA = [[390, 185, 624], [686, 351, 947], [276, 1023, 1024], [199, 148, 250]]
results = []
for idx,val in enumerate(inputA):
results.append((val[0]*val[1]/val[2], idx))
对列表进行排序,提取位置:
l = lambda t:t[1]
print(list(map(l,sorted(results,reverse=True))))
对列表进行迭代为O(n)
,排序为O(nlogn)
。地图/列表/打印再次对O(n)
进行迭代,因此效果应为O(nlogn)
。