Early AI research emphasized the optimization of search algorithms. This approach made a lot of sense because many AI tasks can be solved by effectively by defining state spaces and using search algorithms to define and explore search trees in this state space. Search programs were frequently made tractable by using heuristics to limit areas of search in these search trees. This use of heuristics converts intractable problems to solvable problems by compromising the quality of solutions; this trade off of less computational complexity for less than optimal solutions has become a standard design pattern for AI programming. We will see in this chapter that we trade off memory for faster computation time and better results; often, by storing extra data we can make search time faster, and make future searches in the same search space even more efficient.
Read the rest of this entry »
This coding standard for the C# language is mandatory for PMS. The objective of this coding standard is to have a positive effect on:
Avoidance of errors/bugs, especially the hard-to-find ones.
Maintainability, by promoting some proven design principles.
Maintainability, by requiring or recommending a certain unity of style.
Performance, by dissuading wasteful practices.
Rules and recommendations are given that promote reliability and maintainability
Read the rest of this entry »
Despite previous efforts in auditing software manually and automatically, buffer overruns are still being discovered in programs in use. A dynamic bounds checker detects buffer overruns in erroneous software before it occurs and thereby prevents attacks from corrupting the integrity of the system. Dynamic buffer overrun detectors have not been adopted widely because they either (1) cannot guard against all buffer overrun attacks (2) break existing code or (3) incur too high an overhead. This paper presents a practical detector called CRED (C Range Error Detector) that avoids each of these defeciencies.
Read the rest of this entry »