*hwwlqj 3udfwlfdo«...
TRANSCRIPT
!"#$%&'()*'+,"#-.+&"'/$.+-,$)012)1030405416
ID2204: Constraint Programming
Christian Schulte!"!#$%&'()&#*"'
Software and Computer SystemsSchool of Information and Communication TechnologyKTH Royal Institute of TechnologyStockholm, Sweden
7"'8+,9&'+):,"(,9;;&'()<&+=)>$."#$
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 3E
FG$,G&$<
Program model as scriptdeclare variablespost constraints (creates propagators)define branching
Solve scriptbasic search strategyGist: interactive visual search
:,"(,9;)!"#$%)98)A.,&H+
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 3I
A.,&H+J)FG$,G&$<
Script is class inheriting from class Spacemembers store variables regarded as solution
Script constructorinitialize variablespost propagators for constraintsdefine branching
Copy constructor and copy functioncopy a Script object during search
Exploration takes Script object as inputreturns object representing solution
Main functioninvokes search engine
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 3K
A.,&H+)L",)A!!J)A+,-.+-,$
!"#$%&'()*+($,'(-"#./001!"#$%&'()*+($,'(-2(34$0/001
&2"#+)#35(263$()7($,'(8
$%322)9(#':,4(:,#(; <)6&=%"$)963$()>64,.($.('<?#.@34A443; %8)--)B"+".2)C,4).0()%(..(42
6&=%"$<--)D,#2.4&$.,4)C,4)2$4"6.9(#':,4(:,#(;--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,%--)G4"#.)2,%&.",#
J8
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 10
A.,&H+)L",)A!!J)A+,-.+-,$
!"#$%&'()*+($,'(-"#./001!"#$%&'()*+($,'(-2(34$0/001
&2"#+)#35(263$()7($,'(8
$%322)9(#':,4(:,#(; <)6&=%"$)963$()>64,.($.('<?#.@34A443; %8)--)B"+".2)C,4).0()%(..(42
6&=%"$<--)D,#2.4&$.,4)C,4)2$4"6.9(#':,4(:,#(;--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,%--)G4"#.)2,%&.",#
J8
array of integer variables stores solution
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 13
A.,&H+)L",)A!!J)A+,-.+-,$
!"#$%&'()*+($,'(-"#./001!"#$%&'()*+($,'(-2(34$0/001
&2"#+)#35(263$()7($,'(8
$%322)9(#':,4(:,#(; <)6&=%"$)963$()>64,.($.('<?#.@34A443; %8)--)B"+".2)C,4).0()%(..(42
6&=%"$<--)D,#2.4&$.,4)C,4)2$4"6.9(#':,4(:,#(;--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,%--)G4"#.)2,%&.",#
J8
constructor: initialize variables, post
constraints, define branching
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 11
A.,&H+)L",)A!!J)A+,-.+-,$
!"#$%&'()*+($,'(-"#./001!"#$%&'()*+($,'(-2(34$0/001
&2"#+)#35(263$()7($,'(8
$%322)9(#':,4(:,#(; <)6&=%"$)963$()>64,.($.('<?#.@34A443; %8)--)B"+".2)C,4).0()%(..(42
6&=%"$<--)D,#2.4&$.,4)C,4)2$4"6.9(#':,4(:,#(;--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,%--)G4"#.)2,%&.",#
J8
copy constructor and copy function
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 15
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>?#.@34 2E%OMPKF)(E%OQPKF)#E%ORPKF)'E%OSPKF
5E%OTPKF),E%OUPKF)4E%OVPKF);E%OWPK8--)G,2.)$,#2.43"#.2
--)G,2.)=43#$0"#+2
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 1@
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>?#.@34 2E%OMPKF)(E%OQPKF)#E%ORPKF)'E%OSPKF
5E%OTPKF),E%OUPKF)4E%OVPKF);E%OWPK8--)G,2.)$,#2.43"#.2
--)G,2.)=43#$0"#+2
J variables created in this script (space)
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 16
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>?#.@34 2E%OMPKF)(E%OQPKF)#E%ORPKF)'E%OSPKF
5E%OTPKF),E%OUPKF)4E%OVPKF);E%OWPK8--)G,2.)$,#2.43"#.2
--)G,2.)=43#$0"#+2
J
8 variables
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 1E
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>?#.@34 2E%OMPKF)(E%OQPKF)#E%ORPKF)'E%OSPKF
5E%OTPKF),E%OUPKF)4E%OVPKF);E%OWPK8--)G,2.)$,#2.43"#.2
--)G,2.)=43#$0"#+2
J
take values between 0 and 9
(digits)
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 1M
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>?#.@34 2E%OMPKF)(E%OQPKF)#E%ORPKF)'E%OSPKF
5E%OTPKF),E%OUPKF)4E%OVPKF);E%OWPK8--)G,2.)$,#2.43"#.2
--)G,2.)=43#$0"#+2
J refer to variables by their letters
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 1I
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>?#.@34 2E%OMPKF)(E%OQPKF)#E%ORPKF)'E%OSPKF
5E%OTPKF),E%OUPKF)4E%OVPKF);E%OWPK8--)X,)%(3'"#+)Y(4,2)E?Z[<)"#.(+(4)4(%3.",#).;6(K4(%EI.0"2F)2F)?Z[\X]F)MK8)4(%EI.0"2F)5F)?Z[\X]F)MK8--)A%%)%(..(42)5&2.).3^()'"2."#$.)'"+".2'"2."#$.EI.0"2F)%K8--)[0()%"#(34)(_&3.",#)5&2.)0,%'
--)`43#$0),H(4).0()%(..(42
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 1K
:"8+&'()7"'8+,9&'+8
Defined in namespace 7($,'(
Check documentation for available constraints
Take script reference as first argumentwhere is the propagator for the constraint to be posted!script is a subclass of Space (computation space)
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 50
/&'$9,)NO-9+&"'8)9'#)/&'$9,)7"'8+,9&'+8
Equations of the formc1 x1 cn xn = dinteger constants: ci and dinteger variables: xi
In Gecode specified by arraysintegers (?#.A4+2K civariables (?#.@34A443;F)?#.@34A4+2K xi
Not only equations?Z[\a]F)?Z[\X]F)?Z[\baF)?Z[\7ZF)?Z[\b]F)?Z[\7]equality, disequality, inequality (less, greater, less or equal, greater or equal)
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 53
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>
--)[0()%"#(34)(_&3.",#)5&2.)0,%'?#.A4+2 $ETcTcUK8)?#.@34A4+2 dETcTcUK8$OMPeQMMM8)$OQPeQMM8)$ORPeQM8)$OSPeQ8dOMPe28))))dOQPe(8)))dORPe#8))dOSPe'8$OTPeQMMM8)$OUPeQMM8)$OVPeQM8)$OWPeQ8dOTPe58))))dOUPe,8)))dOVPe48))dOWPe(8$OLPefQMMMM8)$ONPefQMMM8)$OQMPefQMM8)$OQQPefQM8)$OQRPefQ8dOLPe58))))))dONPe,8)))))dOQMPe#8))))dOQQPe(8)))dOQRPe;8%"#(34EI.0"2F)$F)dF)?Z[\a]F)MK8--)`43#$0),H(4).0()%(..(42
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 51
/&'$9,)NPH,$88&"'8
Other options for posting linear constraints are available: minimodeling support
linear expressionsBoolean expressionsmatrix classes
See the examples that come with Gecode
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 55
A.,&H+)L",)A!!J)7"'8+,-.+",
!"#$%&'()*+($,'(-5"#"5,'(%/001
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>
--)[0()%"#(34)(_&3.",#)5&2.)0,%'6,2.EI.0"2F)))))))))))))QMMMI2)c)QMMI()c)QMI#)c)'
c)QMMMI5)c)QMMI,)c)QMI4)c)(ee)QMMMMI5)c)QMMMI,)c)QMMI#)c)QMI()c);K8
--)`43#$0),H(4).0()%(..(42
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 5@
A.,&H+)L",)A!!J)7"'8+,-.+",
9(#':,4(:,#(;EH,"'K)<)%EI.0"2F)LF)MF)NK)>
--)`43#$0),H(4).0()%(..(42=43#$0EI.0"2F)%F)?X[\@AZ\9?ga\:?XF)?X[\@Ab\:?XK8
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 56
Q,9'.=&'(
Which variable to choosegiven order ?X[\@AZ\XhXasmallest size ?X[\@AZ\9?ga\:?Xsmallest minimum ?X[\@AZ\:?X\:?X
How to branch: which value to choosetry smallest value ?X[\@Ab\:?Xsplit (lower first) ?X[\@Ab\9Gb?[\:?X
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 5E
A.,&H+)L",)A!!J)7"HR&'(
--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;i)2K)<)963$(E2034(F)2K)>
%/&6'3.(EI.0"2F)2034(F)2/%K8J--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,% 2034(K)>
4(.&4#)#(j)9(#':,4(:,#(;E2034(FI.0"2K8J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 5M
A.,&H+)L",)A!!J)7"HR&'(
--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;i)2K)<)963$(E2034(F)2K)>
%/&6'3.(EI.0"2F)2034(F)2/%K8J--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,% 2034(K)>
4(.&4#)#(j)9(#':,4(:,#(;E2034(FI.0"2K8J
update all variables needed
for solution
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 5I
A.,&H+)L",)A!!J)7"HR&'(
--)D,#2.4&$.,4)C,4)$%,#"#+9(#':,4(:,#(;E=,,% 2034(F)9(#':,4(:,#(;i)2K)<)963$(E2034(F)2K)>
%/&6'3.(EI.0"2F)2034(F)2/%K8J--)G(4C,45)$,6;"#+)'&4"#+)$%,#"#+H"4.&3%)963$(I)$,6;E=,,% 2034(K)>
4(.&4#)#(j)9(#':,4(:,#(;E2034(FI.0"2K8J
create a new copy of the space
during cloning
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 5K
7"HR&'(
Required during explorationbefore starting to guess: make copywhen guess is wrong: use copydiscussed later
Copy constructor and copy function neededcopy constructor is specific to scriptupdates (copies) variables in particular
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @0
7"HR)7"'8+,-.+",)S'#)7"HR)T-'.+&"'
Always same structure
Important!must update the variables of a script!
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @3
A.,&H+)L",)A!!J):,&'+)T-'.+&"'
--)G4"#.)2,%&.",#H,"')64"#.EH,"'K)>
2.'<<$,&. **)%)**)2.'<<(#'%8J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @1
A-;;9,RJ)A.,&H+
Variablesdeclare as membersinitialize in constructorupdate in copy constructor
Posting constraintsCreate branchingProvide copy constructor and copy function
A"%G&'()A.,&H+8
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @@
SG9&%9U%$)A$9,.=)N'(&'$8
Returning solutions one by one for scriptBk9 depth-first search`A` branch-and-boundZ(2.34.F)bB9
Interactive, visual search7"2.
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @6
!9&')!$+="#J)T&,8+)A"%-+&"'
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;8Bk9*9(#':,4(:,#(;1)(E5K8'(%(.()58"C)E9(#':,4(:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @E
!9&')!$+="#J)T&,8+)A"%-+&"'
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;8Bk9*9(#':,4(:,#(;1)(E5K8'(%(.()58"C)E9(#':,4(:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
create root space for search
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @M
!9&')!$+="#J)T&,8+)A"%-+&"'
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;8Bk9*9(#':,4(:,#(;1)(E5K8'(%(.()58"C)E9(#':,4(:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
create search engine (takes
clone of 5)
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @I
!9&')!$+="#J)T&,8+)A"%-+&"'
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;8Bk9*9(#':,4(:,#(;1)(E5K8'(%(.()58"C)E9(#':,4(:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
root space not any longer
needed
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD @K
!9&')!$+="#J)T&,8+)A"%-+&"'
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;8Bk9*9(#':,4(:,#(;1)(E5K8'(%(.()58"C)E9(#':,4(:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
search first solution and
print it
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 60
!9&')!$+="#J)S%%)A"%-+&"'8
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;8Bk9*9(#':,4(:,#(;1)(E5K8'(%(.()58j0"%()E9(#':,4(:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 63
>$."#$)>&8+
A graphical tool for exploring the search treeexplore tree step by steptree can be scaleddouble-clicking node prints information: inspectionsearch for next solution, all solutions
Best to play a little bit by yourselfhide and unhide failed subtrees
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 61
!9&')T-'.+&"'J)>&8+
!"#$%&'()*+($,'(-+"2./001
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,4(:,#(;I)5)e)#(j)9(#':,4(:,#(;87"2.<<'C2E5K8'(%(.()584(.&4#)M8
J
>&8+)A.,$$'8="+
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 65
Q$8+)A"%-+&"')A$9,.=
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 66
V$;&'#$,J)A!!WW
Find distinct digits for letters, such that
and +,-./ maximal
0.-1
2 +,03
4 +,-./
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 6E
A.,&H+)L",)A!!WW
Similar, please try it yourself at homeIn the following, referred to by 9(#':,2.:,#(;
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 6M
A"%G&'()A!!WWJ)F,#$,
Principlefor each solution found, constrain remaining search for better solution
Implemented as additional methodH"4.&3%)H,"')$,#2.43"#E$,#2.)963$(i)=K)>
J
Argument = refers to so far best solutiononly take values from =never mix variables!
Invoked on object to be constrained
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 6I
F,#$,)L",)A!!WW
H"4.&3%)H,"')$,#2.43"#E$,#2.)963$(i)\=K)>$,#2.)9(#':,2.:,#(;i)=)e)
2.3."$\$32.*$,#2.)9(#':,2.:,#(;i1E\=K8
?#.@34 (E%OQPKF)#E%ORPKF)5E%OTPKF),E%OUPKF);E%OLPK8
?#.@34 =\(E=/%OQPKF)=\#E=/%ORPKF)=\5E=/%OTPKF)=\,E=/%OUPKF)=\;E=/%OLPK8
"#. 5,#(;)e)EQMMMMI=\5/H3%EKcQMMMI=\,/H3%EKcQMMI=\#/H3%EKcQMI=\(/H3%EKc=\;/H3%EKK8
6,2.EI.0"2F)QMMMMI5cQMMMI,cQMMI#cQMI(c; 1)5,#(;K8J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD 6K
!9&')!$+="#J)S%%)A"%-+&"'8
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,2.:,#(;I)5)e)#(j)9(#':,2.:,#(;8`A`*9(#':,2.:,#(;1)(E5K8'(%(.()58j0"%()E9(#':,2.:,#(;I)2)e)(/#(d.EKK)>
2f164"#.EK8)'(%(.()28J4(.&4#)M8
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD E0
!9&')T-'.+&"'J)>&8+
!"#$%&'()*+($,'(-+"2./001
"#. 53"#E"#. 34+$F)$034I)34+HOPK)>9(#':,2.:,#(;I)5)e)#(j)9(#':,2.:,#(;87"2.<<=3=E5K8'(%(.()584(.&4#)M8
J
1030405416 *?110@4/012)7=,&8+&9')A.=-%+$2)*7B2)CBD E3
A-;;9,RJ)A"%G&'(
Result-only search enginesBk9F)`A`
Interactive search engine7"2.
Best solution search uses constrain-method for posting constraintSearch engine independent of script and constrain-method