Self-assembly is a process of construction through specific, localized interactions among component parts that results in spatially organized structures. The term has been applied to self-assembled monolayer, aggregation phenomena, assembly of inorganic materials on a surface, as well as DNA computing and its descendants. Likewise, though not realized in any practical, large-scale way yet, self-assembly has the promise to revolutionize material science with a bottom-up approach that structures materials on a molecular scale to achieve desired properties. Experimental self-assembly is a stochastic physical process with potential for disorder from kinetic traps, mismatching of tiles, and other defects. Usually the desired assembly is one state among many possible imperfect states. In order to design and quantify the reliability of self-assembly for manufacturing processes, some characterization of the probability of the desired assembly is necessary. The quantity that is required is the partition function of the system. In addition, the complexity of calculating the partition function is an important metric for the feasibility of design. In this lecture, situations in which the partition function of the self-assembly are efficiently computed are investigated.