Pythonãšããã¯ãã©ããã³ã°ã¢ã«ãŽãªãºã ã䜿ã£ãŠå¶çŽå è¶³åé¡ïŒCSPïŒã解決ããæ¹æ³ãåŠã³ãŸããããã°ããŒãã«ãªå¿çšãšå®è·µçãªäŸãæ¢æ±ããŸãã
Pythonã®ããã¯ãã©ããã³ã°ïŒå¶çŽå è¶³åé¡ãã°ããŒãã«ã«è§£æ±º
å¶çŽå è¶³åé¡ïŒCSPïŒã¯ãã³ã³ãã¥ãŒã¿ãµã€ãšã³ã¹ãšäººå·¥ç¥èœã«ãããŠéåšããŠããŸãããããã¯ãäžé£ã®å¶çŽãæºããè§£ãèŠã€ããããšã䌎ããŸããããã¯ãã©ããã³ã°ã¯ãCSPãå¹ççã«è§£æ±ºããããã«äœ¿çšããã匷åãªã¢ã«ãŽãªãºã æè¡ã§ãããã®ããã°èšäºã§ã¯ãPythonãšããã¯ãã©ããã³ã°ã®äžçãæ¢æ±ããCSPã解決ããäžçäžã§ãã®å€æ§ãªã¢ããªã±ãŒã·ã§ã³ãæ¢æ±ããããã®å æ¬çãªã¬ã€ããæäŸããŸãã
å¶çŽå è¶³åé¡ïŒCSPïŒãšã¯ïŒ
å¶çŽå è¶³åé¡ïŒCSPïŒã¯ã3ã€ã®ã³ã¢ã³ã³ããŒãã³ãã«ãã£ãŠå®çŸ©ãããŸãã
- 倿°ïŒ ãããã¯ãå€ãå²ãåœãŠãããšã³ãã£ãã£ã§ããããšãã°ãå°å³ã®åœ©è²åé¡ã§ã¯ã倿°ã¯åœã衚ãå¯èœæ§ããããŸãã
- ãã¡ã€ã³ïŒ å倿°ã«ã¯ãåãããå¯èœæ§ã®ããå€ã®ã»ããã§ãããã¡ã€ã³ããããŸããå°å³ã®åœ©è²ã§ã¯ããã¡ã€ã³ã¯è²ã®ã»ããïŒäŸïŒèµ€ãéãç·ïŒã§ããå¯èœæ§ããããŸãã
- å¶çŽïŒ å¶çŽã¯ã倿°éã®é¢ä¿ãå®çŸ©ããŸãããããã¯ãã©ã®å€ã®çµã¿åããã蚱容ãããããæå®ããŸããå°å³ã®åœ©è²ã§ã¯ãå¶çŽã¯é£æ¥ããåœãåãè²ãæã€ããšãã§ããªãããšã瀺ãå¯èœæ§ããããŸãã
CSPã®ç®æšã¯ããã¹ãŠã®å¶çŽãæºããããããã«ããã¡ã€ã³ããã®å€ã倿°ã«å²ãåœãŠãããšã§ãããã®ãããªå²ãåœãŠãååšããå ŽåãCSPã«ã¯è§£ããããŸãããã以å€ã®å Žåã¯ãè§£ããããŸããã
ããã¯ãã©ããã³ã°ã¢ã«ãŽãªãºã ïŒã¹ããããã€ã¹ãããã¬ã€ã
ããã¯ãã©ããã³ã°ã¯ãCSPã解決ããããã«äœ¿çšãããäœç³»çãªæ€çŽ¢ã¢ã«ãŽãªãºã ã§ããããã¯ã解空éãæ¢çŽ¢ããå倿°ã«ç°ãªãå€ã®å²ãåœãŠã詊ãããšã«ãã£ãŠæ©èœããŸããéšåçãªå²ãåœãŠãå¶çŽã«éåããå Žåãã¢ã«ãŽãªãºã ã¯ãããã¯ãã©ãã¯ããã以åã®ç¶æ ã«æ»ããå¥ã®å€ã詊ããŸããã¢ã«ãŽãªãºã ã®å èš³ã¯æ¬¡ã®ãšããã§ãã
- 空ã®å²ãåœãŠããéå§ããŸãã ãããã®å€æ°ã«ãå€ãå²ãåœãŠãªãç¶æ ã§éå§ããŸãã
- 倿°ãéžæããŸãã å€ãå²ãåœãŠã倿°ãéžæããŸããããŸããŸãªå€æ°éžææŠç¥ããããŸãïŒäŸïŒæ®ãã®å¯èœãªå€ãæãå°ãªã倿°ãéžæãããå¥åæå°æ®åå€ïŒMRVïŒãã¥ãŒãªã¹ãã£ãã¯ïŒã
- å¯èœãªå€ãç¹°ãè¿ããŸãã éžæãã倿°ã®ãã¡ã€ã³å€ãç¹°ãè¿ããŸãã
- å¶çŽã®å è¶³ã確èªããŸãã åå€ã«ã€ããŠãããã倿°ã«å²ãåœãŠãããšã§ããã¹ãŠã®å¶çŽãæºãããããã©ããã確èªããŸãã
- å¶çŽãæºããããŠããå ŽåïŒ
- 倿°ãå€ã«å²ãåœãŠãŸãã
- ããã¯ãã©ããã³ã°ã¢ã«ãŽãªãºã ãååž°çã«åŒã³åºããŠãæ®ãã®æªå²ãåœãŠå€æ°ã«å€ãå²ãåœãŠãŸãã
- ååž°åŒã³åºããè§£ãè¿ãå Žåã¯ããã®è§£ãè¿ããŸãã
- å¶çŽãæºããããªãå ŽåããŸãã¯ååž°åŒã³åºãã§è§£ãèŠã€ãããªãå ŽåïŒ
- 倿°ã®ãã¡ã€ã³ã®æ¬¡ã®å€ã詊ããŸãã
- ãã¹ãŠã®å€ã䜿ãæããããå ŽåïŒ åã®å€æ°ã«ããã¯ãã©ãã¯ããŠãå¥ã®å²ãåœãŠã詊ããŸãããã¹ãŠã®å€æ°ã«å¯ŸããŠãã¹ãŠã®å¯èœãªå²ãåœãŠã詊ã¿ãããè§£ãèŠã€ãããªãå ŽåãCSPã«ã¯è§£ããããŸããã
Pythonã®å®è£ ïŒã·ã³ãã«ãªCSPã解決ãã
Pythonã§ã·ã³ãã«ãªCSPãœã«ããŒãå®è£ ããŠã¿ãŸãããã3ã€ã®åœïŒAãBãCïŒãš2ã€ã®è²ïŒèµ€ãšéïŒã®å°ããªå°å³ã®åœ©è²åé¡ãèããŸããå¶çŽã¯æ¬¡ã®ãšããã§ããAãšBã¯åãè²ãæã€ããšãã§ãããBãšCã¯åãè²ãæã€ããšãã§ããŸããã
def is_safe(variable, value, assignment, constraints):
for constraint in constraints:
if constraint[0] == variable:
neighbor = constraint[1]
if neighbor in assignment and assignment[neighbor] == value:
return False
elif constraint[1] == variable:
neighbor = constraint[0]
if neighbor in assignment and assignment[neighbor] == value:
return False
return True
def solve_csp(variables, domains, constraints, assignment={}):
if len(assignment) == len(variables):
return assignment # All variables assigned; solution found
unassigned_variable = next((var for var in variables if var not in assignment), None)
if unassigned_variable is None: # Should never reach here
return None
for value in domains[unassigned_variable]:
if is_safe(unassigned_variable, value, assignment, constraints):
assignment[unassigned_variable] = value
result = solve_csp(variables, domains, constraints, assignment)
if result is not None:
return result
# Backtrack if the recursive call fails
del assignment[unassigned_variable] # Remove the assignment
return None # No solution found for this variable
# Example usage:
variables = ['A', 'B', 'C']
domains = {
'A': ['red', 'blue'],
'B': ['red', 'blue'],
'C': ['red', 'blue']
}
constraints = [('A', 'B'), ('B', 'C')]
solution = solve_csp(variables, domains, constraints)
if solution:
print("Solution:", solution)
else:
print("No solution found.")
説æïŒ
- `is_safe(variable, value, assignment, constraints)`ïŒ ãã®é¢æ°ã¯ã`value`ã`variable`ã«å²ãåœãŠãã®ãå®å šãã©ãããã€ãŸããçŸåšã®`assignment`ãèæ ®ããŠãå¶çŽã«éåããªããã©ããããã§ãã¯ããŸãã
- `solve_csp(variables, domains, constraints, assignment)`ïŒ ããã¯ãã³ã¢ã®ããã¯ãã©ããã³ã°é¢æ°ã§ããããã¯ãç°ãªãå€ã®å²ãåœãŠãååž°çã«è©ŠããŸãã
- `variables`ã¯åœã§ãã
- `domains`ã¯ãååœã®å¯èœãªè²ã衚ããŸãã
- `constraints`ã¯ãåãè²ãæã€ããšãã§ããªãåœã®ãã¢ããªã¹ãããŸãã
ããã¯ãã©ããã³ã°ãšCSPã®ã°ããŒãã«ãªå¿çš
ããã¯ãã©ããã³ã°ãšCSPã¯ãäžçäžã®ããŸããŸãªåéãšã·ããªãªã§äœ¿çšãããŠããŸããããã«ããã€ãã®äŸã瀺ããŸãã
1. æ°ç¬ããºã«
æ°ç¬ã¯ãCSPã®å€å žçãªäŸã§ããã°ãªããå ã®åã»ã«ã¯å€æ°ã§ããããã¡ã€ã³ã¯1ãã9ãŸã§ã®æ°åã®ã»ããã§ããå¶çŽã«ã¯ãè¡ãåãããã³3x3ã®ãµãã°ãªãããå«ãŸããŸãã æ°ç¬ãœã«ããŒã¯ããã¯ãã©ããã³ã°ãé »ç¹ã«äœ¿çšããè€éãªçµã¿åããåé¡ã解決ããããšã®æå¹æ§ã瀺ããŠããŸãã æ°ç¬ã®äººæ°ã¯åœå¢ãè¶ããæ¥æ¬ããšãŒããããã¢ã¡ãªã«å€§éžã®ãã¬ãŒã€ãŒããã®ããºã«ã楜ããã§ããŸãã
2. å°å³ã®åœ©è²
äžèšã®äŸã«èŠãããããã«ãå°å³ã®åœ©è²ã¯å žåçãªCSPã§ããç®æšã¯ã飿¥ããå°åãåãè²ãå ±æããªãããã«ãæå°æ°ã®è²ã§å°å³ã圩è²ããããšã§ããããã¯ãå°å³èšèšããªãœãŒã¹å²ãåœãŠãããã³äžçäžã§ééããããŸããŸãªæé©ååé¡ã«å¿çšã§ããŸãã
3. ã¹ã±ãžã¥ãŒãªã³ã°ãšæéå²
ã€ãã³ããã¯ã©ã¹ããŸãã¯ãªãœãŒã¹ã®ã¹ã±ãžã¥ãŒã«ãäœæããã«ã¯ãCSPæè¡ãé »ç¹ã«é¢äžããŸãã倿°ã¯ãã¿ã€ã ã¹ããããŸãã¯ãªãœãŒã¹ã衚ãããšãã§ãããã¡ã€ã³ã¯ã¢ã¯ãã£ããã£ãŸãã¯å©çšå¯èœãªãªãœãŒã¹ã衚ãããšãã§ããå¶çŽã«ã¯å¯çšæ§ãç«¶åãããã³åªå é äœãå«ããããšãã§ããŸããäžçäžã®æè²æ©é¢ïŒç±³åœã®å€§åŠããã€ã³ãã®åŠæ ¡ãŸã§ïŒã¯ãã¹ã±ãžã¥ãŒãªã³ã°ã¢ã«ãŽãªãºã ã䜿çšããŠããªãœãŒã¹ãå¹ççã«å²ãåœãŠãŠããŸãã
4. ãããã¯ãŒã¯æ§æ
ãããã¯ãŒã¯æ§æãç¹ã«å€§èŠæš¡ã§å°ççã«å€æ§ãªãããã¯ãŒã¯ã§ã¯ãCSPãšããŠå®åŒåã§ããŸãã倿°ã¯ããããã¯ãŒã¯ããã€ã¹ããã¡ã€ã³ã¯æ§æèšå®ãå¶çŽã¯ãããã¯ãŒã¯ããããžã垯åå¹ ã®å¶éãããã³ã»ãã¥ãªãã£ããªã·ãŒã衚ãå ŽåããããŸããåœéãããã¯ãŒã¯ã管çããäŒæ¥ã¯ãCSPãœã«ããŒã䜿çšããŠããããã¯ãŒã¯ããã©ãŒãã³ã¹ãæé©åããåœå¢ãè¶ããæ¥ç¶ã確ä¿ããŠããŸãã
5. ãªãœãŒã¹å²ãåœãŠ
ãªãœãŒã¹ïŒäººå¡ãèšåã財åïŒã®å²ãåœãŠã¯ãäžçå ±éã®èª²é¡ã§ãã CSPã¯ãããã®åé¡ãã¢ãã«åã§ãã倿°ã¯ãªãœãŒã¹ã衚ãããã¡ã€ã³ã¯å¯èœãªå²ãåœãŠã衚ããå¶çŽã¯å¯çšæ§ãèŠä»¶ãããã³äºç®ã衚ããŸããäžçäžã®æ¿åºæ©é¢ïŒæ¬§å·é£åããã¢ããªã«ã®åœå®¶æ©é¢ãŸã§ïŒã¯ããªãœãŒã¹å²ãåœãŠã䜿çšããŠç®æšãéæããŠããŸãã
6. ãã€ãªã€ã³ãã©ããã£ã¯ã¹
ãã€ãªã€ã³ãã©ããã£ã¯ã¹ã§ã¯ãCSPã¯ãã¿ã³ãã¯è³ªãã©ãŒã«ãã£ã³ã°äºæž¬ãDNAã·ãŒã±ã³ã·ã³ã°ãããã³ç³»çµ±æš¹ã®æ§ç¯ãªã©ã®ã¿ã¹ã¯ã«äœ¿çšãããŸãããããã®åé¡ã«ã¯ãåºå€§ãªæ€çŽ¢ç©ºéãšè€éãªå¶çŽãå«ãŸããŠãããããã¯ãã©ããã³ã°ã¯äžå¯æ¬ ãªããŒã«ãšãªã£ãŠããŸãã倧éžäžã®ç ç©¶è ã¯ãçç©åŠççºèŠã«CSPã䜿çšããŠããŸãã
7. æå·å
ç¹å®ã®æå·ããºã«ãšã³ãŒãè§£èªã·ããªãªã¯ãCSPãšããŠãã¬ãŒã åã§ããŸãã倿°ã¯ãæåãŸãã¯ãããããã¡ã€ã³ã¯å¯èœãªå€ãå¶çŽã¯æåãŸãã¯ã³ã³ããŒãã³ãéã®é¢ä¿ã«ãªãå¯èœæ§ããããŸããæå·åã¯ãäžçäžã®ããžã¿ã«æ å ±ãä¿è·ããããã®éèŠãªåŽé¢ã§ãã
é«åºŠãªãã¯ããã¯ãšãã¥ãŒãªã¹ãã£ãã¯
åºæ¬çãªããã¯ãã©ããã³ã°ã¢ã«ãŽãªãºã ã¯åºç€ãæäŸããŸãããããã€ãã®ãã¯ããã¯ã¯å¹çãåäžãããããšãã§ããŸãããããã®ãã¯ããã¯ã¯åºã䜿çšãããŠãããããã©ãŒãã³ã¹ãæé©åããããã«äžçäžã§ç¶ç¶çã«ç ç©¶ãããŠããŸãã
- 倿°é åºä»ããã¥ãŒãªã¹ãã£ãã¯ïŒ
- æå°æ®åå€ïŒMRVïŒïŒ ãã¡ã€ã³ã«æ®ãã®å¯èœãªå€ãæãå°ãªã倿°ãéžæããŸããããã«ãããæ€çŽ¢ã®æ©ã段éã§åå²ä¿æ°ãåæžãããŸãã
- 床ãã¥ãŒãªã¹ãã£ãã¯ïŒ ä»ã®æªå²ãåœãŠå€æ°ãšã®æãå€ãã®å¶çŽã«é¢ä¿ãã倿°ãéžæããŸãã
- å€é åºä»ããã¥ãŒãªã¹ãã£ãã¯ïŒ
- å¶çŽã®å°ãªãå€ïŒ 倿°ã«å€ãå²ãåœãŠããšãã¯ãä»ã®å€æ°ã®å¶çŽãæãå°ãªãå€ãéžæããŸãã
- å¶çŽäŒæ¬ïŒ ãã©ã¯ãŒããã§ãã¯ãã¢ãŒã¯æŽåæ§ãªã©ã®ææ³ã¯ãããã¯ãã©ããã³ã°ã®åã«ãæªå²ãåœãŠå€æ°ã®ãã¡ã€ã³ããççŸããå€ãåé€ããããšã«ãããæ€çŽ¢ç©ºéãåæžã§ããŸãã AC-3ãªã©ã®ã¢ãŒã¯æŽåæ§ã¢ã«ãŽãªãºã ã¯ãäžçäžã®CSPãœã«ããŒã®å®çªã§ãã
å®éçãªèæ ®äºé ãšæé©å
ããã¯ãã©ããã³ã°ãå®éã®CSPã«é©çšããå Žåãããã€ãã®å®éçãªèæ ®äºé ãéèŠã§ãã
- 衚çŸïŒ CSPã®è¡šçŸæ¹æ³ã¯ãããã©ãŒãã³ã¹ã«å€§ãã圱é¿ããŸãã倿°ããã¡ã€ã³ãå¶çŽãããã³å²ãåœãŠã«é©åãªããŒã¿æ§é ãéžæããããšãäžå¯æ¬ ã§ããããšãã°ãã¹ããŒã¹ãããªãã¯ã¹è¡šçŸã¯èšç®ãé«éåã§ããŸãã
- å¹çïŒ éšåçãªå²ãåœãŠãå¶çŽã«éåããŠãããã©ãããè¿ éã«å€æããããã«ã`is_safe`颿°ãæé©åããŸãã å¹ççãªå¶çŽãã§ãã¯ã¯ãããã¯ãã©ããã³ã°ã®å®è£ ã®ããã©ãŒãã³ã¹ãåçã«åäžãããŸãã
- ãã¹ããšãããã°ïŒ ããŸããŸãªå ¥åã§ã®åŸ¹åºçãªãã¹ããäžå¯æ¬ ã§ãã CSPãœã«ããŒã®ãããã°ã¯é£ããå Žåãããããã詳现ãªãã°ãšèŠèŠåããŒã«ãããã»ã¹ãæ¯æŽã§ããŸãã ãããã°ããŒã«ã¯ãäžçäžã®ãœãããŠã§ã¢éçºã®æšæºçãªæ £è¡ã§ãã
- ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ïŒ Pythonã®`constraint`ã¢ãžã¥ãŒã«ãªã©ã®ã©ã€ãã©ãªã¯ãäºåæ§ç¯ãããCSPãœã«ããŒãšæé©åæ©èœãæäŸããŸãã ã¢ã«ãŽãªãºã ã®ã³ã¢åçãçè§£ããªãããè»èŒªã®åçºæãé¿ããããã«ããããã®ã©ã€ãã©ãªã®äœ¿çšãæ€èšããŠãã ããã
- ã¹ã±ãŒã©ããªãã£ïŒ éåžžã«å€§èŠæš¡ãªCSPã®å Žåã忣ã³ã³ãã¥ãŒãã£ã³ã°ã䞊ååŠçãªã©ã®é«åºŠãªææ³ãæ¡çšããŠãæ€çŽ¢ããã»ã¹ãé«éåããããšãæ€èšããŠãã ããã
課é¡ãšå°æ¥ã®ãã¬ã³ã
ãã®åŒ·åãã«ãããããããããã¯ãã©ããã³ã°ã«ã¯éçããããç¹ã«éåžžã«å€§èŠæš¡ãŸãã¯è€éãªCSPã®å Žåã«ãããŸããããã¯ãã©ããã³ã°ã®ææªã®å Žåã®æéèšç®éã¯ææ°é¢æ°çã§ãããå Žåã«ãã£ãŠã¯éçŸå®çã«ãªãå¯èœæ§ããããŸããçŸåšã®ç ç©¶ãšå°æ¥ã®ãã¬ã³ãã¯ããããã®èª²é¡ã«å¯ŸåŠããããšãç®çãšããŠããŸãã
- ãã€ããªããã¢ã«ãŽãªãºã ïŒ åäžã®ã¢ãããŒãã®å¶éãå æããããã«ãããã¯ãã©ããã³ã°ãããŒã«ã«æ€çŽ¢ãéºäŒçã¢ã«ãŽãªãºã ããŸãã¯æ©æ¢°åŠç¿ãªã©ã®ä»ã®ææ³ãšçµã¿åãããŸãã
- 䞊åããã³åæ£CSPã®è§£æ±ºïŒ æ€çŽ¢ç©ºéãè€æ°ã®ããã»ããµãŸãã¯ãã·ã³ã«åæ£ããŠãããã©ãŒãã³ã¹ãåäžãããŸãã
- å¶çŽåŠç¿ïŒ ããŒã¿ããå¶çŽãèªåçã«åŠç¿ããŠãCSPãœã«ããŒã®ããã©ãŒãã³ã¹ãåäžãããŸãã
- æ°èåéãžã®å¿çšïŒ ããããå·¥åŠãèªåŸã·ã¹ãã ãã¢ãã®ã€ã³ã¿ãŒããããªã©ãCSPãšããã¯ãã©ããã³ã°ã®äœ¿çšãæ°ãããã¡ã€ã³ã«æ¡åŒµããŸãã
çµè«ïŒããã¯ãã©ããã³ã°ã®åãåãå ¥ãã
ããã¯ãã©ããã³ã°ã¯ãå¶çŽå è¶³åé¡ã解決ããããã®åºæ¬çãªã¢ã«ãŽãªãºã ã§ãããã®å€çšéæ§ã«ãããæ°ç¬ããºã«ããè€éãªãªãœãŒã¹å²ãåœãŠãšã¹ã±ãžã¥ãŒãªã³ã°ã®åé¡ãŸã§ãäžçäžã®åé¡ã«é©çšã§ããŸãã Pythonã®æç¢ºãªæ§æãšå ç¢ãªã©ã€ãã©ãªã¯ãããã¯ãã©ããã³ã°ãœãªã¥ãŒã·ã§ã³ãå®è£ ããŠæ¢çŽ¢ããããã®çæ³çãªéžæè¢ã§ããåºæ¬ååãæé©åæè¡ãããã³ãã®åéã®ç¶ç¶çãªéçºãçè§£ããããšã§ãããã¯ãã©ããã³ã°ã®åãæŽ»çšããŠåé¡ã解決ããã€ãããŒã·ã§ã³ã«è²¢ç®ããããŸããŸãªã°ããŒãã«ç£æ¥ã§æææ±ºå®ãæ¹åã§ããŸãã
ãã®ã¬ã€ãã§ã¯ãCSPã®Pythonããã¯ãã©ããã³ã°ãçè§£ããŠå®è£ ããããã®ãã£ãããšããåºç€ãæäŸããŸãããããŸããŸãªäŸãæ¢çŽ¢ããããŸããŸãªãã¥ãŒãªã¹ãã£ãã¯ã詊ããŠãå¶çŽå è¶³ã®äžçãæ·±ãæãäžããŠããã®è²Žéãªãã¯ããã¯ã®å¯èœæ§ãæå€§éã«åŒãåºãããšãå¿ããªãã§ãã ããã å¶çŽå è¶³åé¡ã«å¯ŸåŠã§ããèœåã¯ã仿¥ã®ããŒã¿é§ååã§ã°ããŒãã«ã«çžäºæ¥ç¶ãããäžçã«ãããŠè²Žéãªè³ç£ã§ãã