如果我先显示我的代码,我认为这会更容易。
/* Machine that can add and remove pools to its stack */
public class Machine {
private final int toolQuantity = 5;
public boolean addTool(Tool t) { return true; }
public boolean removeTool(Tool t) { return true; }
public boolean processJob(Job j) { return true; }
}
/* Tool that is needed to process jobs */
class Tool {
}
/* Job that needs specific tools to be processed on machine */
class Job {
private final List<Tool> needs = Collections.emptyList();
}
interface Command { public void execute(); }
class AddTool implements Command {
private Machine m;
private Tool t;
@Override
public void execute() { }
}
class RemoveTool implements Command {
private Machine m;
private Tool t;
@Override
public void execute() { }
}
简化代码。目的只是传达这个想法
所以,我有一台处理工作的机器。工作需要工具(而且工具具有无限的生命周期)。我的目标是找到一个最小的作业和命令列表(即AddTool
和RemoveTool
的实例,以便:{"AddTool(x), "job1", AddTool(y), "job2"}
),以便给定固定列表可以处理工作。作业不需要的工具可以保留在机器上(只要当然剩下足够的地方)。
我有两种方法:
收集工作之间的需求。由于此方法仅考虑作业i
和作业i + 1
。如果机器卸载作业i + 1
不需要但工作i + 2
需要的工具,则可能不是最佳选择。这是一个不必要的删除和添加循环(假设有可能删除另一个不需要的工具)。
使用启发式算法,例如: G。模拟退火,可以最大限度地减少使用的命令数。
我宁愿使用直接的方式。但是我想不出另一个,我猜这个简单的方法太无效了。
那么如何解决我的问题?如何根据计算机科学进行分类?我也很感激这些问题的一般解决方案,这些问题并不专门处理工作,机器和工具。
答案 0 :(得分:3)
这是hamiltonian path problem,或者是Traveling Salesman Problem(如果你稍微修改一下这个问题)。每个作业都需要一定数量的工具,您可以确定从一个作业到另一个作业需要多少个命令。您希望通过该图表的路径最小化添加/删除方面的“距离”并访问所有节点/作业。