假设我要创建一个Java程序来执行几次Alloy运行,并为每个循环更改其作用域值(整数从0到9),以检查哪个将找到花费更少时间的解决方案。
请注意,该命令实际上是相同的,我的意思是,仅范围的值(以及保留词“精确”的存在/不存在)会有所不同。
这是一个数字示例:
1st run → command: run MyPred for 3 but 5 Int, exactly 1 Sig_Scope1, 1 Sig_Scope2, exactly 1 Sig_Scope3
2nd run → command: run MyPred for 4 but 5 Int, 2 Sig_Scope1, exactly 2 Sig_Scope2, exactly 2 Sig_Scope3
3rd run → command: run MyPred for 4 but 5 Int, 2 Sig_Scope1, exactly 1 Sig_Scope2, 1 Sig_Scope3
依此类推,直到达到最大迭代次数(假设为10)。
10th run → command: run MyPred for 4 but 5 Int, 0 Sig_Scope1, exactly 2 Sig_Scope2, 0 Sig_Scope3
程序输出将是这样的:
1st run. Found solution: Yes. Spent time: 17 seconds
2nd run. Found solution: No. Spent time: [it may take a time until the Alloy analyzer is going to return no solution]
3nd run. Found solution: No. Spent time: [it may take a time until the Alloy analyzer is going to return no solution]
...
9th run. Found solution: Yes. Spent time: 21 seconds
10th run. Found solution: Yes. Spent time: 10 seconds
这是我要尝试的伪代码,但是有很多片段(文本问题),我不知道如何实现它或如何找到更多的学习材料:
...
A4Reporter rep = new A4Reporter() {...}
...
Module world = CompUtil.parseEverything_fromFile(rep, null, filename); //reading Alloy filename.
...
A4Options options = new A4Options(); //Analyzer’s options.
...
Command command: world.getAllCommands(); //I’am looking for Alloy’s ‘run’ commands, for instance, the first run command would be: run MyPred for 3 but 3 Int, exactly 1 Sig_Scope1, 1 Sig_Scope2, exactly 1 Sig_Scope3
...
Int max_number_of_runs = 10;
for(i = 0; i < max_number_of_runs; i++) {
A4Solution ans = TranslateAlloyToKodkod.execute_command(rep, world.getAllReachableSigs(), command, options); //get all Signatures, fine :)
System.out.println(ans); //printing the whole command.
if (ans.satisfiable()) {
//How can I get the amount of time (in seconds) to found a solution as an integer or String?
//Getting the label of the Sigs. I have got this way, however I do not know if it is the right one.
SafeList<Sig> sigs = ans.getAllReachableSigs();
for (Sig sig : sigs) {
System.out.println(sig.shortLabel());
}
//For each Sig how can I get their values?
//How can I build a new command (Command new_built_command) for the next run? The values of scope Sig will come from a list or they will be generated through Java Random class (I mean a know how to generate random integers).
command = new_built_command;
} else {
//A message that the current command did not find a solution as a String!
}
}
你能帮我这个忙吗?
最佳答案
我如何建立新命令
您可以参阅ExampleUsingTheAPI以获得使用Alloy API构造Alloy模型的示例。使用该API,您可以以编程方式构造Command
来运行。或者,您可以从文本形式的Alloy模型开始,使用CompUtil.parseEverything_fromString
进行解析,然后在原始Alloy模型上进行字符串查找-替换以更新命令,然后重新开始。
对于每个Sig,我如何获得它们的值?
参见ExampleCompilingFromSource,第44行。基本上,一旦获得A4Solution
对象,就可以对其调用eval
方法,以根据找到的解决方案评估任何表达式(如果传递了Sig
对象,则将在解决方案中获得其价值)。
如何获得以整数或字符串形式找到解决方案的时间(以秒为单位)?
我不确定A4Solution
是否包含有关解决时间的任何信息,因此在这种情况下,您必须自己测量时间。