กลับไปหน้าบทความ

อ่าน 5 นาที

ออพติมเจ

OptimJ เป็นส่วนขยายสำหรับ Java ที่รองรับภาษาสำหรับการเขียนแบบจำลองการเพิ่มประสิทธิภาพและนามธรรมสำหรับการประมวลผลข้อมูลจำนวนมาก...

ออพติมเจ

ออพติมเจ
กระบวนทัศน์เชิงวัตถุ
ออกแบบโดยอาเตจิ
ปรากฏครั้งแรก2006 ( 2006 )
เว็บไซต์www.Ateji.com
ได้รับอิทธิพลจาก
ชวา

OptimJเป็นส่วนขยายสำหรับJavaที่รองรับภาษาสำหรับการเขียนแบบจำลองการเพิ่มประสิทธิภาพและนามธรรมสำหรับการประมวลผลข้อมูลจำนวนมาก ส่วนขยายและผลิตภัณฑ์ที่เป็นกรรมสิทธิ์ซึ่งนำส่วนขยายไปใช้ได้รับการพัฒนาโดย Ateji ซึ่งเลิกกิจการในเดือนกันยายน 2011 [ 1 ] OptimJ มีเป้าหมายที่จะนำเสนอสัญกรณ์พีชคณิตที่ชัดเจนและกระชับสำหรับการสร้างแบบจำลองการเพิ่มประสิทธิภาพ ขจัดอุปสรรคด้านความเข้ากันได้ระหว่างการสร้างแบบจำลองการเพิ่มประสิทธิภาพและเครื่องมือการเขียนโปรแกรมแอปพลิเคชัน และนำเทคนิควิศวกรรมซอฟต์แวร์ เช่น การวางแนวเชิงวัตถุและการสนับสนุน IDE ที่ทันสมัยมาสู่ผู้เชี่ยวชาญด้านการเพิ่มประสิทธิภาพ

โมเดล OptimJ สามารถใช้งานร่วมกับซอร์สโค้ด Java และไลบรารี Java ที่มีอยู่แล้วได้โดยตรง เช่น การเข้าถึงฐานข้อมูล การเชื่อมต่อ Excel หรือส่วนติดต่อผู้ใช้แบบกราฟิก OptimJ สามารถใช้งานร่วมกับเครื่องมือพัฒนาต่างๆ เช่น Eclipse, CVS, JUnit หรือ JavaDoc ได้ OptimJ สามารถใช้งานได้ฟรีกับตัวแก้ปัญหาต่อไปนี้: lp_solve, glpk, LP หรือ MPS และยังรองรับตัวแก้ปัญหาเชิงพาณิชย์ต่อไปนี้ด้วย: MOSEKและ IBM ILOG CPLEX Optimization Studio

แนวคิดทางภาษา

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

ตัวอย่างการระบายสีแผนที่

เป้าหมายของ ปัญหา การระบายสีแผนที่คือการระบายสีแผนที่เพื่อให้บริเวณที่มีพรมแดนร่วมกันมีสีต่างกัน สามารถแสดงใน OptimJ ได้ดังนี้

ตัวอย่างแพ็กเกจ;// โมเดลอย่างง่ายสำหรับปัญหาการระบายสีแผนที่public model SimpleColoring solver lpsolve { // จำนวนสีสูงสุดint nbColors = 4 ;// ตัวแปรตัดสินใจเก็บสีของแต่ละประเทศvar int belgium in 1 .. nbColors ; var int denmark in 1 .. nbColors ; var int germany in 1 .. nbColors ;// ประเทศเพื่อนบ้านต้องมีสีที่แตกต่างกันข้อจำกัด{ เบลเยียม!= เยอรมนี; เยอรมนี!= เดนมาร์ก; }// จุดเริ่มต้นหลักในการทดสอบโมเดลของเราpublic static void main ( String [] args ) { // สร้างอินสแตนซ์ของโมเดลSimpleColoring m = new SimpleColoring ();// แก้ปัญหาm.extract ( ); m.solve ( );// พิมพ์คำตอบSystem.out.println ( " เบลเยียม: " + m.value ( m.belgium ) ) ; System.out.println ( " เดนมาร์ก: " + m.value ( m.denmark ) ) ; System.out.println ( " เยอรมนี: " + m.value ( m.germany ) ) ; } }

ผู้อ่านที่คุ้นเคยกับภาษา Java จะสังเกตเห็นความคล้ายคลึงกันอย่างมากกับภาษานี้ อันที่จริง OptimJ เป็นส่วนขยายที่อนุรักษ์นิยมของ Java: ทุกโปรแกรม Java ที่ถูกต้องก็เป็นโปรแกรม OptimJ ที่ถูกต้องเช่นกัน และมีพฤติกรรมเหมือนกัน

ตัวอย่างการระบายสีแผนที่นี้ยังแสดงคุณสมบัติเฉพาะของการเพิ่มประสิทธิภาพซึ่งไม่มีสิ่งที่เทียบเท่าโดยตรงใน Java ซึ่งนำเสนอโดยคำหลักmodel, var, constraints.

แนวคิดเฉพาะของห้องผ่าตัด

นางแบบ

โมเดลคือส่วนขยายของคลาสในภาษา Java ที่สามารถประกอบด้วยฟิลด์และเมธอด รวมถึงข้อจำกัดและฟังก์ชันเป้าหมายได้ โดยจะใช้คีย์เวิร์ด ` model` ในการสร้าง modelโมเดลและปฏิบัติตามกฎเดียวกันกับการประกาศคลาส โมเดลที่ไม่ใช่แบบนามธรรมจะต้องเชื่อมโยงกับตัวแก้ปัญหา (solver) ซึ่งใช้คีย์เวิร์ด ` solversolver` ความสามารถของตัวแก้ปัญหาจะกำหนดว่าข้อจำกัดประเภทใดสามารถแสดงในโมเดลได้ ตัวอย่างเช่น ตัวแก้ปัญหาเชิงเส้น เช่น`lp solve`จะอนุญาตเฉพาะข้อจำกัดเชิงเส้นเท่านั้น

ตัวแก้ปัญหาSimpleColoring สาธารณะlpsolve

ตัวแปรการตัดสินใจ

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

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

ตัวแปรตัดสินใจมีประเภทพิเศษที่กำหนดโดยคำหลัก `type` varโดยจะมีvarประเภทสำหรับประเภทข้อมูลที่เป็นไปได้แต่ละประเภทในภาษา Java

// ตัวแปรประเภท var สำหรับประเภทข้อมูลพื้นฐานของ Java var int x ;// ตัวแปรประเภท var สำหรับคลาสที่ผู้ใช้กำหนดเองvar MyClass y ;

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

var int germany in 1 .. nbColors ;

นี่เป็นเพียงวิธีเขียนแบบย่อที่เทียบเท่ากับการกำหนดข้อจำกัดให้กับตัวแปร

ข้อจำกัด

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

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

ข้อจำกัด{ เบลเยียม!= เยอรมนี; เยอรมนี!= เดนมาร์ก; }

ตัวดำเนินการนี้!=คือตัวดำเนินการไม่เท่ากับมาตรฐานของภาษา Java

ข้อจำกัดมักมาเป็นชุดๆ และสามารถกำหนดปริมาณได้ด้วยforallตัวดำเนินการ ตัวอย่างเช่น แทนที่จะแสดงรายการประเทศทั้งหมดและประเทศเพื่อนบ้านอย่างชัดเจนในซอร์สโค้ด เราอาจใช้อาร์เรย์ของประเทศ อาร์เรย์ของตัวแปรตัดสินใจที่แสดงสีของแต่ละประเทศ และอาร์เรย์boolean[][] neighboringหรือฟังก์ชันเชิงตรรกะ (ฟังก์ชันบูลีน) boolean isNeighbor()ก็ได้

ข้อจำกัด{ สำหรับประเทศทั้งหมดc1 : ประเทศต่างๆ, c2 : ประเทศต่างๆ, : เป็นเพื่อนบ้าน( c1 , c2 )) { สี[ c1 ] != สี[ c2 ] ; } }

Country c1 : countriesเป็นตัวสร้าง (generator): มันจะวนซ้ำไปc1เรื่อยๆ จนครบทุกค่าในคอลเลกcountriesชัน

:isNeighbor(c1,c2)เป็นตัวกรอง: มันจะเก็บเฉพาะค่าที่สร้างขึ้นซึ่งตรงตามเงื่อนไขที่กำหนด (สัญลักษณ์นี้:อาจอ่านได้ว่า "ถ้า")

สมมติว่าอาร์เรย์countriesประกอบด้วยbelgium, germanyและdenmarkและเงื่อนไขisNeighborส่งคืนค่าtrueสำหรับคู่ ( Belgium , Germany) และ ( Germany, Denmark) แล้วโค้ดนี้จะเทียบเท่ากับบล็อกข้อจำกัดของตัวอย่างการระบายสีแผนที่ดั้งเดิม

วัตถุประสงค์

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

แนวคิดทั่วไป

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

อาร์เรย์แบบเชื่อมโยง

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

int [ String ] อายุ;

ชนิดint[String]ข้อมูลที่แสดงถึงอาร์เรย์intที่มีดัชนีเป็นString. การเข้าถึงอาร์เรย์ OptimJ โดยใช้ไวยากรณ์ Java มาตรฐาน:

อายุ[ "Stephan" ] = 37 ; x = อายุ[ "Lynda" ] ;

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

int [ String ] age = { "Stephan" -> 37 , "Lynda" -> 29 };

หรือสามารถให้ในรูปแบบนิยามเชิงขยายได้ เช่น:

int [ String ] length [ String name : names ] = name . length ();

ในที่นี้ แต่ละรายการlength[i]จะถูกกำหนดค่าเริ่มต้นด้วยnames[i].length().

การเริ่มต้นแบบขยาย

ทูเพิล

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

(: int , String :) myTuple = new (: 3 , "Three" :); String s = myTuple # 1 ;

ทั้งชนิดข้อมูลทูเพิลและค่าทูเพิลจะเขียนอยู่ระหว่างเครื่องหมายจุลภาค(:และ เครื่องหมาย :)จุลภาค

ช่วง

ความเข้าใจ

Comprehensionsหรือที่เรียกว่าการดำเนินการรวมหรือการลดรูป คือนิพจน์ OptimJ ที่ขยายการดำเนินการไบนารีที่กำหนดให้กับชุดของค่า ตัวอย่างที่พบได้ทั่วไปคือการบวก:

// ผลรวมของจำนวนเต็มทั้งหมดตั้งแต่ 1 ถึง 10 int k = sum { i | int i in 1 .. 10 };

โครงสร้างนี้คล้ายคลึงกับ สัญลักษณ์ การหาผลรวม แบบบิ๊กซิกมา ที่ใช้ในคณิตศาสตร์ โดยมีไวยากรณ์ที่เข้ากันได้กับภาษาจาวา

นอกจากนี้ ยังสามารถใช้ Comprehensions ในการสร้างชุดข้อมูลต่างๆ เช่น รายการ เซต มัลติเซต หรือแผนที่ได้อีกด้วย:

// เซตของจำนวนเต็มทั้งหมดตั้งแต่ 1 ถึง 10 HashSet < Integer > s = ` hashSet (){ i | int i in 1 .. 10 };

สำนวนแสดงความเข้าใจสามารถมีสำนวนใดๆ ก็ได้เป็นเป้าหมาย ดังเช่น:

// ผลรวมของกำลังสองของจำนวนเต็มทั้งหมดตั้งแต่ 1 ถึง 10 int k = sum { i * i | int i in 1 .. 10 };

นอกจากนี้ พวกมันยังสามารถมีตัวสร้างและตัวกรองจำนวนเท่าใดก็ได้:

// ผลรวมของ f(i,j) ทั้งหมด สำหรับ 0<=i<10, 1<=j<=10 และ i!=j int k = sum { f ( i , j ) | int i : 10 , int j : 1 .. 10 , : i != j }

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

// เลือกชื่อจากตาราง persons ที่อายุมากกว่า 18 ปี` multiSet (){ p . name | Person p : persons , : p . age > 18 }

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

สภาพแวดล้อมการพัฒนา

OptimJ มีให้ใช้งานในรูปแบบปลั๊กอินของ Eclipse คอมไพเลอร์นี้ทำการแปลงโค้ดต้นฉบับจาก OptimJ ไปเป็น Java มาตรฐาน ทำให้สามารถใช้งานร่วมกับเครื่องมือพัฒนาส่วนใหญ่ในระบบนิเวศของ Java ได้ทันที

GUI ของ OptimJ และการสร้างต้นแบบอย่างรวดเร็ว

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

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

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

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

ตัวแก้ปัญหาที่รองรับ

OptimJ สามารถใช้งานได้ฟรีกับไฟล์รูปแบบ lp_solve, glpk, LP หรือ MPS และยังรองรับโปรแกรมแก้ปัญหาเชิงพาณิชย์ต่อไปนี้ด้วย: Mosek, IBM ILOG และ CPLEX Optimization Studio

  • การสร้างแบบจำลองเชิงวัตถุด้วย OptimJ
  • คู่มือภาษา OptimJ
  • OptimJ GUI
ดึงข้อมูลมาจาก " https://en.wikipedia.org/w/index.php?title=OptimJ&oldid=1333847657 "

สรุปเนื้อหา

ข้อมูลสำคัญจากบทความ

ข้อมูลสำคัญเกี่ยวกับ ออพติมเจ

OptimJ เป็นส่วนขยายสำหรับ Java ที่รองรับภาษาสำหรับการเขียนแบบจำลองการเพิ่มประสิทธิภาพและนามธรรมสำหรับการประมวลผลข้อมูลจำนวนมาก...

แนวคิดทางภาษา

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

ตัวอย่างการระบายสีแผนที่

เป้าหมายของ ปัญหา การระบายสีแผนที่ คือการระบายสีแผนที่เพื่อให้บริเวณที่มีพรมแดนร่วมกันมีสีต่างกัน สามารถแสดงใน OptimJ ได้ดังนี้

นางแบบ

โมเดลคือส่วนขยายของคลาสในภาษา Java ที่สามารถประกอบด้วยฟิลด์และเมธอด รวมถึงข้อจำกัดและฟังก์ชันเป้าหมายได้ โดยจะใช้คีย์เวิร์ด ` model` ในการสร้าง model โมเดลและปฏิบัติตามกฎเดียวกันกับการประกาศคลาส โมเดลที่ไม่ใช่แบบนามธรรมจะต้องเชื่อมโยงกับตัวแก้ปัญหา (solver)...