**Create Your Own Solver based on JavaSolver**

To define your optimization problem, you need to create a Java subclass, e.g. MySolver, of the standard class *JavaSolver* similarly to the ProblemZoo in the Introductory Example:

Here ProblemZoo extends JavaSolver and needs to have its own method “**define()**” that uses the constraint satisfaction problem **csp** already created by *JavaSolver*. This object **csp **has the standard type *javax.constraints.Problem* and you can use its methods as described in the JSR-331 User Manual but you don’t have to go through this manual as we will explain the most frequently used methods by the examples right here.

**Creating Constrained Variables**

To create a constrained integer variable with the name “Amount” and possible values between 0 and 1000, you may write:

**Var** amountVar = csp.**variable**(“Amount”, 0, 1000);

To create a constrained variable with the name “Assigned” and possible values between 0 or 1, you may write:

**VarBool** assignVar = csp.**variableBool**(“Assigned”);

**Creating Constrained Expressions**

To create a constrained variable equal to (amountVar plus 50) , you may write:

*Var plus5 =amountVar. plus(50);*

If you have 3 variables X, Y, and Z already defined, you may write the expression XY-Z as follows:

*Var objective = x. multiply(y).minus(z);*

**Creating Arrays, Sums, and Scalar Products**

Let’s say you want to create variables that represent working hour during 7 days of a week (0-Mon, 1-Tue,…, 6-Sun). You may create an array with the name “DailyHours” that contains 7 constrained integer variables with possible values between 0 and 8:

*Var[] dailyHours = csp. variableArray(“DailyHours”, 0, 8, 7);*

To create a sum of all variables in this array, you may write:

*Var totalNumberOfWorkHours = csp. sum(dailyHours);*

You may define the hourly costs for every day of the week:

int[] costs = new int[] { 40, 40, 40, 40, 40, 70, 70 };

Then a person’s weekly earning can be expressed as the following scalar product:

*Var weeklyEarning = csp. scalProd(costs, dailyHours);*

**Posting Arithmetic and Logical Constraints**

To state that our *amountVar* should be more or equal to 500, you may post this constraint:

*csp. post(amountVar, “>=”, 500);*

To state that X + Y = Z, you may post this constraint:

*csp. post(x.plus(y), “=”, z); *

To state that a person cannot work more than 40 hours per week, you may post the constraint:

*csp. post(totalNumberOfWorkHours, “<=”, 40);*

To state that a person cannot work on Sunday (day# 6), you may post the constraint:

*csp. post(dailyHours[6], “=”, 0);*

To state that a person should earn at least $1,280, you may post the constraint:

*csp. post(weeklyEarning, “>=”, 1280);*

To state that if a person works on Saturday she cannot work on Sunday, you may write:

**Constraint** worksOnSat = csp.**linear**(dailyHours[5], “>”, 0);**Constraint** doesNotWorkOnSun = csp.**linear**(dailyHours[6], “=”, 0);*csp. postIfThen(worksOnSat, doesNotWorkOnSun);*

To state that all integer variables of the array *variables* must take different values from each other, you may write:

*csp. postAllDifferent(variables);*

You may find more complex predefined constraints in the JSR-331 User Manual.

**Defining Optimization Objective**

You may make any constrained variable to be your optimization objective, e.g,

**setObjective**(weeklyEarning);

will make your objective that you want to maximize or minimize – see Solving Optimization Problem.