Previous: Mortgage Calculator, Up: CLPFD Example Programs [Contents][Index]
This example is a product configuration problem. There are two types of alveoles and 17 boards of four types. We want to plug in all boards using at most 5 alveoles at minimal cost.
| alveole type | power | slots | cost | board type | power | quantity |
| 1 | 0.0 | 0 | 0 | 1 | 19.5 | 10 |
| 2 | 150.0 | 8 | 150 | 2 | 39.5 | 4 |
| 3 | 200.0 | 16 | 200 | 3 | 49.5 | 2 |
| 4 | 74.5 | 1 |
:- use_module(library(lists), [append/2, transpose/2]).
:- use_module(library(clpfd)).
config(Alveoles, Boardss, Cost) :-
problem(Alveoles, Boardss, Cost, Variables),
labeling([minimize(Cost)], Variables).
problem(Alveoles, Boardss, Cost, Variables) :-
length(Alveoles, 5),
( foreach(Alveole,Alveoles),
foreach(Boards,Boardss),
foreach(ACost,ACosts)
do alveole_constraints(Alveole, Boards, ACost)
),
append(Boardss, BoardsFlat),
domain(BoardsFlat, 0, 10),
transpose(Boardss, [BoardT1, BoardT2, BoardT3, BoardT4]),
sum(BoardT1, #=, 10),
sum(BoardT2, #=, 4),
sum(BoardT3, #=, 2),
sum(BoardT4, #=, 1),
sum(ACosts, #=, Cost),
decreasing(Alveoles),
append(Alveoles, BoardsFlat, Variables).
alveole_constraints(AType, [N1,N2,N3,N4], ACost) :-
element(AType, [0.0, 150.0, 200.0], APower),
element(AType, [0, 8, 16], ASlots),
element(AType, [0, 150, 200], ACost),
sum([N1,N2,N3,N4], #=<, ASlots),
19.5 * float(N1) +
39.5 * float(N2) +
49.5 * float(N3) +
74.5 * float(N4) $=< APower.
| ?- config(As, Cs, Cost).
As = [3,3,2,1,1],
Cs = [[0,3,0,1],[3,1,2,0],[7,0,0,0],[0,0,0,0],[0,0,0,0]],
Cost = 550
The optimal solution with cost 550 uses two type 3 alveoles, one type 2 alveole, and two type 1 (unused) alveoles. The first alveole contains three type 2 boards and one type 4 board, and so on.