Initializing help system before first use

Knapsack


Type: Knapsack
Rating: 1 (simple)
Description: We wish to choose among items of different value and weight those that result in the maximum total value for a given weight limit.
File(s): knapsack_graph.mos


knapsack_graph.mos
(!******************************************************
   Mosel Example Problems
   ======================

   file knapsack.mos
   `````````````````
   TYPE:         Knapsack problem
   DIFFICULTY:   1
   FEATURES:     simple IP problem, formulation of knapsack constraints,
                 model parameters, function 'random'
   DESCRIPTION:  We wish to choose among items of different value and
                 weight those that result in the maximum total value for 
                 a given weight limit.     
   FURTHER INFO: `Mosel User Guide', Section 2.1 `The burglar problem';
                 `Applications of optimization with Xpress-MP', 
                 Section 5.2 `Modeling with Mosel'.
                 Similar problem: Section 9.2 `Barge loading'

   (c) 2008 Fair Isaac Corporation
       Creation: 2003, rev. Sep. 2017
*******************************************************!)

model Knapsack
 uses "mmxprs", "mmsvg"

 parameters
  NUM=8                             ! Number of items
  MAXVAL=100                        ! Maximum value
  MAXWEIGHT=80                      ! Maximum weight
  WTMAX=102                         ! Max weight allowed for haul
 end-parameters

 declarations
  Items=1..NUM                      ! Index range for items
  VALUE: array(Items) of real       ! Value of items
  WEIGHT: array(Items) of real      ! Weight of items

  x: array(Items) of mpvar          ! 1 if we take item i; 0 otherwise
 end-declarations

 setrandseed(7)
 forall(i in Items) do
  VALUE(i):=50+random*MAXVAL
  WEIGHT(i):=1+random*MAXWEIGHT
 end-do

 MaxVal:= sum(i in Items) VALUE(i)*x(i)  ! Objective: maximize total value

                                    ! Weight restriction
 WtMax:= sum(i in Items) WEIGHT(i)*x(i) <= WTMAX 

 forall(i in Items) x(i) is_binary  ! All x are 0/1
  
 maximize(MaxVal)                   ! Solve the MIP-problem

                                    ! Print out the solution
 writeln("Solution:\n Objective: ", getobjval)
 writeln("Item  Weight  Value")
 forall(i in Items)  writeln(i, ": ", getsol(x(i)), strfmt(WEIGHT(i),8,2), strfmt(VALUE(i),8,2))

 ! Draw the solution
 cumw:=0.0; cump:=0.0
 forall(i in Items | getsol(x(i))>0) do
   svgaddgroup("I"+i, "Item "+i)
   svgsetstyle(SVG_STROKE,SVG_NONE)
   svgaddpie(100,100,40,cumw,cumw+WEIGHT(i)/WTMAX)
   cumw+=WEIGHT(i)/WTMAX
   svgaddpie(200,100,40,cump,cump+VALUE(i)/getobjval)
   cump+=VALUE(i)/getobjval
 end-do
 svgaddgroup("msg", "", SVG_BLACK)
 svgsetstyle(SVG_TEXTANCHOR, "middle")
 svgaddtext(100,30, "Weight")
 svgaddtext(200,30, "Profit")

 svgsetgraphviewbox(50,0,250,200)
 svgsave("knapsack.svg")
 svgrefresh
 svgwaitclose("Close browser window to terminate model execution.", 1)
end-model

© 2001-2026 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.