如果你想要像 Dijkstra 这样的东西,为什么不直接做 Dijkstra 呢?您需要在图形解释中更改一些内容,但这似乎非常可行:
Dijkstra 将根据最低成本标准结算节点。将该标准设置为“公司损失的钱”。您还将在 Dijkstra 解决节点,您需要确定究竟什么是节点。考虑一个节点是一个时间和一个属性状态,例如第 4 年和 x 年的工作机器。在第 0 年,损失的钱将是 0,您将没有机器。然后,您添加所有可能的边缘/选择/状态转换,这里是“购买机器”。您最终会在 Dijkstra PQ [第 1 年,第 1 年的工作机器] 上以一定的成本获得一个新节点。
从那时起,您可以随时出售机器(产生 [year 1, no machine] 节点),购买新机器 [year 1, new machine])或继续使用相同的机器([year 2, machine of age 2]) . 您只需继续开发最短路径树,直到获得第 5 年(或更多)所需的一切。
然后你有一组节点 [第 i 年,年龄 j 的机器]。要在第 i 年找到最适合贵公司的方案,只需在所有可能性中寻找它(我认为它永远是 [第 i 年,没有机器])以获得您的答案。
由于 Dijkstra 是一种全对最短路径算法,它为您提供了所有年份的所有最佳路径
编辑:java的一些伪代码首先你应该创建一个节点对象/类来保存你的节点信息。
Node{
int cost;
int year;
int ageOfMachine;
}
然后你可以添加节点并解决它们。确保您的 PQ 正在根据成本字段对节点进行排序。从根开始:
PQ<Node> PQ=new PriorityQueue<Node>();
Node root= new Root(0,0,-1);//0 cost, year 0 and no machine)
PQ.offer(root);
int [] best= new int[years+1];
//set best[0..years] equal to a very large negative number
while(!PQ.isEmpty()){
Node n=PQ.poll();
int y=n.year;
int a=n.ageOfMachine;
int c=n.cost;
if(already have a cost for year y and machine of age a)continue;
else{
add [year y, age a, cost c] to list of settled nodes;
//examine all possible further actions
//add nodes for keeping a machine and trading a machine
PQ.offer(new Node(cost+profit selling current-cost of new machine,year+1,1));
PQ.offer(new Node(cost,year+1,age+1);//only if your machine can last an extra year
//check to see if you've found the best way of business in year i
if(cost+profit selling current>best[i])best[i]=cost+profit selling current;
}
}
沿着这些思路的东西会给你最好的做法,以达到成本最好的第一年[i]