寻找物体排列的最低成本;如何克服记忆问题?

时间:2016-09-02 00:19:55

标签: java algorithm memory permutation

我不确定"排列"是一个正确的单词,但情况是我的List为〜Objects。每个不同的Object都有不同的valuecost

假设我的对象包含介于1和5之间的value。我正在尝试合并超过某些targetValue的对象列表,找到总数最低cost的组合,并返回该组合。此组合可能包含List中的一个对象的许多重复项。

例如,如果我的对象列表是{a,b,c,d};输出可以是{a,a,a,a,a,a,a,a,a,a}。但请注意,顺序也很重要。 {a,a,b}可能具有与{a,b,a}

不同的总值

目前,我一直试图强行解决问题。但是,40!组合,我正在耗尽记忆,同时跟踪所有不同的排列"。

我仍然倾向于贯穿每一个组合的准确性,增加执行计算的时间不是问题,但正如我之前所说,最大的问题是记忆。

当前代码:( incompleteList以起始对象开头)

while (incompleteList.size() > 0)
{
    Container container = incompleteList.get(0);
    for (myObject o : objectList)
    {
        Container newAdditionContainer = new Container(container);//copies the list of objects into a new container
        newAdditionContainer.addMyObject(o);
        if (newAdditionContainer.getTotalValue()) < targetValue)
        {
            incompleteList.add(newAdditionContainer);
        } else {
            completeList.add(newAdditionContainer);
        }
    }
    incompleteList.remove(container);
} //code then loops through completeList and grabs the container with the cheapest cost, 
//but in actuality that code hasn't been able to run yet.

我非常确定上述内容是否可行,如果它能够完成(但由于内存不能);如何更改算法以尝试获得最低成本并保持在内存限制内?

2 个答案:

答案 0 :(得分:2)

构建一个PermIterator,其中包含List Objectpermutation length和所需的IterateIteratorlength iterationlength 1开头,直到permutations完整value permutation所有permutation超过所需permutation length 。始终只存储实际permutations和当前最佳List,其超出期望值且成本最低,与Object无关。 这样就可以避免在def inventory(): with open('inventory.log', 'r+') as f: match_hostname = re.compile(r'NAME: "(.+)",') match_pid = re.compile(r'PID: (.+) ,') match_sn = re.compile(r'SN: (.+)') list_text = [text.strip() for text in f] for line in list_text: match_regex_hostname = match_hostname.search(line) match_regex_pid = match_pid.search(line) match_regex_sn = match_sn.search(line) if match_regex_hostname: final_hostname = match_regex_hostname.group(1).strip(" ") print final_hostname elif match_regex_pid: final_pid = match_regex_pid.group(1).strip(" ") print final_pid elif match_regex_sn: final_sn = match_regex_sn.group(1).strip(" ") print final_sn inventory() 中存储所有LAB-SW01#show inventory NAME: "LAB-SW01", DESCR: "My Switch" PID: AS-2001-XT , VID: N/A, SN: ABA0923K0DN 并导致内存不足。显然有40 shelfNumber = int(raw_input('What is the shelf number? ')) row = int(shelfNumber / 5.1) + 1 unit = s这仍然需要很长时间。

答案 1 :(得分:1)

如果您在对数据执行任何操作之前尝试加载所有可能的数据,则会耗尽内存。这在读取大文件时也是一个问题。

一个简单的解决方案是,如果有很多值,则不存储所有值,而是在装箱时处理它们。

我建议你每次创建一个新的排列时都要调用一个回调或lambda。这样你就不需要存储它们了。

注意40!排列你可能会用完时间。每微秒一个,需要2.5e34年。比行星还要长。