Concurrent engineering is a complex problem in that a large number of considerations have to be brought to bear during the design stage. Compounding this complexity is that concurrent engineering problems are also likely to encompass both numeric and symbolic variables, and constraints that range from simple algebraic constraints, through conditional constraints, to potentially very complex database constraints. Previous approaches have concentrated on finding good solutions to simplified problems or, alternatively, to finding a feasible solution which may not be close to optimal. This paper presents an approach to concurrent engineering problems that extends the conventional genetic algorithm approach to handle the complex variety of variables and constraints that are inherent in a typical concurrent engineering problem. This poses some severe research challenges and this paper describes three genetic operators (the constraint-based initialization, crossover, and mutation operators) that preserve feasibility during initialization, crossover, and mutation. Preserving feasibility is achieved by incorporating local constraint propagation, boundary propagation, and set propagation. This overall approach is called the constraint-based genetic algorithm (CBGA) and aims to determine a near-optimal solution to concurrent engineering problems. The paper describes the background to constraint modelling, and genetic algorithms. The constraint-based initialization, crossover and mutation operators are then detailed, together with a description of the implementation of the CBGA in a system called Comet. Finally an example application is given.