Thursday, January 29, 2026

Zebra Puzzle as CSP

နည်းသစ်ဉာဏ်ရည်တုပညာမိတ်ဆက်၊ အခန်း (၅)၊ ကန့်သတ်ချက်ပြေလည်စေရသော ပြဿနာများ၊ လေ့ကျင့်ခန်းများ (မေးခွန်း နှင့် အဖြေများ)၊ ပုစ္ဆာ အမှတ် ၅.၃၊ စာ-၂၆၀ ကိုကြည့်ပါ။ 

ဤပရိုဂရမ်အလုပ်လုပ်နိုင်စေရန် python-constraint package လိုအပ်ပါသည်။

Windows 11 ပေါ်ရှိ Spyder IDE တွင် python-constraint package ကို install လုပ်ရန် အလွယ်ကူဆုံး နည်းလမ်း။

နည်းလမ်း (၁) - Spyder အတွင်းမှ တိုက်ရိုက် Install ပြုလုပ်နည်း (အလွယ်ဆုံးနည်းလမ်း)

Spyder ဖွင့်ထားရင်းနဲ့ ပရိုဂရမ်အပြင်ထွက်စရာမလိုဘဲ Console ကနေ တိုက်ရိုက်သွင်းနိုင်ပါတယ်။

  1. Spyder ကို ဖွင့်ပါ။

  2. မျက်နှာပြင်ရဲ့ ညာဘက်အောက်ထောင့်နားမှာရှိတဲ့ IPython Console (အမည်းရောင် သို့မဟုတ် အဖြူရောင် စာရိုက်ကွက်) ကို ကြည့်ပါ။

  3. ထို Console တွင် အောက်ပါ Command ကို ရိုက်ထည့်ပြီး Enter ခေါက်ပါ။ (ရှေ့ဆုံးက ! သင်္ကေတ ပါရပါမယ်)

    !pip install python-constraint
    
  4. ကွန်ပျူတာက Internet ချိတ်ထားရင် download ဆွဲပြီး install လုပ်သွားပါလိမ့်မယ်။ Successfully installed python-constraint... ဆိုပြီး စာပေါ်လာရင် ရပါပြီ။


နည်းလမ်း (၂) - Anaconda Prompt မှတဆင့် Install ပြုလုပ်နည်း (ပိုမိုသေချာသောနည်းလမ်း)

ပထမနည်းလမ်းနဲ့ အဆင်မပြေရင် (သို့မဟုတ်) Error တက်နေရင် ဒီနည်းလမ်းကို သုံးပါ။

  1. ကွန်ပျူတာရဲ့ Start Menu (Windows Key) ကို နှိပ်ပါ။

  2. Search box မှာ "Anaconda Prompt" လို့ ရိုက်ရှာပြီး ဖွင့်လိုက်ပါ။ (အမည်းရောင် box ပေါ်လာပါမယ်)။

  3. အဲဒီ Box ထဲမှာ အောက်ပါစာကို ရိုက်ထည့်ပြီး Enter ခေါက်ပါ။

    pip install python-constraint
  4. Install လုပ်ပြီးသွားရင် Box ကို ပိတ်လိုက်ပြီး Spyder ကို ပြန်ဖွင့် (Restart) လိုက်ပါ။




Install ဖြစ်မဖြစ် စမ်းသပ်ခြင်း

Install လုပ်ပြီးသွားရင် သေချာမသေချာ စစ်ဆေးဖို့အတွက် Spyder မှာ အောက်ပါ ကုဒ်တိုလေးကို ရိုက်ပြီး Run ကြည့်လိုက်ပါ။

Python
import constraint
print("Installation Successful!")

Error မတက်ဘဲ "Installation Successful!" လို့ ပေါ်လာရင်တော့ python-constraint ကို စတင်အသုံးပြုပြီး မြင်းကျားပဟေဠိကို ဖြေရှင်းနိုင်ပါပြီ။


from constraint import *
def solve_zebra_puzzle():
    # ၁။ Knowledge Base အဖြစ် Problem ကို စတင်တည်ဆောက်ခြင်း
    problem = Problem()
    # ၂။ Variables (ကိန်းရှင်များ) သတ်မှတ်ခြင်း
    # အိမ်နံပါတ် ၁ မှ ၅ ထိ (Domain)
    houses = [1, 2, 3, 4, 5]
    # အရည်အသွေးများ (Attributes)
    nationalities = ["English", "Spaniard", "Irish", "Nigerian", "Japanese"]
    colors = ["Red", "Green", "Ivory", "Yellow", "Blue"]
    drinks = ["Coffee", "Tea", "Milk", "Orange Juice", "Water"]
    pets = ["Dog", "Snails", "Fox", "Horse", "Zebra"]
    sports = ["Cricket", "Go", "Judo", "Poker", "Polo"] # မူရင်းပဟေဠိ၏ ဆေးလိပ်အစား အားကစားဖြင့် အစားထိုးထားသည်
    all_variables = nationalities + colors + drinks + pets + sports
    # Variable တစ်ခုစီသည် အိမ်နံပါတ် ၁ မှ ၅ အတွင်းသာ ရှိရမည်
    problem.addVariables(all_variables, houses)
    # ၃။ Constraints (ကန့်သတ်ချက်များ) ထည့်သွင်းခြင်း
    
    # အိမ်တစ်အိမ်စီတွင် အရောင်၊ လူမျိုး၊ အချိုရည်၊ တိရစ္ဆာန်၊ အားကစား တစ်မျိုးစီသာ ရှိရမည် (AllDifferent)
    problem.addConstraint(AllDifferentConstraint(), nationalities)
    problem.addConstraint(AllDifferentConstraint(), colors)
    problem.addConstraint(AllDifferentConstraint(), drinks)
    problem.addConstraint(AllDifferentConstraint(), pets)
    problem.addConstraint(AllDifferentConstraint(), sports)
    # ပေးထားသော အချက်အလက်များ (Facts) ကို ထည့်သွင်းခြင်း
    # ၁။ အင်္ဂလိပ်လူမျိုးသည် အနီရောင်အိမ်တွင် နေထိုင်သည်။
    problem.addConstraint(lambda eng, red: eng == red, ("English", "Red"))
    # ၂။ စပိန်လူမျိုးသည် ခွေးတစ်ကောင် ပိုင်ဆိုင်သည်။
    problem.addConstraint(lambda span, dog: span == dog, ("Spaniard", "Dog"))
    # ၃။ အစိမ်းရောင်အိမ်ရှိ လူသည် ကော်ဖီ သောက်သည်။
    problem.addConstraint(lambda green, coffee: green == coffee, ("Green", "Coffee"))
    # ၄။ အိုင်းရစ်လူမျိုးသည် လက်ဖက်ရည် သောက်သည်။
    problem.addConstraint(lambda irish, tea: irish == tea, ("Irish", "Tea"))
    # ၅။ အစိမ်းရောင်အိမ်သည် ဆင်စွယ်ရောင်အိမ်၏ ညာဘက်တွင် တည်ရှိသည်။ (Green = Ivory + 1)
    problem.addConstraint(lambda green, ivory: green == ivory + 1, ("Green", "Ivory"))
    # ၆။ ဂိုး-GO ကစားသမားသည် ခရုများ ပိုင်ဆိုင်သည်။
    problem.addConstraint(lambda go, snails: go == snails, ("Go", "Snails"))
    # ၇။ အဝါရောင်အိမ်ရှိ လူသည် ကရစ်ကက် ကစားသည်။
    problem.addConstraint(lambda yellow, cricket: yellow == cricket, ("Yellow", "Cricket"))
    # ၈။ အလယ်အိမ် (တတိယအိမ်) တွင် နေထိုင်သူသည် နွားနို့ သောက်သည်။
    problem.addConstraint(lambda milk: milk == 3, ("Milk",))
    # ၉။ နိုင်ဂျီးရီးယားလူမျိုးသည် ပထမအိမ် (အိမ်နံပါတ် ၁) တွင် နေထိုင်သည်။
    problem.addConstraint(lambda nigerian: nigerian == 1, ("Nigerian",))
    # ၁၀။ ဂျူဒိုကစားသမားသည် မြေခွေးပိုင်ဆိုင်သူ၏ အိမ်ဘေးကပ်လျက် နေထိုင်သည်။ (Next to means abs(a-b) == 1)
    problem.addConstraint(lambda judo, fox: abs(judo - fox) == 1, ("Judo", "Fox"))
    # ၁၁။ ကရစ်ကတ်ကစားသမားသည် မြင်းပိုင်ဆိုင်သူ၏ အိမ်ဘေးကပ်လျက်တွင် နေထိုင်သည်။
    problem.addConstraint(lambda cricket, horse: abs(cricket - horse) == 1, ("Cricket", "Horse"))
    # ၁၂။ ပိုကာကစားသမားသည် လိမ္မော်ရည် သောက်သည်။
    problem.addConstraint(lambda poker, oj: poker == oj, ("Poker", "Orange Juice"))
    # ၁၃။ ဂျပန်လူမျိုးသည် ပိုလို ကစားသည်။
    problem.addConstraint(lambda japanese, polo: japanese == polo, ("Japanese", "Polo"))
    # ၁၄။ နိုင်ဂျီးရီးယားလူမျိုးသည် အပြာရောင်အိမ်၏ အိမ်ဘေးကပ်လျက်တွင် နေထိုင်သည်။
    problem.addConstraint(lambda nigerian, blue: abs(nigerian - blue) == 1, ("Nigerian", "Blue"))
    # ၄။ အဖြေရှာခြင်း (Get Solution)
    solutions = problem.getSolutions()
    # ၅။ ရလာသော အဖြေကို ရှင်းလင်းစွာ ဖော်ပြခြင်း
    if not solutions:
        print("No solution found!")
    else:
        # အဖြေတစ်ခုတည်းသာ ထွက်လေ့ရှိသည်
        sol = solutions[0] 
        print(f"{'House':<10} {'Color':<10} {'Nation':<12} {'Drink':<15} {'Sport':<12} {'Pet':<10}")
        print("-" * 70)
        
        # အိမ်နံပါတ် ၁ မှ ၅ အထိ Loop ပတ်ပြီး စီခြင်း
        for i in range(1, 6):
            # လက်ရှိအိမ်နံပါတ် i နှင့် ကိုက်ညီသော variable များကို ရှာခြင်း
            c = [k for k, v in sol.items() if v == i and k in colors][0]
            n = [k for k, v in sol.items() if v == i and k in nationalities][0]
            d = [k for k, v in sol.items() if v == i and k in drinks][0]
            s = [k for k, v in sol.items() if v == i and k in sports][0]
            p = [k for k, v in sol.items() if v == i and k in pets][0]
            
            print(f"{i:<10} {c:<10} {n:<12} {d:<15} {s:<12} {p:<10}")
        print("\n--- Final Answer ---")
        # Zebra နှင့် Water ရှာခြင်း
        zebra_owner = [k for k, v in sol.items() if k in nationalities and sol[k] == sol["Zebra"]][0]
        water_drinker = [k for k, v in sol.items() if k in nationalities and sol[k] == sol["Water"]][0] # Water is implied as the remaining drink
        
        print(f"Zebra lives in the house of the: {zebra_owner}")
        print(f"The person who drinks Water is the: {water_drinker}")
if __name__ == "__main__":
    solve_zebra_puzzle()



No comments:

Post a Comment

Note: Only a member of this blog may post a comment.