理论基础
工具链情况
openJML 作为 Eclipse 用户在 openJML 官网上能够找到 eclipse pulgin 的链接,通过 eclipse 在线安装功能能够非常简单的安装好 openJML 插件,并能够整合 SMT Solvers 进行静态与运行状态下的 JML 检查。
- 在修改了上述 bug 之后,使用 SMT Solver 进行静态检查(ESC)以及运行时检查(RAC),并无异样。
```
Completed proof of jml.TryJML.compare(int,int) with prover cvc4 - no warnings [0.29 secs]
Completed proving methods in jml.TryJML [1.81 secs]
Summary:
Valid: 2
Invalid: 0
Infeasible: 0
Timeout: 0
Error: 0
Skipped: 0
TOTAL METHODS: 2
Classes: 1 proved of 1
Model Classes: 0
Model methods: 0 proved of 0
DURATION: 2.1 secs
[3.00] Completed
[0.00] Executing openjml on TryJML.java
RAC-Compiling jml.TryJML
[0.56] Completed
```
[TestNG] Running:
Command line suite
Passed: racEnabled()
Failed: constructor Demo()
Failed: static compare(-2147483648, -2147483648)
Failed: static compare(0, -2147483648)
Failed: static compare(2147483647, -2147483648)
Failed: static compare(-2147483648, 0)
Failed: static compare(0, 0)
Failed: static compare(2147483647, 0)
Failed: static compare(-2147483648, 2147483647)
Failed: static compare(0, 2147483647)
Failed: static compare(2147483647, 2147483647)
Failed: static main(null)
Failed: static main({})
===============================================
Command line suite
Total tests run: 13, Failures: 12, Skips: 0
===============================================
第一次作业设计思路
第二次作业设计思路
第三次作业设计思路
对于计算最少票价、最小不满意度,采用讨论区大佬的建模思路,先计算出一条路径中各个点之间的最小票价(这时不需要考虑换乘,使用 floyd),然后将所有结果加上一次换乘的代价后整合到一个矩阵之中作为初始票价矩阵(采用 HashMap 作为具体实现),然后就可以愉快的 dijsktra。
// 接口类
public interface WeightCal {
// use for calculate different weight value
public int weightCal(int fromNode, int toNode);
}
// 具体票价换乘代价实现
public class TicketWeight implements WeightCal {
public TicketWeight() {
}
// 用于计算同一条路径上个点之间的最小票价所以没考虑换乘
public int weightCal(int fromNode, int toNode) {
return 1;
}
}
对于最少换乘采用了广度优先的遍历算法,我想的是最少换乘只需要遍历路径树,而不需要具体遍历每一条边,这样就不需要用 dijsktra 那么麻烦的实现。简单来说:只需要计算出一条路径到哪些路径是可达的,然后从起始点所在的路径集合开始按广度优先的方式进行遍历,就能够很简单的实现(不过在 Java 容器的选择上被坑了,实属尴尬)。
@Override
public int hashCode() {
return Objects.hashCode(node1, node2);
}
// 修改之后的 hashCode
@Override
public int hashCode() {
if (node1 < node2) {
return Integer.hashCode(node1) * 31 + Integer.hashCode(node2);
} else {
return Integer.hashCode(node2) * 31 + Integer.hashCode(node1);
}
}
JML 规格方面
Junit 体验
因为这三次作业功能单元都相比之前的电梯非常独立,很适合单元测试。感觉 Junit 具有如下优点:
@Test
public void dijkstraTest() {
MyRailway rail = new MyRailway();
rail.addPath(new MyPath(1, 2, 3, 4, 5));
rail.addPath(new MyPath(1, 6, 7));
rail.addPath(new MyPath(7, 5, 8));
try {
assertEquals(6, rail.getLeastTicketPrice(1, 8));
} catch (NodeIdNotFoundException | NodeNotConnectedException e) {
e.printStackTrace();
}
}
原文:https://www.cnblogs.com/Melles/p/10903353.html