提高信息学奥赛的一些方法.docx
《提高信息学奥赛的一些方法.docx》由会员分享,可在线阅读,更多相关《提高信息学奥赛的一些方法.docx(9页珍藏版)》请在冰豆网上搜索。
提高信息学奥赛的一些方法
提高信息学奥赛的一些方法
马丁斯·奥普曼斯
拉脱维亚LV-1459雷纳大道29号
拉脱维亚大学,数学与计算科学学会
E-Mail:
martins.opmanis@mii.lu.lv
摘要:
本文介绍了如何提高信息学奥林匹克竞赛一些可能的方法。
奥赛中的任务是在有限的时间内完成软件产业模型中的软件生产阶段的编码,测试和调试。
目前,只有编码工作获得足够的分级,但其他活动的分级可能得到改善。
参与选手在整体测试过程中的方式会被调查,改善解决方案的调试过程也会被介绍。
可能的得分模式也会被讨论。
这在国际奥赛中的任务是并不多见的。
可能的原因会被调查,如何回到比赛场地并继续任务也将得到建议。
关键字:
信息学奥赛,测试,调试,竞赛任务,等级
1.介绍
国际信息学奥赛和国际数学、物理、化学和生物奥赛对于高中生而言是一项国际奥赛。
国际信息学奥赛自1989年举办以来是一年一度的盛事。
来自72个国家和地区的272名选手参加了2005年在波兰NowySacz举办的大赛。
以前的信息学奥赛也采用类似的方式,它们是独特的,目前的比赛有一到两个回合。
任务是面向算法和解决方案自动分级。
对于来自拉脱维亚的选手,参加国际信息学奥赛,成功的参与在4月5日之前难度进阶级(学校、地区、国家、波罗的海)是非常必要的。
几个非常出名的区域信息学奥赛:
波罗的海信息学奥赛(BOI,2004;BOI,2005),中欧信息学奥赛(CEOI,2005),巴尔干信息学奥赛(Balkan,2005)。
在本文提到的信息学奥赛没有更精确解释在奥赛层次的竞赛,国际奥赛被假定是低层次开始高层及结束。
2.信息学奥赛的特征
2.1.信息学奥赛的基本特征
高中生参与的信息学奥赛有以下基本特征:
⏹独立性,参与者不能得到队友和其他人以及其它像互联网、书籍等的帮助。
有很多其他的竞赛是以团队的方式一起工作。
事实上,团队合作更加接近工业中的实际工作。
然而,由于历史的原因,信息学独立性这个特色依然没有改变,同时也没有改变的计划。
⏹在当前,几乎每一个信息学奥赛都拥有卫星在线竞争机制,每一个有兴趣的注册会员都可以在同一限定时间内解决同一问题。
如果竞争有严重影响(例如为了更高级别的奥赛进行的团队选择),这样的竞赛被加入的监督和限制制定为“半在线”,选手只能在一个指定的场所(依然远离主要的比赛场地)内工作。
⏹一到两个回合的竞赛,每个回合5小时。
基本上所有的信息学奥赛都遵守这个标准。
每一个回合的竞赛在不同的两天(在这个意义上的“全面竞争“和”比赛日“可能被用来作为同义词),两个回合之间可能有一天的休闲时间。
在拉脱维亚,最初的两个级别(学校和地区)的奥赛是一天的比赛,但高水平的奥赛(拉脱维亚,波罗的海和国际性的)会举行两轮比赛。
一般来说,每轮比赛会有三个任务。
据推测,最优秀的学生必须能够解决三个人物。
⏹任务主要面向算法。
其主要目的就是让学生找到一个正确可靠的算法解决给出的问题。
任务包括启发式的和一些“幸运”的存在,作为一个规则,为了避免或者至少包括以下任务在问题的设置中会提出严格的讨论。
在过去的很多年中,三中任务被信息学奥赛所接受:
1.在解决方案的任务中,一个计算机程序必须被提交(如果没有提及,另有这种类型的任务将被假设);
2.任务,输入文件会被给出并且相应的输出文件必须提交(本文的后面会做一个简要的讨论);
3.无功任务,给出的一个库必须被使用(不会再本文中讨论)。
⏹解决方案在先前准备的测试装置中会被自动测试,正确性会被等价检查认定或者被等级制定人检查。
等级系统的反馈给予选手可能知道的变异,如果是这样,那么它给予正确答案时会给出测试实例作为输入数据。
2.2.竞赛回合
⏹一开始,参赛者会收到任务的描述,输入和输出数据的格式也会在任务中一起被描述,数据范围和时间的限制在测试执行中也会给出。
任务描述同样包含一个有输入和相应输出的实例。
每个任务的最大点数是100。
⏹创建的解决方案必须提交到打分系统,解决方案会被编译和执行在简单的测试案例(通常和任务说明中给出的例子一样)中。
这个过程被称为预测试,如果程序输出是正确的,提交过程将会接收到“接受状态”,否则就是拒绝。
⏹最后提交解决方案的状态是“接受”,这个时候的解决方案可以被认为是最终版本的解决方案。
⏹一轮比赛结束之后,解决方案的最终版本会在完全测试系统中测试,这个过程被称为终极测试。
每一个测试都会有分数,分数是给那些在限定的时间内给出正确结果的选手的,否则解决方案不会有任何分数。
3.测试和调试
在过去的很多年里头,自动化测试变成了信息学奥赛实质上的标准。
尽管不能证明程序的正确性,仅仅使用测试运行和几个任务(就像理论文章和证明)的排斥,同时,自动化测试从根本上提升比较客观的提交解决方案。
如果没有一个公平的打分机制,在国际上是无法想象的。
但是,还是存在着众多的不足:
⏹测试机制(相同的解决方案)的作者是仲裁者。
这是可能的,该测试机制在某种意义上说是“失衡的”,特别是在试验次数太低(我不想谈论琐碎问题)。
例如,在1999年的国际信息学奥赛中,“交通灯”和“土地带”只有一到两个简单的测试案例,导致了很低的分数,也没有给出合理的结果分布。
由于这样的结果,50%的规定被发明出来(在任务描述中,必须保证完成50%),这导致了2005年国际信息学奥赛的惊人结果,几个选手选择了相对安全的方式得到了半数的分数,由于选择“光明的”限制而不是试图去解决“艰难的”问题。
技术错误也曾发生在先前的国际信息学奥赛中,在任务描述和一些测试案例中存在分歧也是可能的。
作为一项规则,这些都是被参赛者或者一些参赛队的领导发现之后才进行调查的,这些错误纠正以后,所有的提交解决方案将会在新的测试系统中进行测试。
⏹从“工业化”的观点所造就的终极版本将有望成为团队工业中的“开放版本”。
在信息学奥赛中,一个算法比较弱的工作版本比一个含有一个错字的完美执行更好。
这种方案可以称为“一个错误的符号”问题。
在11届国际信息学奥赛中,有选手因为在一个“for”循环中将N替换为M,导致一个值100分的解决方案得到0分。
在另一方面,解决方案是不公平的,由于过去测试系统的“缺口”,所以很少有选手可能会觉得很幸运。
例如,在第四节中欧信息学奥赛中,一个选手在“射击比赛”获得了90%的分数,尽管事实上他提到的解决方案仅仅是广场区域用长方形代替。
经过一轮的比赛后,每一个任务有:
⏹一个测试系统,由仲裁机构制定;
⏹N+1的解决方案(N是选手解决方案和一个(可能最好的)仲裁结构解决方案)。
信息学奥赛打分系统允许非常快的测试所有N个提交的解决方案,即使它们有上百个。
为了更加精确,多台计算机分配了计算能力,使竞赛完成之后能立刻测试解决方案。
在准备解决方案和准备编程的过程本身就是强迫去特使他自己的解决方案(假设没有特殊任务,没经过严格测试其正确性是不能得到检查的)。
目前,打分系统只允许检查程序在简单的测试案例中的正确性。
程序能力是运行更大输入数据将会的到检查被创建如此之大的测试案例,这将导致需要为更大的项目写一个更多的程序。
这种“内部的”或者“本地的”测试让选手自己有一种自己的解决方案就是正确的(如果程序解决所有构件的测试用例)或者感觉不能写这样的一个程序(不能写出程序的测试用例)。
直到现在,只有程序编写工作是分级充分。
自我测试工作是部分扔掉。
例如,选手构造一个不能用程序解决的测试案例,很显然,该方案是不正确的,但是没有办法去检查其他选手的解决方案基于这种特殊的测试案例。
由选手创建的测试系统可能包含在打分过程中,总分是程序分数和测试分数的总和。
4.单测试系统和多测试系统
如果一轮比赛的结束的“内部”测试项目被允许提交,然后每个任务也有N+1个测试系统(一个属于仲裁机构)。
检测每一个这样大量的测试解决方案将导致每个特殊解决方案更深层次测试。
再次提到它,技术能在合理的时间内做到(即使是几个小时而不是几秒)。
存在提交系统可能得到改善,由增加提交测试系统和一些检查将会被写入验证测试。
4.1积极影响
这种做法的积极特点是:
1.测试是软件创建过程中一个非常严肃的部分。
在这个方向上还必须获得所做出的努力。
在信息学奥赛实践中存在一些实例,当创建一个好的测试实例时,选手不能写入一个正确的解决方案。
没有一个有效的解决方案,如果测试系统提交,它也将被授予这种权利。
在软件产业中,程序员和测试人员是每一天的对手,但是我们依然不能测试人员,因为好的测试创造不是一个容易的工作。
2.如果选手的解决方案是能够解决不同作者创建出来的N+1测试系统,它将是一个比一个测试系统测试出来的产品更严格的产品。
所有的尊重对于仲裁都是任务作者,在特定的问题上,也会有一些影藏的陷阱我们是不能够发现的,但是测试其他选手的时候会被发现。
让我们假设,一同在问题解决办法也测试集的选手提交一套测试,为每个测试用例都是配置点的数量,如果程序将被授予经过该特定的测试案例。
我们不难想象两种格式的测试用例的资料:
⏹输入文件和相应的输出文件(适合“独特的正确输出”);
⏹输入文件和计划生产的输出文件(适合“非独特正确输出”)。
很明显,在第二种情况下一个错误的程序导致不正确的测试集,而在第一个产生的错误,它可以构建正确的测试用例没有进行适当的解决方案。
例如,这可能是一个正确的,但效率较低的解决方案。
提交输入和输出文件在非独特输出情况下正确的解决方案适合于“开放的输入任务”范畴和不是主题分析在本文中。
4.2缺点
不幸的是,这些缺点是:
1只有好的测试才值得给分的。
此外,我们正寻找更好的测试系统,不仅仅是特别棘手的测试用例。
如果分数被授予单纯的“测试”,然后对潜在的危险要获得更多简单测试。
很难制定一个好的标准。
然而,一些简单的规则可以呈述为:
¯完美的解决办法必须给予100分;
¯部分正确的解决方案必须不能给予100分;
¯部分正确解决办法必须给非0的分数(这一点很显然,因为“一个错误的象征”程序上面所提到的会得到0,几乎所有的测试集,都不是没有故障的测试集);
¯非高效(低效)的解决方案必须不能给予满分;
¯非高效但是正确的解决方案必须给予非0的分数(这个规则符合当前国际信息学奥赛中50%的规则);
¯错误的程序不能给予高的分数(如何从部分正确的程序中分离错误的程序)。
2如果有些任务是很艰苦的,即所有的参赛选手从程序员的测试人员和提交恢复到只有测试集吗?
这能否被接受?
3这一点还不是很明显,各自的测试用例应该给予多少分。
一个可能接近的办法是执行所有的测试(避免不止一次的在测试过程中执行同样的测试)。
然而,在这种情况下,如果所有参赛者提交太容易或太复杂的测试集,那么会对结果存在严重的偏见。
这可能会被授予解决方案的一部分分数(比如50%)根据仲裁准备的测试,其余部分根据参赛选手测试准备的情况。
4.3测试比赛
另一个可能的方法能够被看作为一个伟大的实验过程,每个选手程序比赛时的程序(甚至包括他自己)测试集。
三个选手的情况下表1给出了。
表1例子中的测试比赛为3个选手
在给定的例子中(表1)选手A得到了300分,对于仲裁给的295和选手C放弃自己的一些测试。
如果测试没有被提交(参赛者B),然后所有的参与者都得到相同数目的分数。
它可以是0(没有测试用例,在其上可以测试解决方案)或100(没有测试用例都是失败的)——这不会影响相对排名,选手只有绝对数量分数结果才会改变。
实际上的奥赛只会有一个会考虑进去。
所有提交的测试后的测试集上有本质不同的结果也可以。
所给的例子中所见到的参赛者,(表2)区分当使用旧的分级模式(A组和B组)成为区分。
具有较低等级的选手在旧的模式(C),现在有更高的等级。
会发生尴尬事情,如果陪审团的解决办法不会收到的全部得分(例如在一些例子)。
我们的期望是,仲裁的解决方案必须通过所有测试在给定的时间限制和参赛