วิธีแก้ปัญหา Fractional Knapsack ใน C ++

Withi Kae Payha Fractional Knapsack Ni C



ปัญหาเป้แบบเศษส่วนในภาษา C++ หมายถึงการระบุวิธีการบรรจุสิ่งของที่มีน้ำหนักและกำไรที่กำหนดลงในกระเป๋าในลักษณะที่ทำให้กระเป๋ามีมูลค่าสูงสุดโดยไม่เกินขีดจำกัดสูงสุด

วิธีแก้ปัญหา Fractional Knapsack ใน C ++

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







อัลกอริทึมในการนำปัญหาเป้นเศษส่วนไปใช้

การทำงานของอัลกอริทึม Knapsack สามารถเข้าใจได้จากประเด็นต่อไปนี้:



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

แนวทางโลภในการแก้ปัญหากระเป๋าเป้สะพายหลังแบบเศษส่วน

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



#รวม

โดยใช้ เนมสเปซ มาตรฐาน ;

โครงสร้าง วัตถุ {

ภายใน มูลค่าน้ำหนัก ;


วัตถุ ( ภายใน ค่า, ภายใน น้ำหนัก )
: : ค่า ( ค่า ) , น้ำหนัก ( น้ำหนัก )
{
}


} ;

บูล ซีเอ็มพี ( โครงสร้าง วัตถุ x, โครงสร้าง วัตถุ ย )

{

สองเท่า A1 = ( สองเท่า ) x. ค่า / x. น้ำหนัก ;

สองเท่า A2 = ( สองเท่า ) และ. ค่า / และ. น้ำหนัก ;

กลับ A1 > A2 ;

}

สองเท่า เศษส่วนเป้ ( โครงสร้าง วัตถุอาร์เรย์ [ ] ,
ภายใน ใน, ภายใน ขนาด )
{

เรียงลำดับ ( ครับ ครับ + ขนาด, ซม ) ;


ภายใน curWeight = 0 ;

สองเท่า ค่าสุดท้าย = 0.0 ;


สำหรับ ( ภายใน ฉัน = 0 ; ฉัน < ขนาด ; ฉัน ++ ) {

ถ้า ( curWeight + อ๊าก [ ฉัน ] . น้ำหนัก <= ใน ) {
curWeight + = อ๊าก [ ฉัน ] . น้ำหนัก ;
ค่าสุดท้าย + = อ๊าก [ ฉัน ] . ค่า ;
}


อื่น {
ภายใน ยังคง = ใน - - curWeight ;
ค่าสุดท้าย + = อ๊าก [ ฉัน ] . ค่า
* ( ( สองเท่า ) ยังคง
/ อ๊าก [ ฉัน ] . น้ำหนัก ) ;

หยุดพัก ;
}
}

กลับ ค่าสุดท้าย ;


}

ภายใน ใน = 60 ;


วัตถุอาร์เรย์ [ ] = { { 100 , ยี่สิบ } ,
{ 380 , 40 } ,
{ 140 , 10 } ,
{ 180 , 30 } } ;

ภายใน ขนาด = ขนาดของ ( อ๊าก ) / ขนาดของ ( อ๊าก [ 0 ] ) ;


ศาล << 'กำไรสูงสุด = '

<< เศษส่วนเป้ ( arr, v, ขนาด ) ;

กลับ 0 ;

}

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





กำไรสูงสุดที่เก็บไว้ในขนมคือ 580



บทสรุป

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