ตัวอย่างสาขาจำนวนเต็มและวิธีแก้ปัญหาที่ถูกผูกไว้ สาขาและวิธีการผูกมัด ทฤษฎีกราฟ แก้ปัญหาพนักงานขายเดินทาง

คำอธิบายทั่วไป

แนวคิดทั่วไปของวิธีการสามารถอธิบายได้โดยใช้ตัวอย่างการค้นหาฟังก์ชันขั้นต่ำในชุด ค่าที่ยอมรับได้ตัวแปร ฟังก์ชันและตัวแปรสามารถมีลักษณะใดก็ได้ วิธีการแยกสาขาและผูกต้องใช้สองขั้นตอน: การแยกสาขาและการค้นหาการประมาณการ (ขอบเขต)

ขั้นตอน การแตกแขนงประกอบด้วยการแบ่งชุดค่าที่อนุญาตของตัวแปรออกเป็นส่วนย่อย (ชุดย่อย) ขนาดที่เล็กกว่า- ขั้นตอนนี้สามารถนำไปใช้ซ้ำกับภูมิภาคย่อยได้ ภูมิภาคย่อยที่เกิดขึ้นจะเกิดเป็นต้นไม้ที่เรียกว่า ต้นไม้ค้นหาหรือ ต้นไม้ที่มีกิ่งก้านและเขตแดน. นอตของแผนผังนี้คือพื้นที่ย่อยที่สร้างขึ้น (ชุดย่อยของชุดค่าตัวแปร)

ขั้นตอน การหาค่าประมาณประกอบด้วยการหาขอบเขตบนและล่างเพื่อแก้ปัญหาในโดเมนย่อยของค่าที่อนุญาตของตัวแปร

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

หากขอบเขตล่างของโหนดต้นไม้เกิดขึ้นพร้อมกับขอบเขตบน ค่านี้จะเป็นค่าต่ำสุดของฟังก์ชันและสามารถทำได้ในโดเมนย่อยที่เกี่ยวข้อง

แอปพลิเคชัน

วิธีการนี้ใช้เพื่อแก้ไขปัญหา NP-complete บางอย่าง เช่น:

ดูเพิ่มเติม

หมายเหตุ


มูลนิธิวิกิมีเดีย

2010.

    ดูว่า "วิธีสาขาและผูกมัด" ในพจนานุกรมอื่น ๆ คืออะไร:สาขาและวิธีการผูกมัด - - [Ya.N.Luginsky, M.S.Fezi Zhilinskaya, Yu.S.Kabirov พจนานุกรมภาษาอังกฤษเป็นภาษารัสเซียเกี่ยวกับวิศวกรรมไฟฟ้าและวิศวกรรมพลังงาน มอสโก] หัวข้อวิศวกรรมไฟฟ้า แนวคิดพื้นฐาน สาขา EN และวิธีการผูกมัด ...

    คู่มือนักแปลทางเทคนิควิธี - วิธีการ: วิธีการวัดปริมาณความชื้นของสารโดยอ้อม โดยขึ้นอยู่กับค่าคงที่ไดอิเล็กทริกของสารเหล่านี้กับปริมาณความชื้น ที่มา: RMG 75 2004:ระบบของรัฐ การจัดหาอาหาร...

    เส้นทางที่ดีที่สุดสำหรับพนักงานขายที่เดินทางผ่าน 15 เมืองที่ใหญ่ที่สุดในเยอรมนี เส้นทางที่ระบุสั้นที่สุดที่เป็นไปได้ทั้งหมด 43,589,145,600 ปัญหาพนักงานขายเดินทาง (TSP) (พนักงานขายเดินทาง ... Wikipedia

    คำนี้มีความหมายอื่น ดูที่ Overkill กำลังดุร้าย (หรือวิธีการ " กำลังดุร้าย", ภาษาอังกฤษ กำลังเดรัจฉาน) วิธีการแก้ปัญหา ปัญหาทางคณิตศาสตร์- อยู่ในคลาสของวิธีการในการค้นหาวิธีแก้ไขโดยหมดความเป็นไปได้ทั้งหมด... ... Wikipedia

    ตัวอย่างปัญหาเกี่ยวกับกระเป๋าเป้: จำเป็นต้องวางกล่องไว้ในกระเป๋าเป้ โดยความจุของกระเป๋าเป้คือ 15 กก. เพื่อให้สิ่งของในกระเป๋าเป้มีประโยชน์ใช้สอยสูงสุด ปัญหาเกี่ยวกับเป้ (backpack) (อังกฤษ... Wikipedia

    ปัญหาพนักงานขายที่เดินทาง (พนักงานขายที่เดินทาง) เป็นหนึ่งในปัญหาการปรับให้เหมาะสมแบบผสมผสานที่มีชื่อเสียงที่สุดปัญหาหนึ่ง ภารกิจคือการค้นหาเส้นทางที่ทำกำไรได้มากที่สุดที่ผ่านไป เมืองที่ระบุอย่างน้อยหนึ่งครั้งกับ... ... Wikipedia

    ปัญหาพนักงานขายที่เดินทาง (พนักงานขายที่เดินทาง) เป็นหนึ่งในปัญหาการปรับให้เหมาะสมแบบผสมผสานที่มีชื่อเสียงที่สุดปัญหาหนึ่ง ภารกิจคือการค้นหาเส้นทางที่ทำกำไรได้มากที่สุดผ่านเมืองที่ระบุอย่างน้อยหนึ่งครั้งทุกๆ... ... Wikipedia

    ปัญหาพนักงานขายที่เดินทาง (พนักงานขายที่เดินทาง) เป็นหนึ่งในปัญหาการปรับให้เหมาะสมแบบผสมผสานที่มีชื่อเสียงที่สุดปัญหาหนึ่ง ภารกิจคือการค้นหาเส้นทางที่ทำกำไรได้มากที่สุดผ่านเมืองที่ระบุอย่างน้อยหนึ่งครั้งทุกๆ... ... Wikipedia

    บทความนี้ไม่มีลิงก์ไปยังแหล่งข้อมูล ข้อมูลจะต้องสามารถตรวจสอบได้ มิฉะนั้นอาจถูกซักถามและลบทิ้ง คุณสามารถ... วิกิพีเดีย

หนังสือ

  • การพัฒนาเครื่องมือซอฟต์แวร์สำหรับค้นหาพอร์ตโฟลิโอที่เหมาะสมที่สุดของการซื้อขายส่งขององค์กรการค้า A. V. Mishchenko ในส่วนหนึ่งของงานนี้ เครื่องมือซอฟต์แวร์ได้รับการพัฒนาเพื่อแก้ปัญหาในการค้นหาพอร์ตโฟลิโอการจัดซื้อขายส่งที่เหมาะสมที่สุดสำหรับองค์กร ขายปลีก- ในกรณีนี้วิธีการแยกสาขาและ...

ลองพิจารณาปัญหาการเขียนโปรแกรมแบบแยกในรูปแบบทั่วไป:

ค้นหา -เวกเตอร์ของสิ่งแปลกปลอม, D- ไฟไนต์

ชุดของค่าที่ยอมรับได้ของเวกเตอร์นี้ F(x) คือฟังก์ชันวัตถุประสงค์ที่กำหนด

แนวคิดของวิธีนี้คือการแบ่งพาร์ติชัน D ออกเป็นชุดย่อยที่ไม่เป็นสมาชิกร่วม Di (ขั้นตอนนี้เรียกว่าการแยกสาขา) และคำนวณส่วนบนและ ขีดจำกัดล่าง ฟังก์ชั่นวัตถุประสงค์ในแต่ละชุดย่อย เราจะแสดงขีดจำกัดล่างด้วย H และขีดบนด้วย E ดังนั้น สวัสดี Eo เซตย่อยนี้จึงไม่มีจุดที่เหมาะสมที่สุดและสามารถแยกออกจากการพิจารณาเพิ่มเติมได้ หากขีดจำกัดบนคือ Ei H ให้แทนที่ H ด้วย min Hi หาก E=H ปัญหาจะได้รับการแก้ไข ไม่เช่นนั้นจำเป็นต้องดำเนินการขั้นตอนการแยกสาขาต่อไปและคำนวณขอบเขตบนและล่าง ในกรณีนี้ คุณสามารถแบ่งพาร์ติชันชุดย่อยทั้งหมดหรือบางส่วนได้ในขั้นตอนถัดไปจนกว่าจะบรรลุความเท่าเทียมกันของขอบเขตบนและล่าง และไม่ใช่บนชุดย่อยที่แยกจากกัน แต่สำหรับขอบเขตที่ยอมรับโดยรวม

แนวคิดง่ายๆ ของสาขาและวิธีผูกต้องมีการคำนวณเพิ่มเติมเพื่อกำหนดขอบเขต ตามกฎแล้ว สิ่งนี้นำไปสู่การแก้ไขปัญหาการปรับให้เหมาะสมเสริม หากการคำนวณเพิ่มเติมเหล่านี้จำเป็นต้องมีการดำเนินการจำนวนมาก ประสิทธิภาพของวิธีการนี้อาจต่ำ

โครงการ การเขียนโปรแกรมแบบไดนามิกเมื่อเคลื่อนที่จากจุดเริ่มต้นไปยังจุดสิ้นสุด (รูปที่ 5.1) สามารถแสดงเป็นขั้นตอนการแตกแขนงได้

ชุดของวิถีที่ยอมรับได้ทั้งหมด (ลำดับของการเปลี่ยนทีละขั้นตอน) คือชุดเริ่มต้น D ซึ่งเราต้องค้นหาขอบเขตล่างและบน เช่นเดียวกับวิถีที่ฟังก์ชันวัตถุประสงค์ไปถึงขอบเขตบนและประกาศ ค่าที่สอดคล้องกันของฟังก์ชันวัตถุประสงค์เป็นบันทึก การสร้างชุดสถานะที่ได้รับหลังจากขั้นตอนแรกคือสาขาแรก


ข้าว. 5.1.

ตอนนี้เซตย่อยของ Di คือเซตของวิถี ซึ่งแต่ละเซตจะผ่านจุดที่ i ที่สอดคล้องกัน

ในขั้นตอนต่อมา หลังจากปฏิเสธพาธทั้งหมดที่นำไปสู่สถานะ (i-oe) ใดๆ ยกเว้นสถานะเดียว เซ็ตย่อยที่เกี่ยวข้องจะเป็นพาธที่เหลืออยู่นี้โดยมีความต่อเนื่องที่ถูกต้องทั้งหมด (รูปที่ 5.1) สำหรับแต่ละเซตย่อยเหล่านี้ เราต้องหาขอบเขตบนและล่าง หากขอบเขตล่างเกินค่าบันทึกปัจจุบัน สถานะที่เกี่ยวข้องและความต่อเนื่องทั้งหมดจะถูกปฏิเสธ หากถึงขีดจำกัดบนในวิถีที่แน่นอนและน้อยกว่าค่าบันทึกปัจจุบัน เราก็จะได้รับบันทึกใหม่

ประสิทธิผลของแนวทางนี้ขึ้นอยู่กับความถูกต้องของการประมาณการที่ได้รับเช่น จากเอย-สวัสดี และจากเวลาที่ใช้ในการคำนวณ

ในความเป็นจริง ในรูปแบบที่เรียบง่าย เราได้ใช้วิธีนี้แล้วในการแก้ปัญหาการปกป้องพื้นผิว (ส่วนที่ 4.6) เมื่อเราปฏิเสธสถานะที่ต้นทุนปัจจุบันเกินต้นทุนรวมสำหรับการประมาณเบื้องต้น ในกรณีนี้ ต้นทุนปัจจุบันคือขีดจำกัดล่าง หากเราถือว่าต้นทุนเป็นศูนย์สำหรับเส้นทางที่เหลือทั้งหมด และต้นทุนทั้งหมดที่สอดคล้องกับการประมาณเริ่มต้นจะถูกบันทึกไว้ ด้วยแนวทางนี้ บันทึกไม่ได้รับการอัปเดต แม้ว่าสามารถทำได้โดยการสร้างการประมาณเริ่มต้น (ขอบเขตบน) สำหรับเส้นทางที่เหลือในลักษณะเดียวกับที่ทำกับวิถีทั้งหมดเมื่อสร้างการประมาณเริ่มต้น ขอบเขตล่างที่ได้รับโดยไม่มีการคำนวณจะสอดคล้องกับต้นทุนเป็นศูนย์สำหรับเส้นทางที่เหลือทั้งหมดและเป็นค่าประมาณคร่าวๆ แต่ได้รับ "ฟรี" เช่น โดยไม่ต้องคำนวณ

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

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

คำชี้แจงปัญหา

บริษัทสำนักพิมพ์จะต้องพิมพ์งานให้เสร็จภายในหนึ่งสัปดาห์ (จำนวนวัน m = 5) โดยได้รับความช่วยเหลือจากพนักงาน n หมวดหมู่ (สูง เฉลี่ย ต่ำกว่าค่าเฉลี่ย ต่ำ) จำเป็นต้องกำหนดจำนวนพนักงานที่เหมาะสมที่สุดตามหมวดหมู่ซึ่งช่วยให้มั่นใจว่างานจะเสร็จสมบูรณ์โดยมีค่าใช้จ่ายน้อยที่สุดของกองทุนค่าจ้างภายใต้ข้อ จำกัด ที่กำหนด ข้อมูลเริ่มต้นแสดงในตารางที่ 1 และ 2

ตารางที่ 1

ตารางที่ 2

ปัญหาจะต้องได้รับการแก้ไขโดยใช้วิธีจำนวนเต็ม การเขียนโปรแกรมเชิงเส้นใน Mathcad 2000/2001

การสร้างแบบจำลองทางคณิตศาสตร์
โซลูชั่น
งาน

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

การแก้ปัญหาการเขียนโปรแกรมจำนวนเต็มจะดำเนินการในสองขั้นตอน

ในขั้นแรก ปัญหาการเขียนโปรแกรมเชิงเส้นจะดำเนินการโดยไม่คำนึงถึงจำนวนเต็ม

ในขั้นตอนที่สองจะทำ กระบวนการทีละขั้นตอนแทนที่ตัวแปรที่ไม่ใช่จำนวนเต็มด้วยค่าจำนวนเต็มบนหรือล่างที่ใกล้ที่สุด

ขั้นแรก ปัญหาจะได้รับการแก้ไขโดยไม่ต้องคำนึงถึงเงื่อนไขจำนวนเต็ม

ฟังก์ชันวัตถุประสงค์ถูกกำหนดโดยสูตร:

ที่ไหน ถาม- กองทุนเงินเดือนทั่วไปสำหรับการปฏิบัติงาน

x 1 , x 2 , …, เอ็กซ์เอ็น- จำนวนพนักงานแยกตามประเภท

n - จำนวนประเภทของคนงาน

1 , 2 ,…, ซีเอ็น- อัตราค่าจ้างรายวันของพนักงานหนึ่งคนตามประเภท

- จำนวนวันทำงานต่อสัปดาห์ = 5.

ฟังก์ชันวัตถุประสงค์สามารถเขียนได้ในรูปแบบเวกเตอร์:

เมื่อแก้ไขปัญหาต้องปฏิบัติตามข้อจำกัดต่อไปนี้ ขีดจำกัดบน

x (1)

ระบุจำนวนพนักงานสูงสุดตามหมวดหมู่ โดยที่ d คือเวกเตอร์ที่กำหนดจำนวนพนักงานตามหมวดหมู่

ในข้อจำกัด

โดยคำนึงว่าจำนวนพนักงานทั้งหมดไม่ควรเกิน เคสูงสุด.

ในข้อจำกัดจากด้านล่าง

× x≥P(3)

สะท้อนให้เห็นว่าคนงานทุกคนร่วมกันต้องทำงานให้เสร็จตามจำนวนที่กำหนด .

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

x≥0 (4)

แบบจำลองทางคณิตศาสตร์การแก้ปัญหาโดยไม่คำนึงถึงเงื่อนไขจำนวนเต็มจะมีนิพจน์ดังต่อไปนี้

x

× x≥P,

x ≥ 0 .

โมเดลการเขียนโปรแกรมจำนวนเต็มต้องมีนิพจน์ (5) และ ข้อ จำกัด เพิ่มเติมด้วยความช่วยเหลือของตัวแปรที่ไม่ใช่จำนวนเต็ม เอ็กซ์จะถูกแทนที่ด้วยค่าจำนวนเต็ม นิพจน์โมเดลเฉพาะที่มีตัวแปรจำนวนเต็มจะกล่าวถึงในส่วนย่อยถัดไป

การแก้ปัญหาการเพิ่มประสิทธิภาพในแมทแคด

แหล่งข้อมูลสำหรับตัวอย่างได้รับในตาราง 1 และ 2.

ในการแก้ปัญหา ให้ใช้แพ็คเกจ Mathcad พร้อมฟังก์ชันย่อเล็กสุด ฟังก์ชั่นนี้กำหนดเวกเตอร์การแก้ปัญหา:

เอ็กซ์:= ย่อเล็กสุด ( ถาม, x),

ที่ไหน ถาม— การแสดงออกของฟังก์ชั่นวัตถุประสงค์ที่กำหนดกองทุนค่าจ้างขั้นต่ำ เอ็กซ์- เวกเตอร์ของตัวแปร

ขั้นแรก ปัญหาจะได้รับการแก้ไขโดยไม่ต้องคำนึงถึงเงื่อนไขจำนวนเต็ม วิธีแก้ปัญหานี้มีให้ในภาคผนวก 1 บรรทัดแรกประกอบด้วยค่าเริ่มต้นของเวกเตอร์เป็นศูนย์ เอ็กซ์และฟังก์ชันวัตถุประสงค์ ถาม(x) - หลังคำว่า Give และก่อนฟังก์ชัน Minimize จะมีการระบุข้อจำกัดต่างๆ ด้วยเหตุนี้ จึงได้จำนวนที่เหมาะสมที่สุดที่ไม่ใช่จำนวนเต็มตามหมวดหมู่:

เอ็กซ์ =

กับกองทุนเงินเดือน ถาม= 135 ลบ.ม. จ.

จาก การตัดสินใจครั้งนี้ตั้งอยู่ โซลูชันจำนวนเต็มสาขาและวิธีการผูกมัด

ขั้นแรก ผลลัพธ์ที่ได้จะวิเคราะห์ค่าเศษส่วน x 4 =
= 1.143. คุณสามารถตั้งค่าจำนวนเต็มได้สองค่า: x 4 = 1 และ x 4 = 2 การสร้างแผนผังการตัดสินใจเริ่มต้นขึ้น (ภาคผนวก 2) โหนดศูนย์เริ่มต้นจะถูกตั้งค่าไว้บนแผนผังการตัดสินใจ จากนั้นจะเชื่อมต่อกันด้วยโหนดแรก x4 และจากโหนดนี้จะมีการวาดกิ่งก้านสองสาขาที่สอดคล้องกับข้อจำกัด: x4 = 1 และ x4 = 2

สำหรับสาขาที่มีข้อจำกัด x 4 = 1 ปัญหาการเขียนโปรแกรมเชิงเส้นที่ให้ไว้ในภาคผนวก 1 จะได้รับการแก้ไข โดยคำนึงถึงข้อจำกัดนี้ด้วย

เป็นผลให้ได้รับการแก้ไขปัญหานี้ ตัวแปร x 1 กลายเป็นจำนวนเต็ม แต่ตัวแปร x 2 กลายเป็นเศษส่วน x 2 = 0.9

เพื่อดำเนินการแบรนช์ต่อไป โหนด x 3 และแบรนช์ x 3 = 1 จะถูกสร้างขึ้น ปัญหาการเขียนโปรแกรมเชิงเส้นจะถูกดำเนินการอีกครั้งโดยมีข้อจำกัดทั้งสาม: x 4 = 1, x 2 = 1, x 3 = 1 ด้วยข้อจำกัดเหล่านี้ ปัญหามีทางแก้ x T =
= (1,938 1 1 1).

ในการดำเนินสาขาต่อไป โหนด x 1 และสาขา x 1 = 2 จะถูกสร้างขึ้น ปัญหาการเขียนโปรแกรมเชิงเส้นจะถูกดำเนินการอีกครั้งโดยมีข้อจำกัดทั้งสามประการ: x 4 = 1, x 2 = 1, x 3 = 1, x 1 = 2 ด้วยข้อจำกัดเหล่านี้ ปัญหาจึงมีทางแก้ x T = = (2 1 1 1)

กระบวนการสร้างแผนผังโซลูชันและดำเนินการปัญหาการเขียนโปรแกรมเชิงเส้นจะถูกทำซ้ำจนกว่าจะสร้างสาขาทั้งหมด

ภาคผนวก 2 เป็นแผนผังที่สมบูรณ์ของคำตอบจำนวนเต็มที่เป็นไปได้ ซึ่งตามมาว่าปัญหามีคำตอบที่มีประสิทธิภาพ 4 ข้อ

อันที่ดีที่สุดจะถูกเลือกจากอันที่มีประสิทธิผลและเป็นที่ยอมรับว่าเป็นคำตอบจำนวนเต็มที่เหมาะสมที่สุดของปัญหาทั้งหมดด้วยค่าต่ำสุด ถาม(x) - ในกรณีของเรา เรามีคำตอบจำนวนเต็มที่เหมาะสมที่สุดสองข้อ

ถาม(เอ็กซ์) = 140,

x ต = (2 1 1 1)

x ต = (1 1 2 2)

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

ดาวน์โหลดวิธีแก้ไขปัญหา:


ชื่อไฟล์:2.rar
ขนาดไฟล์: 24.99 Kb

หากการดาวน์โหลดไฟล์ไม่เริ่มหลังจากผ่านไป 10 วินาที ให้คลิก

การแนะนำ................................................. ....... ........................................... ..... 3

1. ..…………….4

2. สาขาและวิธีการผูกมัด………………………………………..6

2.1 อัลกอริทึมวิธีสาขาและขอบค………………………………....10

สรุป……………………………………………………….14

อ้างอิง……………………………………………………………………….15

การแนะนำ

สาขาและวิธีการผูกมัดถูกเสนอครั้งแรกโดย Land และ Doig ในปี 1960 เพื่อแก้ปัญหา งานทั่วไปการเขียนโปรแกรมเชิงเส้นจำนวนเต็ม ความสนใจในวิธีนี้และในความเป็นจริง "การเกิดใหม่" ของมันเกี่ยวข้องกับงานของ Little, Murthy, Sweeney และ Carell เกี่ยวกับปัญหาพนักงานขายที่กำลังเดินทาง ตั้งแต่นั้นมา มีผลงานจำนวนมากที่เกี่ยวข้องกับสาขาและวิธีผูกและการปรับเปลี่ยนต่างๆ ความสำเร็จที่ยิ่งใหญ่ดังกล่าวอธิบายได้จากข้อเท็จจริงที่ว่าผู้เขียนเป็นคนแรกที่ให้ความสนใจกับความเป็นไปได้ที่หลากหลายของวิธีการ สังเกตความสำคัญของการใช้ปัญหาเฉพาะ และใช้ประโยชน์จากปัญหาเฉพาะของพนักงานขายที่เดินทางด้วยตนเอง

วิธีการแยกสาขาและวิธีการผูกมัดนั้นขึ้นอยู่กับแนวคิดของการแบ่งพาร์ติชันชุดของวิธีแก้ปัญหาที่เป็นไปได้ออกเป็นชุดย่อยตามลำดับ (กลยุทธ์ "แบ่งและพิชิต") ในแต่ละขั้นตอนของวิธีการ องค์ประกอบพาร์ติชันจะถูกตรวจสอบเพื่อพิจารณาว่าชุดย่อยที่กำหนดมีวิธีแก้ปัญหาที่เหมาะสมที่สุดหรือไม่ การตรวจสอบความถูกต้องจะดำเนินการโดยการคำนวณค่าประมาณที่ต่ำกว่าสำหรับฟังก์ชันวัตถุประสงค์ในชุดย่อยที่กำหนด หากประมาณการต่ำกว่าไม่ต่ำกว่า บันทึก- พบทางออกที่ดีที่สุดแล้วจึงละทิ้งเซตย่อยได้ เซ็ตย่อยที่เลือกไว้สามารถละทิ้งได้หากค้นหาได้ ทางออกที่ดีที่สุด- ถ้าค่าของฟังก์ชันวัตถุประสงค์ในโซลูชันที่พบน้อยกว่าเรกคอร์ด เรกคอร์ดจะเปลี่ยนไป ในตอนท้ายของอัลกอริทึม บันทึกคือผลลัพธ์ของการทำงาน

หากเป็นไปได้ที่จะละทิ้งองค์ประกอบทั้งหมดของพาร์ติชั่น แสดงว่าเรกคอร์ดนั้นเป็นทางออกที่ดีที่สุดสำหรับปัญหา มิฉะนั้น ชุดย่อยที่มีแนวโน้มมากที่สุดจะถูกเลือกจากชุดย่อยที่ไม่ถูกละทิ้ง (เช่น ด้วย ค่าต่ำสุดค่าประมาณที่ต่ำกว่า) และจะถูกแบ่ง มีการตรวจสอบเซ็ตย่อยใหม่อีกครั้ง ฯลฯ

1. วิธีสาขาและขอบเขตของการเขียนโปรแกรมจำนวนเต็ม แนวคิดพื้นฐาน

การเขียนโปรแกรมจำนวนเต็ม (บางครั้งเรียกว่าแบบไม่ต่อเนื่อง) เป็นสาขาหนึ่งของการเขียนโปรแกรมทางคณิตศาสตร์ที่ศึกษาปัญหาขั้นสุด ซึ่งเงื่อนไขจำนวนเต็มถูกกำหนดให้กับตัวแปรที่ต้องการ และช่วงของคำตอบที่เป็นไปได้มีจำกัด

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

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

1. ลดจำนวนตัวแปรจำนวนเต็มให้มากที่สุด ตัวอย่างเช่น ตัวแปรจำนวนเต็มที่มีค่าอย่างน้อย 20 ก็ถือว่าต่อเนื่องได้

2. ต่างจากปัญหา LP ทั่วไป การเพิ่มข้อจำกัดใหม่ โดยเฉพาะที่เกี่ยวข้องกับตัวแปรจำนวนเต็ม มักจะช่วยลดเวลาในการแก้ไขปัญหา CPU

3. หากไม่มีความจำเป็นเร่งด่วนในการค้นหาคำตอบจำนวนเต็มที่เหมาะสมที่สุดที่แตกต่างจากคำตอบต่อเนื่อง เช่น 3% จากนั้น การดำเนินการสาขาและวิธีการผูกไว้สำหรับปัญหาการขยายให้สูงสุดจะเสร็จสมบูรณ์ได้ หากอัตราส่วนของความแตกต่างระหว่างขอบเขตบนและขอบเขตล่างต่อขอบเขตบนน้อยกว่า 0.03

สามารถใช้วิธีแยกสาขาและผูกไว้เพื่อแก้ปัญหาการเขียนโปรแกรมแบบไม่เชิงเส้นได้

วิธีสาขาและขอบเขตเป็นหนึ่งในวิธี วิธีการผสมผสาน- สาระสำคัญของมันอยู่ที่การเลือกตัวเลือกที่เป็นระเบียบและการพิจารณาเฉพาะตัวเลือกที่มีแนวโน้มว่ามีแนวโน้มตามเกณฑ์ที่กำหนด และละทิ้งตัวเลือกที่ไม่มีท่าว่าจะดี

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

2. สาขาและวิธีการผูกมัด

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

f(X) -> สูงสุด,

xxD,

โดยที่ D คือเซตจำกัด

ขั้นแรก เราค้นหาค่าประมาณ £(D) (ขอบเขต) ของฟังก์ชัน f(X), X е D: f(X) ≤ £(D) สำหรับ V X е D ถ้าสำหรับแผนบางแผน X° ของปัญหา ความเท่าเทียมกัน f(X0) = £(D ) ดังนั้น X° = X* เป็นวิธีการแก้ปัญหา หากไม่เป็นไปตามเงื่อนไขที่ระบุ ก็เป็นไปได้ที่จะแบ่งพาร์ติชัน (สาขา) เซต D ให้เป็นจำนวนจำกัดของเซตย่อยที่ไม่เชื่อมติดกัน D1i: ỤD1i = D, ∩D1i = ̨ และการคำนวณค่าประมาณ £(D1i) (ขอบเขต), 1≤i≤m (รูปที่ 2.1)

รูปที่ 2. 1

ถ้าสำหรับบางแผน X1i е Di1, 1 ≤ / ≤ m เงื่อนไข f(Xkl)= £(D1k)≥ £(D1i), 1≤i≤m เป็นไปตามเงื่อนไข ดังนั้น Xk1=X* เป็นแผน (วิธีแก้ปัญหา) ที่เหมาะสมที่สุดของ ปัญหา (7.9) - (7.10)

หากไม่มีแผนดังกล่าว ดังนั้นเซตย่อย Dkl ที่มีค่าประมาณสูงสุด £(D1i) จะถูกเลือกและแบ่งออกเป็นจำนวนจำกัดของเซตย่อยที่ไม่เป็นสมาชิกร่วม D2kj: UD2kj=D1k, ∩D2kj=gest สำหรับแต่ละเซตย่อยค่าประมาณ £(D2kj) จะพบ1≤j≤n (รูปที่ 2.2)

รูปที่ 2.2

หากในกรณีนี้มีแผน X2j е D2kJ, 1 ≤j ≤n โดยที่ f(X2r)= £(D2kr)≥ £(D2kj), 1≤j≤n ดังนั้น X2r= X* จึงเป็นคำตอบของ ปัญหา หากไม่มีแผนดังกล่าว ขั้นตอนการแตกแขนงจะดำเนินการสำหรับชุด D2kj ที่มีค่าประมาณสูงสุด £(D2kj) , 1≤j≤n วิธีการแยกสาขาถูกกำหนดโดยลักษณะเฉพาะของงานเฉพาะ

ลองพิจารณาปัญหาที่สามารถลดให้เป็นปัญหาการเขียนโปรแกรมเชิงเส้นจำนวนเต็มได้

ตัวอย่าง.

ตู้คอนเทนเนอร์ที่มีปริมาตร 5 ลบ.ม. วางอยู่บนเรือคอนเทนเนอร์ที่มีความจุ 12 ตัน ตู้คอนเทนเนอร์จะต้องเต็มไปด้วยสินค้าสองประเภท มวลของหน่วยสินค้า mj (เป็นตัน) ปริมาตรของหน่วยสินค้า Vj (เป็น m3) ต้นทุน Cj (ในหน่วยการเงินทั่วไป) แสดงไว้ในตารางที่ 2.1

ตารางที่ 2.1

ประเภทของสินค้า

ซี เจ

จำเป็นต้องบรรทุกตู้คอนเทนเนอร์ในลักษณะที่ต้นทุนของสินค้าที่ขนส่งสูงสุด

สารละลาย. แบบจำลองทางคณิตศาสตร์ของปัญหามีรูปแบบ

Z(X) = 10x1+12x2→สูงสุด

3x1+x2≤12,

x1+2x2≤5

x1≥0

x2≥0

x1, x2 เป็นจำนวนเต็ม

โดยที่ x1, x2 คือจำนวนหน่วยของการโหลดครั้งแรกและครั้งที่สองตามลำดับ

เราแสดงชุดของแผนสำหรับปัญหานี้โดย D - นี่คือชุดของจุดจำนวนเต็มของรูปทรงหลายเหลี่ยม OABC (รูปที่ 2.3)

รูปที่ 2.3

ขั้นแรก เราแก้ปัญหาโดยไม่มีเงื่อนไขจำนวนเต็ม และหาค่าประมาณของเซต D - ค่าของฟังก์ชัน Z(X) บนแผนที่เหมาะสมที่สุด X° = (19/5, 3/5)

จุด X ไม่ใช่แผนที่เหมาะสมที่สุดสำหรับปัญหา ดังนั้น ตามวิธีแบรนช์และวิธีผูก จำเป็นต้องแบ่งพาร์ติชันเซต D ออกเป็นเซตย่อยที่ไม่เชื่อมต่อกัน ลองเลือกตัวแปรที่ไม่ใช่จำนวนเต็มตัวแรก x1=19/5=34/5 แล้วแบ่งเซต D ออกเป็นเซตย่อยที่ไม่ต่อเนื่องกันสองชุด D11 และ D22 เส้น x1=3 (L3) และ x4= (L3) เป็นเส้นพาร์ติชัน

รูปที่ 2.4


แอล\


ให้เราค้นหาค่าประมาณสำหรับ £(D11) และ £(D12) ซึ่งเราจะแก้ปัญหาการเขียนโปรแกรมเชิงเส้น

Z(X)=10x1+12x2→สูงสุด

3x1+x2≤12

x1+2x2≤5

x1≤3

x1≥0, x2 – จำนวนเต็ม

Z(X)=10x1+12x2→สูงสุด

3x1+ x2≤12

x1+2x2≤5

x1≥4

x1≥0, x2 – จำนวนเต็ม

ตัวอย่างเช่น การใช้วิธีแบบกราฟิก:

X11eD11→X01= (3,1); £(D11)=42; X12eD12→X02= (4,0); ปอนด์(D12)=40.

ผลการแตกแขนงดังแสดงในรูปที่ 2.5

รูปที่ 2.5


แผน X01 เป็นไปตามเงื่อนไขของปัญหา และเป็นไปตามเงื่อนไขต่อไปนี้: Z(X11)= £(D11)=42 > £(/)/) = 42 > £(D12) = 40 ดังนั้น แผน X °1= (3, 1) เป็นวิธีการแก้ปัญหา (7.11)-(7.13) กล่าวคือ คุณต้องใช้โหลดแรกสามหน่วยและโหลดที่สองหนึ่งหน่วย

2.1 สาขาและอัลกอริธึมที่ถูกผูกไว้

· เราพบวิธีแก้ไขปัญหาการเขียนโปรแกรมเชิงเส้นโดยไม่ต้องคำนึงถึงจำนวนเต็ม

· สร้างข้อจำกัดเพิ่มเติมเกี่ยวกับองค์ประกอบที่เป็นเศษส่วนของแผน

· เราพบวิธีแก้ไขปัญหาสองประการด้วยข้อจำกัดในส่วนประกอบ

· หากจำเป็น เราจะสร้างข้อจำกัดเพิ่มเติม ตามสี่กรณีที่เป็นไปได้ เราได้รับแผนจำนวนเต็มที่เหมาะสมที่สุดหรือสร้างปัญหาที่แก้ไม่ได้

อัลกอริทึมสำหรับสาขาและวิธีการผูกมัด

เริ่มแรกเราค้นหาโดยใช้วิธีซิมเพล็กซ์ในการวางแผนปัญหาที่เหมาะสมที่สุดโดยไม่คำนึงถึงจำนวนตัวแปรของจำนวนเต็ม ปล่อยให้มันเป็นแผน X0 หากไม่มีเศษส่วนในองค์ประกอบของแผนนี้ แสดงว่าพบวิธีแก้ไขปัญหาที่ต้องการแล้ว Fmax = F(X0)

หากในบรรดาองค์ประกอบของแผน X0 มีตัวเลขเศษส่วน X0 จะไม่เป็นไปตามเงื่อนไขจำนวนเต็มและจำเป็นต้องดำเนินการเปลี่ยนผ่านไปยังแผนใหม่อย่างเป็นระเบียบจนกว่าจะพบวิธีแก้ไขปัญหา ให้เราแสดงวิธีการนี้ให้เสร็จสิ้น ขั้นแรกสังเกตว่า F(X0) ³ F(X) สำหรับแผน X ลำดับถัดไปใดๆ เนื่องจากจำนวนข้อจำกัดที่เพิ่มขึ้น

สมมติว่าแผนที่เหมาะสมที่สุด X0 ที่พบไม่ตรงตามเงื่อนไขของตัวแปรจำนวนเต็ม ดังนั้นเราจึงถือว่าในบรรดาส่วนประกอบต่างๆ นั้นมีตัวเลขเศษส่วน ตัวอย่างเช่น สมมติว่าตัวแปรใช้ค่าเศษส่วนในรูปของ X0 จากนั้นในแผนจำนวนเต็มที่เหมาะสมที่สุด ค่าของมันจะน้อยกว่าหรือเท่ากับจำนวนเต็มเล็กที่ใกล้ที่สุด หรือมากกว่าหรือเท่ากับจำนวนเต็มขนาดใหญ่ที่ใกล้ที่สุด font-size:14.0pt">font-size:14.0pt">มาเริ่มกันเลย ค้นหาวิธีแก้ไขปัญหาการเขียนโปรแกรมเชิงเส้น (5) และ (6) แน่นอนว่าหนึ่งในสี่กรณีต่อไปนี้เป็นไปได้ที่นี่:

1. ปัญหาประการหนึ่งแก้ไขไม่ได้ และอีกปัญหาหนึ่งมีแผนจำนวนเต็มที่เหมาะสมที่สุด จากนั้นแผนนี้และคุณค่าของฟังก์ชันวัตถุประสงค์ในแผนนั้นจะช่วยแก้ปัญหาเดิมได้

2. ปัญหาประการหนึ่งไม่สามารถแก้ไขได้ และอีกปัญหาหนึ่งมีแผนที่เหมาะสมที่สุด โดยมีองค์ประกอบเป็นเศษส่วน จากนั้นเราจะพิจารณาปัญหาที่สองและปัญหาของมัน แผนการที่เหมาะสมที่สุดเราเลือกองค์ประกอบหนึ่งซึ่งมีค่าเท่ากับจำนวนเศษส่วน และสร้างปัญหาสองข้อที่คล้ายกับปัญหา (5) และ (6)

3. ปัญหาทั้งสองแก้ไขได้ ปัญหาข้อหนึ่งมีแผนจำนวนเต็มที่เหมาะสมที่สุด และแผนที่เหมาะสมที่สุดของปัญหาอีกข้อมีแผนจำนวนเต็มเป็นเศษส่วน จากนั้นเราจะคำนวณค่าของฟังก์ชันวัตถุประสงค์ในแผนเหล่านี้และเปรียบเทียบกัน

3.1. หากแผนจำนวนเต็มที่เหมาะสมที่สุดบนแผนจำนวนเต็ม ค่าของฟังก์ชันวัตถุประสงค์มากกว่าหรือเท่ากับมูลค่าแผน ในบรรดาส่วนประกอบที่มีจำนวนเศษส่วน ดังนั้นแผนจำนวนเต็มนี้เหมาะสมที่สุดสำหรับปัญหาดั้งเดิมและร่วมกับ ค่าของฟังก์ชันวัตถุประสงค์จะให้คำตอบที่ต้องการ

3.2. หากค่าของฟังก์ชันวัตถุประสงค์มากกว่าในแผน ในบรรดาองค์ประกอบที่มีจำนวนเศษส่วน ควรใช้จำนวนใดจำนวนหนึ่งเหล่านี้ และสำหรับปัญหาที่กำลังพิจารณาแผนอยู่ จำเป็นต้องสร้างปัญหาสองข้อที่คล้ายกับ (5) และ (6)

4. ปัญหาทั้งสองสามารถแก้ไขได้ และแผนการที่เหมาะสมที่สุดสำหรับปัญหาทั้งสองนั้นรวมถึงจำนวนเศษส่วนด้วย จากนั้นเราคำนวณค่าของฟังก์ชันวัตถุประสงค์ในแผนที่เหมาะสมที่สุดเหล่านี้ และพิจารณาปัญหาที่ค่าของฟังก์ชันวัตถุประสงค์มีค่ามากที่สุด ในแผนที่เหมาะสมที่สุดสำหรับปัญหานี้ เราเลือกองค์ประกอบใดองค์ประกอบหนึ่งที่มีมูลค่า จำนวนเศษส่วนและสร้างปัญหาสองข้อที่คล้ายกับ (5) และ (6)

อัลกอริธึมทั่วไปสำหรับการแก้ปัญหาโดยใช้วิธีขอบเขตและสาขาซึ่งเป็นสาระสำคัญ

ดังนั้น กระบวนการวนซ้ำที่อธิบายไว้ข้างต้นสามารถแสดงในรูปแบบของต้นไม้ซึ่งจุดยอดเริ่มต้นสอดคล้องกับแผนที่เหมาะสมที่สุด X0 และแต่ละจุดยอดที่เชื่อมต่อกับจุดนั้นด้วยกิ่งก้านจะสอดคล้องกับแผนปัญหาที่เหมาะสมที่สุด (5) และ (6 ). แต่ละจุดยอดเหล่านี้มีสาขาของตัวเอง ในกรณีนี้ ในแต่ละขั้นตอน จะมีการเลือกจุดยอดที่มีค่าฟังก์ชันมากที่สุด หากในบางขั้นตอนได้รับแผนที่มีส่วนประกอบจำนวนเต็มและค่าของฟังก์ชันนั้นกลายเป็นมากกว่าหรือเท่ากับค่าของฟังก์ชันที่จุดยอดอื่นที่เป็นไปได้สำหรับการแตกแขนง แผนนี้เป็นแผนการที่เหมาะสมที่สุดสำหรับปัญหาการโปรแกรมจำนวนเต็มดั้งเดิม และค่าของฟังก์ชันวัตถุประสงค์ของปัญหานั้นคือค่าสูงสุด

ดังนั้น กระบวนการค้นหาวิธีแก้ไขปัญหาการเขียนโปรแกรมจำนวนเต็มโดยใช้วิธีสาขาและผูกจึงมีขั้นตอนหลักดังต่อไปนี้:

1. ค้นหาวิธีแก้ไขปัญหาการเขียนโปรแกรมเชิงเส้น

2. สร้างข้อ จำกัด เพิ่มเติมสำหรับตัวแปรตัวใดตัวหนึ่งซึ่งค่าในแผนที่เหมาะสมที่สุดคือจำนวนเศษส่วน

3. ค้นหาวิธีแก้ไขปัญหา (5) และ (6) ซึ่งได้มาจากปัญหา (1)-(3) อันเป็นผลมาจากการเพิ่มข้อจำกัดเพิ่มเติม

4. หากจำเป็น ให้สร้างข้อจำกัดเพิ่มเติมสำหรับตัวแปรที่มีค่าเป็นเศษส่วน กำหนดปัญหาที่คล้ายคลึงกับปัญหา (5) และ (6) และค้นหาวิธีแก้ไข

กระบวนการวนซ้ำดำเนินต่อไปจนกระทั่งพบจุดยอดที่สอดคล้องกับแผนจำนวนเต็มของปัญหา (1)-(4) และเพื่อให้ค่าของฟังก์ชันที่จุดยอดนี้มากกว่าหรือเท่ากับค่าของฟังก์ชันที่จุดยอดอื่นที่เป็นไปได้ สำหรับการแตกแขนง

วิธีแยกสาขาและวิธีการผูกมัดที่อธิบายไว้ข้างต้นมีรูปแบบการคำนวณเชิงตรรกะที่ง่ายกว่าวิธี Gomori ดังนั้นส่วนใหญ่แล้วต้องหาทางแก้ไข งานเฉพาะวิธีนี้ใช้สำหรับการเขียนโปรแกรมจำนวนเต็มโดยใช้คอมพิวเตอร์

ตัวอย่างการใช้ Branch และ Bound Method

เป็นตัวอย่างของกิ่งและวิธีผูก พิจารณาฟังก์ชัน z=4x1+x2+1®max ภายใต้ข้อจำกัด:

font-size:14.0pt">ให้ X0 = (0; 0), z0 = 1 - วิธีแก้ปัญหา "ดีที่สุด" ลองทำขั้นตอนที่ 1 ของอัลกอริทึมทั่วไปแล้วค้นหาโดยใช้วิธี simplex จากนั้น วิธีดูอัลซิมเพล็กซ์(ดูภาคผนวก 1) X1 ตามข้อจำกัด ดังนั้น X1 = (3; 0.5; 0; 1; 0; 2.5), z1 = 13.5 เนื่องจาก z1 เป็นเศษส่วน แผน X0 จึงยังคง "เหมาะสมที่สุด"

ตามจุดที่ 2 ของแผนของเรา เราจะสร้างระบบข้อจำกัดใหม่ 2 ระบบสำหรับ:

https://pandia.ru/text/79/453/images/image012_25.gif" alt="Description: http://*****/images/paper/93/79/4327993.png" width="108" height="98"> . !}

ลองทำจุดที่ 3 ของอัลกอริทึมกัน เริ่มต้นด้วยการแก้ปัญหาโดยใช้ โปรเซสเซอร์ตาราง Microsoft Excel (ภาคผนวก 2) และเราได้รับ X2 = (2; 1) z2= 10 เนื่องจาก z2 ≥ z0 แผน X0 จึง "เหมาะสมที่สุด"

มาแก้ปัญหากันเถอะ จากสมการสุดท้ายจะเห็นได้ชัดว่า x2 = 0 และตามมาด้วย x1 = 3 (ค่าสูงสุดที่เป็นไปได้) จากนั้น X3 = (3; 0), z3 = 13 ดังนั้นแผนนี้จึงเหมาะสมที่สุด (ตอนนี้ไม่มีเครื่องหมายคำพูด)

เราไม่จำเป็นต้องดำเนินการจุดที่ 4 ของอัลกอริธึมของเรา เนื่องจากพบวิธีแก้ปัญหาที่เหมาะสมที่สุด ตัวแปรจึงเป็นจำนวนเต็ม ตัวอย่างที่สิ่งต่าง ๆ ไม่ง่ายมีให้ในภาคผนวก 3

บทสรุป

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

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

ข้อมูลอ้างอิง

1. อ. ชไรเวอร์. ทฤษฎีการเขียนโปรแกรมเชิงเส้นและจำนวนเต็ม มี 2 เล่ม; แปลจากภาษาอังกฤษ 1991 360s

2. ต.หู. การเขียนโปรแกรมจำนวนเต็มและไหลไปในเครือข่าย; แปลจากภาษาอังกฤษ 1974

3. - คณิตศาสตร์ชั้นสูง: การเขียนโปรแกรมทางคณิตศาสตร์ เด็กฝึกงาน - รุ่นที่ 2 2544 351ส.

4. - การเขียนโปรแกรมทางคณิตศาสตร์: บทช่วยสอน- ฉบับที่ 5, Stereotype-M: FISMAT, 2001 - 264 หน้า

5. , .: วิธีเศรษฐศาสตร์และคณิตศาสตร์และ รุ่นที่ประยุกต์: หนังสือเรียน. คู่มือสำหรับมหาวิทยาลัย/UNITI, 1999 - 391 น.

6. - แก้ไขโดย ศาสตราจารย์ - : การวิจัยปฏิบัติการทางเศรษฐศาสตร์; หนังสือเรียน คู่มือสำหรับมหาวิทยาลัย

ภาคผนวก 2

วิธีแก้ปัญหา z = 4x1 + x2 +1 ® สูงสุดภายใต้ข้อจำกัด:

ใช้โต๊ะ โปรเซสเซอร์ไมโครซอฟต์เอ็กเซล

โหวต: 25, 14

มันคืออะไร?

บางครั้งปัญหา NP-complete ที่เกิดขึ้นจะต้องได้รับการแก้ไข

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

การปรับปรุงกำลังเดรัจฉาน

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

ประกอบด้วยการแสดงตัวเลือกตามลำดับตัวเลือกแบบสุ่ม

การประเมินคุณภาพของอัลกอริธึมโดยประมาณ

ให้เราแก้ปัญหาการปรับให้เหมาะสม นั่นคือเรากำลังมองหาออบเจ็กต์ที่มีต้นทุนสูงสุดหรือต่ำสุดในบรรดาชุดของออบเจ็กต์ที่ระบุฟังก์ชันต้นทุน ให้เราแสดงคำตอบที่เหมาะสมที่สุดเป็น C* และคำตอบที่อัลกอริธึมให้เราคือ C

สูงสุด(C ⁄ C *, C * ⁄ C) ≤ ρ (n)

โปรดทราบว่าเนื่องจากค่าสูงสุดของปริมาณผกผันซึ่งกันและกันจะต้องไม่น้อยกว่า 1

บางครั้ง การใช้ข้อผิดพลาดแบบสัมพัทธ์ซึ่งกำหนดเป็น | จะสะดวกกว่า ค - ค *| ⁄ ค *

เราจะบอกว่าอัลกอริทึมมีข้อผิดพลาดไม่เกิน ε(n) ถ้า

- ค - ค *| ⁄ C * ≤ ε (n)

เป็นเรื่องง่ายที่จะตรวจสอบว่า ε (n) สามารถถูกจำกัดขอบเขตจากด้านบนผ่านฟังก์ชัน ρ (n) ซึ่งก็คือ ε (n) ≤ ρ (n) − 1 อันที่จริง สำหรับปัญหาขั้นต่ำ ความไม่เท่าเทียมกันนี้จะกลายเป็นความเท่าเทียมกัน สำหรับปัญหาสูงสุด ε (n) = (ρ (n) − 1) ⁄ ρ (n) (นอกจากนี้ เราต้องจำไว้ด้วยว่า ρ (n) ≥ 1

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

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

รูปแบบการประมาณเรียกว่าพหุนาม ถ้าสำหรับค่าคงที่ ε > 0 เวลาทำงานไม่เกินค่าพหุนามบางตัวใน n รูปแบบการประมาณเรียกว่าพหุนามเต็มถ้าเวลาทำงานถูกจำกัดด้วยพหุนามบางตัวใน n และ 1 ⁄ ε

ปัญหาของพนักงานขายที่ต้องเดินทางคือพื้นที่ทดสอบสำหรับวิธีการปรับให้เหมาะสมที่สุด

การกำหนดปัญหาพนักงานขายเดินทาง (1934):

พนักงานขายที่เดินทางจะต้องออกจากเมืองแรก เยี่ยมชมเมือง 2, 3, ..., n ครั้งละครั้งโดยไม่ทราบลำดับ และกลับไปยังเมืองแรก ทราบระยะทางระหว่างเมือง เราควรเดินไปรอบ ๆ เมืองตามลำดับอย่างไรเพื่อให้เส้นทางปิด (ทัวร์) ของพนักงานขายที่เดินทางสั้นที่สุด?

ในแง่ของทฤษฎีกราฟ ปัญหาสามารถกำหนดได้ดังนี้: มีกราฟกำกับที่สมบูรณ์ G = (V, E) แต่ละส่วนโค้ง (u, v) สัมพันธ์กับน้ำหนัก c (u, v) เราจำเป็นต้องค้นหารูปร่างแฮมิลตันที่มีต้นทุนน้อยที่สุดในกราฟนี้

ให้เราใส่ใจกับรายละเอียดที่สำคัญมากสำหรับอัลกอริทึมในการแก้ปัญหา:

  1. สูตรทั้งสองถือว่า c(u, v) ≥ 0; c (u, u) = ∞ สำหรับ u ทั้งหมด v ∈ V
  2. สูตรไร้เดียงสาถือว่า c(u, v) = c(v, u) สำหรับ u, v ∈ V ทั้งหมด กล่าวคือ กราฟสามารถพิจารณาได้ว่าไม่มีทิศทาง ปัญหานี้เรียกว่าปัญหาพนักงานขายที่เดินทางแบบสมมาตร อย่างไรก็ตาม โดยทั่วไปแล้ว สิ่งนี้ไม่จำเป็น
  3. ในสูตรไร้เดียงสา เราถือว่าสำหรับ u, v, w ∈ V c (u, v) ≤ c (u, w) + c (w, v) ทั้งหมด (อสมการสามเหลี่ยม) ทั้งหมด ซึ่งมักจะอยู่ใน ปัญหาในทางปฏิบัติ- อย่างไรก็ตาม พูดโดยทั่วไปแล้วสิ่งนี้ไม่เป็นความจริง

ทฤษฎีบท

กำหนดให้ P ≠ NP, ρ ≥ 1 จากนั้นจึงไม่มีอัลกอริธึมการประมาณพหุนามที่จะแก้ปัญหาพนักงานขายที่กำลังเดินทางทั่วไป (ยิ่งกว่านั้นคือสมมาตร) โดยมีข้อผิดพลาดไม่เกิน ρ ครั้ง

การพิสูจน์.สำหรับการพิสูจน์ โปรดทราบว่าการใช้กราฟใดๆ G = (V, E) และเชื่อมโยงกับกราฟที่สมบูรณ์ G ′ กับฟังก์ชันต้นทุน c (u, v) = 1 ถ้า (u, v) ∈ E และ ρ | วี | +1 อย่างอื่น ให้เราตรวจสอบให้แน่ใจว่าอัลกอริทึมพหุนามของเราจะพิจารณาว่ากราฟ G มีวัฏจักรแฮมิลตันหรือไม่ ซึ่งเป็นไปไม่ได้

วิธีการแยกสาขาและผูกมัด (“การย้อนรอย”)

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

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

ให้เราพิจารณาปัญหาสุดขั้วแบบไม่ต่อเนื่อง (สำหรับความแน่นอน ขั้นต่ำ) ในรูปแบบทั่วไป:

ให้เซต A ที่ไม่ต่อเนื่องและมีฟังก์ชัน f กำหนดไว้ ให้เราแสดงว่าค่าต่ำสุดของฟังก์ชัน f บน X เป็น F (X)

คุณต้องหา x 0 ∈ A: f (x 0) = F (A)

หมายเหตุ 1

ให้ A = A 0 ∪ A 1 ∪ … ∪ A k , A i ∩ A j = Ø, i ≠ j นอกจากนี้ F (A)< F (A 0), т. е. на A 0 минимум не достигается.

ดังนั้นสิ่งต่อไปนี้เป็นจริง: F (A) = min ( F (A i) | i ∈ 1: k )

หมายเหตุ 2

ให้ Φ เป็นฟังก์ชันที่กำหนดบนชุดย่อยของเซต A โดยที่ Φ (X) ≤ F (X) ∀ X ⊂ A

ให้ x * เป็นองค์ประกอบใดๆ ของ A และให้ f * = f (x *)

จากนั้นสิ่งต่อไปนี้เป็นจริง: F (A) = min ( f *, min ( F (A i) | i ∈ 1: k, Φ (A i) ≤ f *) )

ข้อพิจารณาทั้งสองข้อนี้ทำให้เราสามารถเสนอได้ เทคโนโลยีต่อไปค้นหาขั้นต่ำ ให้เราแบ่งเซต A ออกเป็นเซตย่อย A i และหาขอบเขตล่างของ Φ ในแต่ละเซต สำหรับองค์ประกอบของเซต A เราจะคำนวณค่าของฟังก์ชัน f และจดจำค่าที่เล็กที่สุดเป็นค่าบันทึก ชุดย่อยทั้งหมดที่มีคะแนนสูงกว่าค่าบันทึกของฟังก์ชัน (f *) จะถูกรวมเข้ากับชุดย่อย A 0 เพื่อไม่ให้พิจารณาเพิ่มเติม

ทีนี้ ลองเลือกเซต A i, i > 0 กัน ลองแบ่งเซตนี้ออกเป็นเซตย่อยเล็กๆ หลายๆ เซตกัน ในเวลาเดียวกัน เราจะปรับปรุงบันทึกค่า f* ต่อไป กระบวนการนี้จะดำเนินต่อไปจนกว่าจะมีการตรวจสอบเซต A i, i > 0 ทั้งหมด

วิธีการแยกสาขาและขอบเขต (การย้อนรอย) สามารถอธิบายได้ชัดเจนยิ่งขึ้นโดยใช้แผนผังความเป็นไปได้ โหนดของแผนผังดังกล่าวถือได้ว่าเป็นคอลเลกชันของการกำหนดค่า (เซ็ตย่อย A i ของเซ็ต A) และแต่ละโหนดที่สืบทอดมาจากบางโหนดแสดงถึงเซ็ตย่อยของคอลเลกชันนี้ สุดท้าย แต่ละชีตแสดงถึงการกำหนดค่าที่แตกต่างกัน

ตัวอย่างที่ 1 ปัญหาการเดินทางของพนักงานขาย (อัลกอริทึมของลิตเติ้ล)

ลองดูการทำงานของอัลกอริทึมนี้โดยใช้ตัวอย่างเฉพาะ

ให้มีกราฟที่กำหนดโดยเมทริกซ์คำคุณศัพท์:

6 4 8 7 14
6 7 11 7 10
4 7 4 3 10
8 11 4 5 11
7 7 3 5 7
14 10 10 11 7

สิ่งต่อไปนี้เป็นจริง: เมื่อลบค่าคงที่ใดๆ ออกจากองค์ประกอบทั้งหมดของแถวหรือคอลัมน์ใดๆ ของเมทริกซ์ C เราจะปล่อยให้การทัวร์ขั้นต่ำมีค่าน้อยที่สุด ในเรื่องนี้ กระบวนการลบองค์ประกอบขั้นต่ำออกจากแต่ละแถว (การหล่อแบบทีละบรรทัด) จะไม่ส่งผลกระทบต่อทัวร์ขั้นต่ำ ในทำนองเดียวกัน มีการแนะนำแนวคิดเรื่องการลดคอลัมน์ซึ่งมีคุณสมบัติเหมือนกัน

นำเสนอเมทริกซ์ดั้งเดิมทีละแถว

ต้นฉบับ

6 4 8 7 14
6 7 11 7 10
4 7 4 3 10
8 11 4 5 11
7 7 3 5 7
14 10 10 11 7

เรียงกันทีละบรรทัด

2 0 4 3 10 |4
0 1 5 1 4 |6
1 4 1 0 7 |3
4 7 0 1 7 |4
4 4 0 2 4 |3
7 3 3 4 0 |7

ตัวเลขที่เป็นตัวหนาในเมทริกซ์ดั้งเดิมเป็นแนวทางที่เหมาะสมที่สุดที่ได้จากการค้นหาพจนานุกรม

(โปรดสังเกตว่าผลรวมของค่าคงที่การลดคือ 4 + 6 + 3 + 4 + 3 + 7 = 27)

แล้วตามคอลัมน์:

0 0 3 3 6
0 1 4 1 0
1 2 0 0 3
4 5 0 1 3
4 2 0 1 0
7 1 3 3 0
0 2 0 1 0 4

(โปรดสังเกตว่าผลรวมของค่าคงที่การลดลงตรงนี้คือ 0 + 2 + 0 + 1 + 0 + 4 = 7 และค่าคงที่ทั้งหมด: 27 + 7 = 34)

ตอนนี้ ทัวร์ที่ผ่านขอบของต้นทุนเป็นศูนย์เท่านั้นจะเห็นได้ชัดว่ามีน้อยมาก เพื่อกำหนดต้นทุน เราจะเพิ่มค่าคงที่ที่เพิ่งคำนวณได้ 34 ให้เป็นศูนย์:

ดังนั้นเราจึงได้ค่าประมาณค่าชั้นเรียนที่ต่ำกว่าสำหรับทัวร์ที่เป็นไปได้ทั้งหมด นั่นคือรอบขั้นต่ำในปัญหานี้ต้องไม่ต่ำกว่า 34

โทรเลย การประเมินศูนย์ที่ตำแหน่ง (i, j) ในผลรวมเมทริกซ์ องค์ประกอบขั้นต่ำในแถวที่ i และคอลัมน์ที่ j (ไม่นับศูนย์นี้เอง) ตอนนี้ให้เราประเมินแต่ละศูนย์ในเมทริกซ์ที่กำหนด:

1 2 3 4 5 6
1 0 1 0 3 3 6
2 0 1 1 4 1 0
3 1 2 0 1 0 3
4 4 5 0 1 1 3
5 4 2 0 1 0
6 7 1 3 3 0 1

เกรด เท่ากับศูนย์ไม่ได้ระบุ คะแนน k ศูนย์ ในตำแหน่ง (i, j) หมายถึงสิ่งต่อไปนี้: หากทัวร์ไม่รวมเส้นทางจาก i ถึง j (ราคา 0) คุณจะต้องจ่ายอย่างน้อย k

ดังนั้นเราจึงสามารถแบ่งประเภทของทัวร์ที่เป็นไปได้ทั้งหมดออกเป็นสองประเภท: ทัวร์ที่มี Edge (i, j) และทัวร์ที่ไม่มีทัวร์นั้น สำหรับอย่างหลัง คะแนนขั้นต่ำจะเพิ่มขึ้นอีก k พิจารณาขอบที่สอดคล้องกับศูนย์ด้วยคะแนนสูงสุด ในนี่คือขอบ (1, 2)

ตามที่กล่าวไว้ข้างต้น คลาสของทัวร์ทั้งหมดจะถูกแบ่งออกเป็นสอง: ทัวร์ที่มีขอบ (1, 2) และทัวร์ที่ไม่มีทัวร์

ค่าประมาณราคาทัวร์ชั้นสองที่ต่ำกว่าเพิ่มขึ้นเป็น 35 หากต้องการกำหนดการประมาณการสำหรับทัวร์ชั้นหนึ่ง ให้ลบแถว 1 และคอลัมน์ 2 ออกจากเมทริกซ์ (ลองแสดงว่าเป็น C [(1,2)]) : :

เนื่องจากเมทริกซ์สามารถลดลงเหลือ 1 ได้ (ในคอลัมน์ที่ 1) การประมาณคลาสของทัวร์ที่มีขอบ (1, 2) จะเพิ่มขึ้น 1 และเท่ากับ 35

การแบ่งออกเป็นชั้นเรียนและการประเมินสามารถแสดงเป็นแผนภูมิต้นไม้ได้:

ดังนั้น ชั้นเรียน (ALL) จึงถูกแบ่งออกเป็นสองส่วนและคำนวณคะแนนที่เกี่ยวข้อง

ตอนนี้ให้เราเลือกชั้นเรียนที่มีคะแนนต่ำสุดและทำซ้ำตามขั้นตอนนี้ จากนั้น จากผลลัพธ์ทั้งสองคลาส เราจะเลือกคลาสที่มีคะแนนขั้นต่ำและแยกคลาสนั้น เราจะทำซ้ำจนกระทั่งถึงใบของต้นไม้ นั่นคือจนกว่าเราจะได้เมทริกซ์ 0×0:

ค [(1, 2); [−](ก 1 , ข 1);

[−](ก 2 , ข 2); … [−](ก , ข ก)]


โดยที่ (แต่ละรายการ) −(x, y) หมายความว่าเมทริกซ์สอดคล้องกับคลาสที่ไม่มีขอบ (x, y) เราจะได้สิ่งต่อไปนี้เมื่อเอาองค์ประกอบของรูปแบบ −(x, y) ออกจากสัญลักษณ์เมทริกซ์ : :


(ค 0 , วัน 0);

1 2 3 4 5 6
1 0 3 3 3 6
2 0 1 1 4 1 0
3 1 1 0 1 0 3
4 4 4 0 1 1 3
5 4 1 0 1 0
6 7 0 1 3 3 0

(ค 1, วัน 1); … (c n , d n)

จุดยอด (5, 4) ของต้นไม้จะสอดคล้องกับคลาสที่มีขอบ: (1, 2); (3, 1); (6, 5); (2, 6); (4, 3); (5, 4) แน่นอนว่าคลาสนี้ประกอบด้วยหนึ่งทัวร์เต็ม (1, 2, 6, 5, 4, 3, 1) โดยมีค่าใช้จ่าย = 36 (สำหรับทัวร์เต็มจำนวน คะแนนขั้นต่ำจะเท่ากับต้นทุนที่แน่นอน)

ขอให้จำผลลัพธ์นี้เป็นบันทึกและเลื่อนขึ้นไปบนต้นไม้ "ขีดฆ่า" จุดยอดทั้งหมด (นั่นคือไม่รวมจากการพิจารณาเพิ่มเติมทุกชั้นเรียน) ซึ่งมีคะแนนมากกว่าหรือเท่ากับคะแนนที่เพิ่งพบ นอกจากนี้ เราจะขีดฆ่าจุดยอดแม้ว่าผู้สืบทอดทั้งสองจะถูกขีดฆ่าออก แม้ว่าจะมีการประเมินก็ตาม เราได้รับสิ่งต่อไปนี้:

ดังนั้นจึงไม่มีจุดยอดเหลืออยู่ การค้นหาเสร็จสิ้น และค่าบันทึกที่พบระหว่างนั้นและรอบที่สอดคล้องกันคือวิธีแก้ปัญหา

ไม่มีการประมาณการทางทฤษฎีที่น่าพอใจสำหรับอัลกอริธึม Little และอัลกอริธึมอื่นๆ ที่คล้ายคลึงกัน แต่การฝึกฝนแสดงให้เห็นเช่นนั้น รถยนต์สมัยใหม่ช่วยให้สามารถแก้ปัญหาพนักงานขายที่กำลังเดินทางด้วยจุดยอด 100 จุด นอกจากนี้ อัลกอริธึมสาขาและขอบเขตยังเป็นขั้นตอนการศึกษาสำนึกที่มีประสิทธิภาพ หากไม่สามารถดำเนินการให้เสร็จสิ้นได้

ตัวอย่างที่ 2 ปัญหาการเปิดวงจร

วิธีการเดียวกันนี้สามารถนำไปใช้กับปัญหาการเปิดวงจรได้

คำชี้แจงปัญหา:

ให้กราฟ G = (V, E) แต่ละส่วนโค้ง (u, v) เชื่อมโยงกับจำนวนบวก c (u, v) - น้ำหนักของส่วนโค้งนี้

จำเป็นต้องค้นหา E 0 ⊂ E เพื่อให้กราฟ (V , E 0) ไม่มีรูปทรงและผลรวมของน้ำหนักของส่วนโค้ง (จาก E 0) คือค่าสูงสุด ลองพิจารณาปัญหาเสริม (เราแสดงว่ามัน (E, E *)) คล้ายกับปัญหาที่เพิ่งกำหนด แต่ด้วยพารามิเตอร์เพิ่มเติม

— ชุด E * ⊂ E ที่ไม่สามารถเอาส่วนโค้งออกได้ (ในกรณีนี้ เราจะกำหนดให้กราฟ (V , E *) ไม่มีรูปทรง)

หากมีปัญหา (E, E *) ก็เป็นไปได้ที่จะแบ่งชุดการแก้ปัญหาทั้งหมดออกเป็นสองประเภทดังนี้

พิจารณาส่วนโค้ง (u, v) ∈ E\E* โดยที่กราฟ (V, E* ∪ (u, v)) ไม่มีรูปทรง

  1. จากนั้นชุดวิธีแก้ไขปัญหาสามารถแบ่งออกเป็นสอง:
  2. ชุดวิธีแก้ไขปัญหา (E \ (u, v), E *)

ชุดวิธีแก้ไขปัญหา (E , E* ∪ (u , v))

ปัญหาเดิมของการเปิดวงจรคือปัญหาอย่างเห็นได้ชัด (E, Ø)

  1. ตอนนี้เราขอแนะนำฟังก์ชัน est(E, E 0) ดังนี้:
  2. ถ้ากราฟ (V , E) ไม่มีวงจร ดังนั้น est(E , E 0) = 0

มิฉะนั้น ให้ E cyc เป็นวัฏจักร จากนั้น: est(E , E 0) = est(E \ E cyc , E 0) + c cyc โดยที่ c cyc = min( c (u , v) | (u , v ) ∈ E cyc \ E 0 ) (เช่น น้ำหนักขั้นต่ำที่สามารถใช้เพื่อเปิดรอบนี้)

มันง่ายที่จะแสดงสิ่งนั้น

วี (อี , อี 0) ≥ เอสที(อี , อี 0),

โดยที่ v (E, E 0) คือผลรวมขั้นต่ำของน้ำหนักของส่วนโค้ง ซึ่งการลบออกจาก E \ E 0 จะเปิดรูปทรงทั้งหมดของกราฟ

วิธีการปรับปรุงท้องถิ่น ("การค้นหาในท้องถิ่น") แนวคิดของวิธีนี้ก็คือสำหรับแต่ละวิธีแก้ปัญหาของปัญหาสุดขีด x ∈ X จะมีการกำหนดย่านใกล้เคียงของวิธีแก้ปัญหาที่ใกล้เคียง A (x) และในการวนซ้ำแต่ละครั้งกระบวนการคำนวณ เมื่อพิจารณาจากวิธีแก้ปัญหาปัจจุบัน x มีความพยายามที่จะค้นหาวิธีแก้ปัญหาในบริเวณใกล้เคียงที่จะมีคุ้มค่าที่สุด

ฟังก์ชั่นเป้าหมาย หากสามารถพบวิธีแก้ปัญหาดังกล่าวได้ ก็จะกลายเป็นวิธีแก้ปัญหาในปัจจุบัน หากไม่พบ การค้นหาจะสิ้นสุดลง โดยเฉพาะกลยุทธ์ค้นหาในท้องถิ่น

  • เริ่มต้นด้วยวิธีแก้ปัญหาแบบสุ่ม
  • หากต้องการปรับปรุงโซลูชันปัจจุบัน ให้นำการเปลี่ยนแปลงใดๆ จากชุดการแปลงที่กำหนดไปใช้กับโซลูชันดังกล่าว โซลูชันที่ได้รับการปรับปรุงนี้จะกลายเป็นโซลูชันปัจจุบัน
  • ทำซ้ำขั้นตอนนี้จนกว่าจะไม่มีการแปลงในชุดที่กำหนดช่วยปรับปรุงโซลูชันปัจจุบัน

หากชุดการแปลงที่กำหนดรวมการแปลงที่เป็นไปได้ทั้งหมด (ซึ่งสามารถได้รับอย่างอื่นจากโซลูชันใดๆ ก็ตาม) เราก็จะได้โซลูชันที่แน่นอน (เหมาะสมที่สุดทั่วโลก) แต่ความซับซ้อนของอัลกอริทึมดังกล่าวจะไม่ดีไปกว่าการแจกแจงโซลูชันทั้งหมด .

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


ลองพิจารณาอัลกอริธึมที่แน่นอนในการค้นหาแผนผังการขยายขั้นต่ำในกราฟโดยใช้วิธีการค้นหาในท้องถิ่น การแปลงเฉพาะที่จะเป็นดังนี้: เราใช้ขอบหนึ่งหรือขอบอื่นที่ไม่เกี่ยวข้องกับแผนผังการขยายปัจจุบันและเพิ่มลงในแผนภูมิ (รับวงจร) จากนั้นจึงลบขอบด้านหนึ่งออกจากวงจรนี้ (ด้วยต้นทุนสูงสุด) สิ่งนี้จะดำเนินต่อไปจนกระทั่งขอบทั้งหมดด้านนอกต้นไม้มี ต้นทุนสูงสุดท่ามกลางขอบทั้งหมดในลูปที่เกิดขึ้นเมื่อเพิ่มมันเข้ากับทรี (การตรวจสอบนี้ใช้เวลาเพียงอย่างเดียว O(|V||E|)) อัลกอริธึมนี้ช้ากว่าอัลกอริธึมของ Prim และ Kruskal และเป็นตัวอย่างการใช้การค้นหาในท้องถิ่นอย่างไม่เหมาะสมสำหรับปัญหาที่ไม่สมบูรณ์


ตัวอย่างที่ 2 ปัญหาการเดินทางของพนักงานขาย (สองทางเลือก)

การเปลี่ยนแปลงที่ง่ายที่สุดที่สามารถใช้ในปัญหาพนักงานขายที่เดินทางแบบสมมาตรได้คือสิ่งที่เรียกว่า "ทางเลือกสองทาง"

ประกอบด้วยความจริงที่ว่าเราเลือกสองขอบใด ๆ (เช่น (a, b) และ (c, d)) ลบออกและ "สลับใหม่" จุดที่เชื่อมต่อกันเพื่อสร้างเส้นทางใหม่ หากผลรวมของต้นทุนของสองขอบใหม่น้อยกว่าสองอันเก่า เราก็พบเส้นทางที่ดีขึ้นแล้ว


ตัวเลือกคู่สามารถสรุปเป็น k-choice ได้ ในกรณีนี้ เราจะลบขอบออกมากถึง k และ "สลับ" องค์ประกอบที่เหลือในลำดับใดๆ ก็ตาม เพื่อพยายามหาเส้นทาง โดยทั่วไป เราไม่ต้องการให้ขอบที่จะถอดออกต้องไม่อยู่ติดกัน

เป็นเรื่องง่ายที่จะตรวจสอบว่าจำนวนการแปลงต่างๆ ที่ต้องพิจารณาในการเลือก k คือ O(|V|k) แต่ทั้งนี้ระยะเวลาที่ต้องได้รับใดๆ เส้นทางที่เหมาะสมที่สุดอาจกลายเป็นมากกว่านั้นมาก

ในทางปฏิบัติ "การเลือกความลึกแบบแปรผัน" มีประสิทธิภาพมาก มีความเป็นไปได้สูงที่จะให้เส้นทางที่เหมาะสมที่สุดสำหรับ | วี | = 40 - 100.

ตัวอย่างที่ 3: ปัญหาการวางบล็อก

การกำหนดปัญหาของการวางบล็อกหนึ่งมิติ: จำเป็นต้องเรียงลำดับจุดยอดของกราฟที่ไม่ได้กำหนดทิศทาง G = (V, E) โดยมีน้ำหนักบนขอบ c (u, v) โดยกำหนดหมายเลขด้วยตัวเลข 1 ... n เพื่อลด ∑ i, j = 1 ... n | ฉัน - เจ | ค (วี ฉัน , วีเจ); น = | วี|.

จุดยอดของกราฟมักเรียกว่า "บล็อก" และน้ำหนักจะถูกตีความว่าเป็นจำนวน "เส้นลวด" ระหว่างบล็อก จากนั้นสาระสำคัญของปัญหาจะชัดเจน: จำเป็นต้องจัดเรียงองค์ประกอบเป็นเส้นตรงเพื่อให้ความยาวของสายไฟที่จำเป็นในการเชื่อมต่อมีน้อยที่สุด

เช่นเดียวกับปัญหาสองมิติที่คล้ายกัน ให้ค้นหาแอปพลิเคชันเมื่อทำการเชื่อมต่อ บอร์ดลอจิกและการสร้างวงจรรวม

หากต้องการค้นหาวิธีแก้ปัญหาที่เหมาะสมที่สุดสำหรับปัญหาการวางบล็อก คุณสามารถใช้การแปลงเฉพาะที่ต่อไปนี้:

  1. ดำเนินการจัดเรียงบล็อกที่อยู่ติดกัน v i และ v i +1 ใหม่ร่วมกัน หากลำดับผลลัพธ์มีต้นทุนที่ต่ำกว่า อนุญาต

    L (j) = ∑ k =1… j −1 c (v k , v j);
    R (j) = ∑ k = j +1… n c (v k , v j)

    การปรับปรุงสามารถทำได้ถ้า

    L (i) − R (i) + R (i +1) − L (i +1) + 2 c (v i , vi +1)< 0

  2. ใช้บล็อก v i และแทรกระหว่างบางบล็อก v i และ v i +1 สำหรับค่าบางค่าของ i และ j
  3. ทำการจัดเรียงบล็อกสองบล็อก vi และ v j ร่วมกัน

เช่นเดียวกับปัญหาของพนักงานขายที่ต้องเดินทาง เราไม่สามารถประมาณเวลาที่ต้องการได้อย่างแม่นยำเพื่อค้นหาพนักงานขายที่เหมาะสมที่สุดในท้องถิ่น จะเห็นได้ว่าถ้าเราจำกัดตัวเองอยู่แต่ในการเปลี่ยนแปลง ( 1 ) เวลา O(|V|) จะเพียงพอที่จะตรวจสอบว่าการแปลงที่ดำเนินการอยู่นั้นมีการปรับปรุงหรือไม่ และคำนวณ L(i) และ R(i) สำหรับการแปลง ( 2 ) และ ( 3 ) คราวนี้เพิ่มขึ้นเป็น O(|V|2) แต่นี่ไม่ใช่การประมาณการเวลาในการค้นหาจุดที่เหมาะสมที่สุดในท้องถิ่น เนื่องจากการปรับปรุงแต่ละครั้งสามารถสร้างโอกาสในการปรับปรุงใหม่ๆ ได้

วิธีการโดยประมาณและฮิวริสติก

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

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

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

ตัวอย่างที่ 1 ปัญหาการเดินทางของพนักงานขาย (อัลกอริธึมไม้)

ให้เราพิจารณาอัลกอริธึมการเรียนรู้สามแบบที่ช่วยแก้ปัญหาพนักงานขายที่เดินทางแบบสมมาตรด้วยความไม่เท่าเทียมกันของสามเหลี่ยมโดยมีข้อผิดพลาดไม่เกินสองครั้ง (ρ = 2) อันแรกที่เรียกว่าอัลกอริธึมต้นไม้มีดังนี้: เรามาสร้างแผนผังการขยายขั้นต่ำสำหรับกราฟของเราโดยใช้อัลกอริทึมของ Prim จากนั้นสำรวจต้นไม้ตามลำดับรูตซ้ายขวา

การลบจุดยอดที่ซ้ำกัน

เวลาทำงานของอัลกอริทึมนี้คือ Θ(E) = Θ(V 2)

ตัวอย่างที่ 1 ปัญหาการเดินทางของพนักงานขาย (อัลกอริธึมความโลภและคาร์ก-ทอมป์สัน)

อัลกอริธึมที่ชัดเจนที่สุดในการแก้ปัญหาพนักงานขายที่กำลังเดินทางคือสิ่งที่โลภ: จากเมืองปัจจุบันไปยังเมืองที่ใกล้ที่สุดที่คุณยังไม่เคยไป หากความไม่เท่าเทียมกันของสามเหลี่ยมยังคงอยู่ ก็ไม่ใช่เรื่องยากที่จะพิสูจน์ว่าอัลกอริทึมนี้ผิดมากที่สุดสองเท่า ความซับซ้อนของอัลกอริทึมนี้คือ O(V 2)


อัลกอริธึม Karg-Thompson (การวิเคราะห์พฤติกรรมจุดที่ใกล้ที่สุด) ไม่ค่อยชัดเจนนัก: ขั้นแรกเราใช้จุดยอดที่ใกล้ที่สุดสองจุด (ทัวร์ที่เสื่อมลง) จากนั้นวนซ้ำรอบขอบทั้งหมดของทัวร์ที่สร้างไว้แล้ว สำหรับแต่ละขอบ (u, v) เรา เลือกจากจุดยอดอิสระ a w โดยที่ c ( u , w) + c (w , v) − c (u , v) มีน้อยที่สุดและเรารวม w ในการทัวร์ระหว่าง u และ v สำหรับวิธีนี้ก็เช่นกัน ρ = 2 แต่ความซับซ้อนของมันอยู่ที่ O (V 3) แล้ว

ตัวอย่างที่ 2 ปัญหาการครอบคลุมจุดยอด

ปัญหาการปกคลุมจุดยอดประกอบด้วยการค้นหาการปกคลุมจุดยอด ขนาดขั้นต่ำ- ปัญหานี้เป็นปัญหา NP-hard แต่อัลกอริธึมอย่างง่ายด้านล่างนี้แก้ไขได้ด้วยข้อผิดพลาดไม่เกินสองครั้ง

ให้ C เป็นส่วนที่สร้างขึ้นแล้วของส่วนปกของจุดยอด และ E ′ เป็นส่วนที่เปิดของกราฟ ในแต่ละขั้นตอน เราจะนำขอบจาก E ′ และเพิ่มปลาย u และ v ไปที่ C และจาก E ′ เราจะลบขอบทั้งหมดที่มีจุดสิ้นสุด u หรือ v และต่อไปเรื่อยๆ จนกว่าเซต E ′ จะว่างเปล่า เวลาทำงานของอัลกอริทึมนี้คือ O(E)

เพื่อพิสูจน์ว่าอัลกอริธึมนี้ไม่แย่ไปกว่าสองเท่าของอัลกอริธึมที่แน่นอน ก็เพียงพอที่จะทราบว่าไม่มีสองขอบที่เลือกโดยอัลกอริธึมที่มีจุดยอดร่วมกัน ซึ่งหมายความว่าจำนวนจุดยอดใน C จะเป็นสองเท่าของจำนวนขอบเหล่านี้ . การครอบคลุมที่เหมาะสมที่สุดจะมีจุดยอดอย่างน้อยหนึ่งจุดของแต่ละจุด และจุดยอดทั้งหมดนี้แตกต่างกัน

รับเซตจำกัด X และตระกูลของเซตย่อย F ในกรณีนี้:

X =∪ ส ∈ ฉ ส

เรากำลังมองหาจำนวนเซตย่อยขั้นต่ำของ F ที่รวมกันครอบคลุมเซต X กล่าวคือ ตระกูล C ของจำนวนสมาชิกที่น้อยที่สุดซึ่ง:

X =∪ ส ∈ ซี ส

เราจะเรียกครอบครัวดังกล่าวว่า C ว่าเป็นการปกปิดเซต X ตัวอย่างเช่น ในรูป วงกลมสีดำเป็นองค์ประกอบของเซต X รูปทรงเป็นสับเซตของ F รูปทรงทึบแสงสามเส้นประกอบกันเป็นความครอบคลุมขั้นต่ำ อัลกอริธึมโลภให้การครอบคลุมที่มีจำนวนสมาชิกเพิ่มขึ้นหนึ่งเส้น (รวมถึงเส้นขอบแบบประด้วย)

เราจะแก้ปัญหาโดยใช้อัลกอริธึมการประมาณโลภ ปล่อยให้เซต U มีองค์ประกอบที่ยังไม่ครอบคลุม และตระกูล C มีเซตย่อยที่รวมอยู่ในความคุ้มครองแล้วในแต่ละขั้นตอน จะต้องเลือกอย่างละโมบ โดยเอา S มาเป็นฉากปิด

จำนวนมากที่สุด

องค์ประกอบที่ยังไม่ครอบคลุม สิ่งนี้จะเกิดขึ้นจนกว่า U จะว่างเปล่า ความซับซ้อนของอัลกอริทึมคือ O (| X |·| F |·min(| X |,| F |))ขนาดของการครอบคลุมที่กำหนดโดยอัลกอริธึมนี้เกินค่าต่ำสุดที่เป็นไปได้โดยไม่เกิน H (สูงสุด (| S |: S ∈ F )) เท่า (โดยที่ H (d) คือผลรวมของเทอม d แรก

ซีรีย์ฮาร์มอนิก

) หรือซึ่งเท่ากัน โดย (ln| X | + 1) เท่า อัลกอริธึมเทียมพหุนามกลายเป็นสิ่งเล็กๆได้

ตัวอย่างที่ 1 ปัญหาผลรวมย่อย (อัลกอริทึม "ตาราง")

ให้คู่ (S, t) ถูกกำหนดไว้ โดยที่ S = ( x 1 , x 2 , …, xn ) คือเซตของจำนวนเต็มบวก และ t คือจำนวนเต็มบวก จำเป็นต้องค้นหาในกลุ่มย่อยของเซต S ซึ่งผลรวมไม่เกิน t ซึ่งเป็นเซตที่ผลรวมใกล้กับ t มากที่สุด

ให้ | ส | = น. สมมติว่า (k, w) - ปัญหาที่มีตัวเลข k ตัวแรกจาก S และคุณต้องพิมพ์ผลรวม w ดังนั้น ปัญหาเดิมคือปัญหา (n, t)

เพื่อแก้ปัญหา เราจะสร้างตาราง T [n, t + 1] ในเซลล์ T [i, j] ซึ่งเราจะเขียนวิธีแก้ปัญหาที่เหมาะสมที่สุด (i, j)

คอลัมน์แรกจะเต็มไปด้วยศูนย์ มาเติมเลขศูนย์ในบรรทัดแรกก่อน และเริ่มจากเซลล์ (1, x 1) ด้วยตัวเลข x 1 เราจะเติมเซลล์ T [i, j] (i, j > 1) ตามกฎ:

  1. ถ้า j − x i > 0 แล้ว y:= T [ i − 1, j − x i ] มิฉะนั้น y:= 0;
  2. T [ i , j ] := สูงสุด(T [ i − 1, j ], y + x i)
0 1 2 3 4 5 6 7 8 9 10 11 12 13
3 0 0 0 3 3 3 3 3 3 3 3 3 3 3
5 0 0 0 3 3 5 5 5 8 8 8 8 8 8
7 0 0 0 3 3 5 5 7 8 8 10 10 12 12
9 0 0 0 3 3 5 5 7 8 9 10 10 12 12
11 0 0 0 3 3 5 5 7 8 9 10 11 12 12

ส = (3, 5, 7, 9, 11) เสื้อ = 13;

ตารางก็จะประมาณนี้ คำตอบ: ไม่มีเซตย่อยที่มีน้ำหนัก 13 โดยที่ใกล้ที่สุดจากด้านล่างคือ 12

เงื่อนไข (2) บอกว่าสามารถหาผลรวมที่เหมาะสมได้โดยไม่ต้องใช้ x i (T [ i − 1, j ]) หรือถ้า x i รวมอยู่ในผลรวม (y + x i) ในกรณีนี้ จะต้องเพิ่มเข้าไปในคำตอบของปัญหา (i − 1, j − x i) ซึ่งถูกเก็บไว้ในตัวแปร y ในเงื่อนไข (1) จากตารางผลลัพธ์คุณสามารถค้นหาองค์ประกอบของปริมาณที่เหมาะสมได้

ความซับซ้อนของอัลกอริทึมนี้คือการดำเนินการ O(n t) ดังนั้น หาก t มีค่ามาก ก็เป็นไปได้ที่จะหารตัวเลขทั้งหมด เช่น ด้วย 10 เพื่อปัดเศษและรับอัลกอริธึมโดยประมาณ

ตัวอย่างที่ 2 ปัญหาผลรวมย่อย (อัลกอริทึม "รายการ")

ให้ L เป็นชุดตัวเลขและ x เป็นตัวเลขจำนวนหนึ่ง จากนั้นโดย L + x เราจะแสดงถึงชุดตัวเลขที่จะได้รับหากเพิ่ม x เข้ากับองค์ประกอบทั้งหมดของ L อัลกอริธึมนี้ยังใช้ข้อเท็จจริงที่ว่า x i อาจรวมหรือไม่รวมไว้ในผลรวมด้วย นั่นคือ:

L i = L i −1 ∪ (L i −1 + x i)

เมื่อกำจัดองค์ประกอบที่มีขนาดใหญ่กว่า t ออกจากรายการ เราจะได้ L n ซึ่งเป็นรายการเรียงลำดับของผลรวมที่เป็นไปได้ทั้งหมดของเซตย่อย S ที่ทำให้เราพอใจ ยังคงต้องใช้องค์ประกอบสูงสุด (สุดท้าย) เพื่อให้ได้แนวทางแก้ไขปัญหา รายการ L n สามารถมีองค์ประกอบได้มากถึง 2 n องค์ประกอบ (นั่นคือ อัลกอริธึมเป็นแบบเลขชี้กำลัง) อย่างไรก็ตาม เนื่องจาก องค์ประกอบทั้งหมดแตกต่างกัน ไม่สามารถมีได้มากกว่า t มีพหุนามเทียม

รูปแบบความใกล้ชิด

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

เราจะพิจารณารูปแบบการประมาณสองรูปแบบสำหรับปัญหาผลรวมของเซตย่อย

หนึ่งในนั้นมาจากอัลกอริทึม "รายการ" และอีกอันเรียกว่าอัลกอริทึมของจอห์นสัน

ตัวอย่างที่ 1 ปัญหาผลรวมเซตย่อย (รูปแบบการประมาณพหุนามเต็ม)

โครงการดังกล่าวได้มาจากอัลกอริธึม "รายการ" หากรายการ L ถูกจัดเก็บในรูปแบบที่ลดลง รายการ L′ เรียกว่าการลดทอนของรายการ L ถ้า L′ เป็นส่วนหนึ่งของ L และ

∀ y ∈ L ∃ ​​​​z ∈ L ′: z ≤ y , (y − z) ⁄ y ≤ δ<10, 11, 12, 15, 20, 21, 22, 23, 24, 29>ตัวอย่างเช่น δ = 0.1 และ L =<10, 12, 15, 20, 23, 29>รายการ L ′ =

คือ δ -การหดตัว

การลดรายการเรียงลำดับขององค์ประกอบ m ต้องใช้การดำเนินการ Θ(m) ดังนั้นจึงสามารถพิสูจน์ได้ว่าอัลกอริธึม "รายการ" ซึ่งจัดเก็บรายการที่สั้นลงแทนที่จะเป็นรายการทั้งหมด เป็นรูปแบบการประมาณพหุนามโดยสมบูรณ์

  1. ตัวอย่างที่ 2 ปัญหาผลรวมย่อย (อัลกอริทึมของจอห์นสัน)< t , Δ = t − t ′ min
  2. อัลกอริธึมนอกเหนือจากเซต S และตัวเลข t ยังใช้เป็นอินพุตของพารามิเตอร์จำนวนเต็ม m > 2 ลองเรียกตัวเลขที่ i มีขนาดใหญ่ถ้า x i > t ⁄(m +1) คำอธิบายของอัลกอริทึม:
  3. แจกแจงชุดย่อยทั้งหมดของตัวเลขขนาดใหญ่ และค้นหาเซตของตัวเลขขนาดใหญ่ที่มีผลรวม t ′: t ′
  4. ถ้า Δ = 0 แสดงว่าอัลกอริทึมเสร็จสิ้น

จัดเรียงตัวเลขเล็กๆ ทั้งหมดตามลำดับจากมากไปหาน้อย ถ้า x i ≤ Δ ถัดไป แล้ว t ′:= t ′ + x i, Δ := Δ − x i;

เมื่อการค้นหาตัวเลขขนาดเล็กเสร็จสิ้น ให้ส่งกลับ t ′ เป็นคำตอบ

ให้ k เป็นจำนวนตัวเลขจำนวนมาก จากนั้นเราสามารถพิสูจน์ได้ว่าจำนวนเซตย่อยที่เหมาะสมสำหรับเราจากจำนวนมากคือ O (k m) ≤ O (n m) ดังนั้น การค้นหาจึงมีความซับซ้อนพหุนามซึ่งเพิ่มขึ้นด้วย m นอกจากนี้ ยังสามารถแสดงได้ว่า:

T ′⁄ t ≥ 1 − 1 ⁄ (m + 1) 1 − 1 ⁄ (m + 1) ≤ t ′⁄ t* ≤ 1

โดยทั่วไปแล้ว การเลือกวิธีแก้ปัญหาสามารถแสดงเป็นลำดับของตัวเลือกได้

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

การแก้ปัญหาใด ๆ โดยใช้วิธีนี้.......... โปรด. สำหรับข้อความค้นหา "วิธีการค้นหาแบบสุ่ม"เครื่องมือค้นหาของ Google

ประกาศมีลิงก์มากกว่า 300,000 ลิงก์ ข้อมูลนี้ก็น่าจะเพียงพอแล้ว.........

ขอบคุณสำหรับบทความ ฉันค้นพบอัลกอริธึมของ Little แล้ว ฉันอยากจะจำเว็บไซต์นี้ไว้และรู้สึกประหลาดใจที่เห็นโดเมนของมหาวิทยาลัยในประเทศของฉัน :)

มีการระบุไว้อย่างถูกต้องข้างต้นเกี่ยวกับการห้ามการเปลี่ยน - ฉันต้องการดูคำอธิบายที่นี่ ขอบคุณสำหรับคำอธิบายที่ชัดเจนของอัลกอริทึมของ Little แต่ไม่ได้นำมาพิจารณารายละเอียดที่สำคัญ : เมื่อเลือกขอบถัดไป คุณต้องคำนึงว่าเส้นทางจากชุดขอบตามลำดับครอบคลุมทุกจุด เนื่องจากเราเพิ่มขอบเข้าไปลำดับแบบสุ่ม

จากนั้นคุณจะต้องติดตามการมีอยู่ของไมโครไซเคิล (เช่น คุณเลือก edge 1.0 - ซึ่งหมายความว่า 0, 1 ไม่สามารถเลือกได้อีกต่อไป หรือคุณเลือก 0.1 และ 1.2 - แล้วคุณจะไม่สามารถเลือก 2.0 และ 2.1 ได้ เป็นต้น) ซึ่งไม่ใช่เรื่องง่ายที่จะติดตาม ฉันใช้อัลกอริธึมใน C# ติดตามรอบโดยใช้คลาสพิเศษที่มีชุดไมโครไซเคิลและขีดฆ่าขอบต้องห้ามเมื่อมีการเพิ่มอันใหม่เข้าไป และคืนค่าขอบเมื่อลบขอบออก การใช้อัลกอริธึมกลายเป็นเรื่องยากมากในทางปฏิบัติ และการดีบักของมันก็แย่มาก รหัสใช้เวลา 512 บรรทัด ประมวลผล 20 จุดใน 0.1 - 10 วินาที - ระยะเวลาขึ้นอยู่กับชุดอินพุตอย่างมากมากกว่า

มันไม่สามารถแก้ไขได้ภายในเวลาอันสมควร เสิร์ชเอ็นจิ้นที่ง่ายที่สุดที่ฉันค้นพบวิธีแก้ปัญหาสำหรับ 13 จุดยอดใน 1 วินาที หากคุณต้องการใช้งานอัลกอริทึมใน C# โปรดเขียนถึงเราทางอีเมล.

[ป้องกันอีเมล]

การแก้ปัญหาพนักงานขายเดินทางโดยใช้วิธีสาขาและผูกมัด (อัลกอริทึมของลิตเติ้ล)

วิธีการของ Little ใช้ได้เฉพาะกับจุดจำนวนเล็กน้อยเท่านั้น ดังนั้นในทุกตัวอย่างจะมีได้ไม่เกิน 10 จุด โดยเริ่มจาก 15 จุด ให้ผลลัพธ์มากกว่าค่าต่ำสุดโดยประมาณ 1-2% และสิ่งนี้มีอยู่ในตัว ลำดับการพิจารณาการเคลื่อนไหวแต่ละครั้ง (การลดลง) ยังไม่ชัดเจนว่าจะทำสิ่งใด

ฉันกำลังส่ง "วิธีการแบบรัสเซีย" ให้คุณเพื่อยืนยันความคิดเห็นของฉัน

ขอบคุณ เราไม่สงสัยในความซื่อสัตย์และความสามารถของคุณ แต่เราไม่ได้โฮสต์ไฟล์ *.doc หากคุณโพสต์เนื้อหาในที่สาธารณะพร้อมสถานะ ที่เก็บข้อมูลถาวรและรวมลิงก์ไว้ในข้อความความคิดเห็นใหม่ของคุณเราจะเผยแพร่ให้ทุกคนเห็น

สำหรับใครก็ตามที่ต้องการเรียนรู้เกี่ยวกับข้อผิดพลาดทางทฤษฎีทั้งหมดของวิธีของ Little ฉันขอให้คุณอธิบายตัวเองก่อนว่าการลดลงคืออะไรและดำเนินการตามหลักคณิตศาสตร์ใด นอกจากนี้ ฉันสามารถส่งวิธีการภาษารัสเซียที่ฉันพัฒนาโดยคุณได้ฟรี อีเมลของฉัน: หากคุณต้องการใช้งานอัลกอริทึมใน C# โปรดเขียนถึงเราทางอีเมล