ปัญหาการจัดหมวดหมู่ใดที่ปรากฏในส่วนเกมลอจิกของ LSAT

แก้ไข: ดู การแก้ปัญหาใครเป็นเจ้าของ Zebra โดยทางโปรแกรม สำหรับปัญหาประเภทเดียวกัน

มีปัญหาตรรกะหมวดหมู่หนึ่งใน LSAT ที่มีลักษณะดังนี้:

เจ็ดช่วงเวลาติดต่อกันสำหรับการออกอากาศ เรียงตามลำดับเวลา I ถึง 7 จะเต็มไปด้วยเทปเพลงหกเทป ได้แก่ G, H, L, O, P, S และเทปข่าวหนึ่งรายการ แต่ละเทปจะต้องถูกกำหนดให้กับช่วงเวลาที่แตกต่างกัน และไม่มีเทปใดที่ยาวกว่าเทปอื่นๆ การออกอากาศอยู่ภายใต้ข้อจำกัดต่อไปนี้:
L จะต้องเล่นทันทีก่อน O.
เทปข่าวจะต้องเล่นในบางครั้งหลังจาก L.
จะต้องมีช่วงเวลาสองช่วงเวลาอย่างแน่นอนระหว่าง G และ P, โดยไม่คำนึงว่า G มาก่อน P หรือ G มาก่อน P

ฉันสนใจที่จะสร้างรายการการเรียงสับเปลี่ยนที่ตรงตามเงื่อนไขเพื่อใช้ในการศึกษาเพื่อทดสอบและเป็นความท้าทายด้านการเขียนโปรแกรม อย่างไรก็ตาม ฉันไม่แน่ใจว่านี่เป็นปัญหาการเรียงสับเปลี่ยนระดับใด ฉันได้สรุปปัญหาประเภทดังนี้:

รับอาร์เรย์ความยาว n A:

  1. ชุดของรายการที่ไม่ซ้ำกัน n รายการสามารถจัดเรียงภายใน A ได้กี่วิธี? เช่น. การจัดเรียง ABCDEFG ใหม่มีกี่วิธี?
  2. หากความยาวของชุดสิ่งของที่ไม่ซ้ำกันน้อยกว่าความยาวของ A จะสามารถจัดเรียงชุดภายใน A ได้กี่วิธีหากรายการในชุดอาจเกิดขึ้นมากกว่าหนึ่งครั้ง เช่น. ABCDEF => AABCDEF; ABBCDEF ฯลฯ
  3. ชุดไอเท็มที่ไม่ซ้ำสามารถจัดเรียงภายใน A ได้กี่วิธีหากไอเท็มในชุดอยู่ภายใต้ "เงื่อนไขการบล็อก"

ความคิดของฉันคือการเข้ารหัสข้อจำกัดแล้วใช้บางอย่างเช่น itertools ของ Python เพื่อสร้างการเรียงสับเปลี่ยน ยินดีรับฟังความคิดและข้อเสนอแนะ


person Merjit    schedule 25.04.2010    source แหล่งที่มา
comment
LSAT คืออะไร? จากข้อมูลของ Google มันคือการทดสอบการรับเข้าโรงเรียนกฎหมาย แต่ดูเหมือนว่าจะไม่น่าเป็นไปได้ในบริบทนี้ กรุณาอย่าใช้คำย่อที่ไม่ชัดเจนโดยไม่อธิบายหรือให้ URL   -  person Dave Kirby    schedule 25.04.2010
comment
LSAT ที่ฉันพูดถึงคือแบบทดสอบการรับเข้าโรงเรียนกฎหมายจริงๆ ส่วนหนึ่งประกอบด้วยเกมลอจิกเหมือนกับเกมที่ฉันอ้างถึงข้างต้น - เป้าหมายของฉันคือการกำหนดจำนวนวิธีแก้ปัญหาที่เป็นไปได้สำหรับปริศนาแต่ละอัน   -  person Merjit    schedule 25.04.2010


คำตอบ (2)


เอาล่ะ เท่าที่ฉันเห็น มีสองวิธีในการแก้ไขปัญหานี้:

  1. ไปเกี่ยวกับการเขียนโปรแกรมที่จะแก้ไขปัญหานี้ก่อน นี่จะเป็นเรื่องยาก

  2. แต่การเรียงสับเปลี่ยนสอนเราว่าวิธีที่ง่ายกว่าคือนับการเรียงสับเปลี่ยนทั้งหมดแล้วลบอันที่ไม่เป็นไปตามข้อจำกัดของคุณ

ฉันจะไปกับหมายเลข 2

คุณสามารถค้นหาการเรียงสับเปลี่ยนทั้งหมดของสตริงหรือรายการที่ระบุได้โดยใช้อัลกอริทึมนี้ เมื่อใช้อัลกอริธึมนี้ คุณจะได้รับรายการการเรียงสับเปลี่ยนทั้งหมด ตอนนี้คุณสามารถใช้ตัวกรองจำนวนหนึ่งในรายการนี้ได้โดยตรวจสอบข้อจำกัดต่างๆ ของปัญหา

def L_before_O(s):
    return (s.index('L') - s.index('O') == 1)

def N_after_L(s):
    return (s.index('L') < s.index('N'))

def G_and_P(s):
    return (abs(s.index('G') - s.index('P')) == 2)

def all_perms(s):    #this is from the link
    if len(s) <=1:
        yield s
    else:
        for perm in all_perms(s[1:]):
            for i in range(len(perm)+1):
                yield perm[:i] + s[0:1] + perm[i:]

def get_the_answer():
    permutations = [i for i in all_perms('GHLOPSN')] #N is the news tape
    a = [i for i in permutations if L_before_O(i)]
    b = [i for i in a if N_after_L(i)]
    c = [i for i in b if G_and_P(i)]
    return c

ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่นี่เป็นแนวคิดทั่วไปว่าฉันจะเขียนโค้ดคำถามดังกล่าวอย่างไร

หวังว่านี่จะช่วยได้

person inspectorG4dget    schedule 25.04.2010
comment
นี่เป็นคำตอบที่ยอดเยี่ยมสำหรับคำถามที่ 1 และ 3 และเป็นวิธีการเข้ารหัสข้อจำกัดของเกมที่ยอดเยี่ยม! อย่างไรก็ตาม ฉันยังไม่รู้เกี่ยวกับวิธีนับการเรียงสับเปลี่ยนในกรณีของคำถามที่ 2 โดยที่คุณได้รับอนุญาตให้เพิ่มตัวแปรเป็นสองเท่าเพื่อเติมจำนวนตำแหน่งที่มีอยู่ในเมทริกซ์ - person Merjit; 25.04.2010
comment
โดยทางโปรแกรมคุณสามารถทำได้ len(c) นั่นจะส่งคืนจำนวนการเรียงสับเปลี่ยนที่ถูกต้องดังกล่าว อย่างไรก็ตาม หากคำถามของคุณคือฉันจะทำด้วยมือได้อย่างไร ฉันรู้วิธีการทำเช่นนี้ แต่ฉันไม่รู้ว่าจะเขียนอย่างไรที่นี่ โพสต์ความคิดเห็นเพื่อแจ้งให้ฉันรู้ว่านี่คือสิ่งที่คุณต้องการหรือไม่ และในกรณีนี้ ฉันจะทำมันด้วยมือบนกระดาษและสแกนมันและวางไว้บนเว็บไซต์ของฉันและโพสต์ลิงก์ที่นี่ - person inspectorG4dget; 26.04.2010
comment
นั่นคือสิ่งที่ฉันกำลังมองหา ฉันใช้สิ่งนี้เป็นโอกาสในการเรียนรู้เกี่ยวกับวิชาคณิตศาสตร์ที่ฉันไม่ค่อยรู้มาก่อน ดังนั้นข้อมูลเพิ่มเติมใดๆ ก็มีประโยชน์ ฉันสนใจปัญหาที่ 2 เป็นพิเศษเพราะมันปรากฏบ่อยครั้งเหมือนเป็นปริศนา LSAT ขอบคุณ! - person Merjit; 27.04.2010
comment
ฉันขอโทษที่มันนานมากแล้ว ฉันไม่ลืมเกี่ยวกับปัญหา ฉันแก้ไขมันแล้วและตอนนี้กำลังมองหาสแกนเนอร์ที่สามารถใช้ได้ ฉันหวังว่าจะสามารถอัปโหลดสิ่งนี้ได้ภายในวันจันทร์ - person inspectorG4dget; 02.05.2010
comment
ขอบคุณ! ฉันซาบซึ้งจริงๆ - person Merjit; 03.05.2010
comment
ฉันเขียนคำตอบลงในกระดาษสองแผ่นและดูได้ที่: individual utoronto.ca/ashtopgun/Hobbyism/StackOverflow/ นี่คือเว็บไซต์ส่วนตัวของฉัน และฉันจะขอบคุณการเข้าชมบางส่วนหากไม่ได้ขอมากเกินไป - person inspectorG4dget; 04.05.2010

นี่เป็นเรื่องง่ายที่จะแก้ไข (โค้ดไม่กี่บรรทัด) ในฐานะโปรแกรมจำนวนเต็ม การใช้เครื่องมือเช่น GNU Linear Programming Kit คุณจะระบุข้อจำกัดของคุณในลักษณะที่ประกาศและ ให้นักแก้ปัญหาคิดหาทางออกที่ดีที่สุด ต่อไปนี้คือตัวอย่างของโปรแกรม GLPK

คุณสามารถเขียนโค้ดนี้ได้โดยใช้ภาษาการเขียนโปรแกรมทั่วไป เช่น Python แต่นี่คือสิ่งที่คุณจะได้เห็นในสองสามบทแรกของหนังสือเรียนการเขียนโปรแกรมจำนวนเต็ม อัลกอริธึมที่มีประสิทธิภาพสูงสุดได้ถูกกำหนดโดยผู้อื่นแล้ว

แก้ไข: เพื่อตอบคำถามของ Merjit:

กำหนด:

  1. เมทริกซ์ Y โดยที่ Y_(ij) = 1 หากเล่นเทป i ก่อนเทป j และ 0 มิฉะนั้น
  2. เวกเตอร์ C โดยที่ C_i ระบุช่วงเวลาเมื่อฉันเล่น (เช่น 1,2,3,4,5,6,7)
  3. ค่าคงที่ขนาดใหญ่ M (ค้นหาคำว่า "big M" ในตำราการปรับให้เหมาะสม)

ลดผลรวมของเวกเตอร์ C ให้เหลือน้อยที่สุดตามข้อจำกัดต่อไปนี้:

Y_(ij) != Y_(ji) // If i is before j, then j must not be before i
C_j < C_k + M*Y_(kj) // the time slot of j is greater than the time slot of k only if Y_(kj) = 1
C_O - C_L = 1 // L must be played immediately before O
C_N > C_L // news tape must be played at some time after L
|C_G - C_P| = 2 // You will need to manipulate this a bit to make it a linear constraint

นั่นน่าจะพาคุณไปได้ไกลที่สุด คุณต้องการเขียนข้อจำกัดข้างต้นในไวยากรณ์ของภาษา MathProg (ดังที่แสดงในลิงก์) และตรวจสอบให้แน่ใจว่าฉันไม่ได้ละทิ้งข้อจำกัดใดๆ จากนั้นเรียกใช้โปรแกรมแก้ปัญหา GLPK บนข้อจำกัดแล้วดูว่าเกิดอะไรขึ้น

person RexE    schedule 25.04.2010
comment
ฉันคิดว่าการเขียนโปรแกรมจำนวนเต็มน่าจะเป็นวิธีที่ดีที่สุดในการสร้างชุดวิธีแก้ปัญหาทั่วไปสำหรับปัญหาประเภทนี้ แต่ฉันไม่แน่ใจว่าจะเข้ารหัสเกมการเรียงลำดับเชิงเส้นเช่นนี้เป็นปัญหาการปรับให้เหมาะสมได้อย่างไร ฉันจะวางค่าสัมประสิทธิ์ของค่าไว้ที่ไหน/อย่างไร? - person Merjit; 25.04.2010