代写留学生数学作业-学习模块的数学规划方法-XPRESSIVE TUTORIAL – DIRECTED LEARNING

发布时间:2011-08-03 11:45:08 论文编辑:第一代写网

代写留学生数学作业XPRESSIVE TUTORIAL – DIRECTED LEARNING

Part A  is for anyone with no prior experience of using the optimisation software Xpressive.

Part B is for more advanced users and is essential prior learning for the module Mathematical Programming Techniques.

You can download this software free from the specialist drive (common area   S:/). Any queries, assistance advice with respect to thios should be directed towards the specialist BCL Technicians in B201.

To make efficient use of Xpressive variables are indexed and loops are constructed to enable the modelling of large problems (many variables).
For example:
 X(1), X(2),.... etc

X(1,1), X(1,2).... etc

This handout will now take you through a number of examples of typical models representing problems in constrained linear optimisation.

 
PART A
The following example is modelled in XPRESS in several ways to demonstrate the alternatives ways in which a problem can be input into the package.

 
Example 1
This is based around CP example 1 the addition here being “indexed” variables, the relevant new section is shown in bold.

model ex1
uses "mmxprs"

  ! The next instructions create a set of indexed variables

declarations
x: dynamic array(1..2) of mpvar

! this declares variables x(1) and x(2)

end-declarations

! now create the indexed variables

forall(i in 1..2) create(x(i))

con1:=x(1)+2*x(2)<=20
con2:=3*x(1)+x(2)<=30
profit:=10*x(1)+12*x(2)

maximise(profit)

writeln("profit =",getobjval)
writeln("x1=",getsol(x(1)))
writeln("x2=",getsol(x(2)))


end-model

 

 

 


Example 2
Here coefficient tables/matrices are used to set up coefficients profits and right hand side values.

model ex2
uses "mmxprs"

declarations

! The following sets up arrays for the problem data.
x: dynamic array(1..2) of mpvar

! set up coefficient and right hand side matrices
T:array(1..2,1..2) of integer
P:array(1..2) of integer
end-declarations

forall(i in 1..2) create(x(i))

!set up coefficient and right hand side values
T::[1,2,3,1]
P::[50,12]

! Indexed variables now used to specify the model
con1:=T(1,1)*x(1)+T(1,2)*x(2)<=20
con2:=T(2,1)*x(1)+T(2,2)*x(2)<=30
profit:=P(1)*x(1)+P(2)*x(2)

maximise(profit)

writeln("profit =",getobjval)
writeln("x1=",getsol(x(1)))
writeln("x2=",getsol(x(2)))


end-model

 
Example 3
A new way to construct a constraint, not very interesting or helpful!

model ex3
uses "mmxprs"

declarations
x: dynamic array(1..2) of mpvar
T:array(1..2,1..2) of integer
P:array(1..2) of integer
B:array(1..2) of integer
end-declarations

forall(i in 1..2) create(x(i))

T::[1,2,3,1]
P::[50,12]
B::[20,30]

! The equation can be constructed in stages first set up string c
c:= sum(j in 1..2) T(1,j)*x(j)

con1:= c <=B(1)
con2:=T(2,1)*x(1)+T(2,2)*x(2)<=B(2)
profit:=P(1)*x(1)+P(2)*x(2)

maximise(profit)

writeln("profit =",getobjval)

forall(i in 1..2) do
writeln("x”, i ,”=",getsol(x(i)))
end-do

end-model

 
PART B
In larger problems it is always better to use commands to construct the model (equations and profit functions).

Example 4
Using “loops” to construct constraints and cost functions to set up and solve the problem used in example 1.

Model ex4
uses "mmxprs"

declarations
x: dynamic array(1..2) of mpvar
T:array(1..2,1..2) of integer
P:array(1..2) of integer
B:array(1..2) of integer
end-declarations

forall(i in 1..2) create(x(i))

T::[1,2,3,1]
P::[50,12]
B::[20,30]

! Here sum statements are used to set up the constraints
con1:= sum(j in 1..2) T(1,j)*x(j) <=B(1)
con2:=sum(j in 1..2) T(2,j)*x(j)<=B(2)

! Again a sum statement is used to construct the profit expression
profit:=sum(j in 1..2)P(j)*x(j)

maximise(profit)

writeln("profit =",getobjval)
writeln("x1=",getsol(x(1)))
writeln("x2=",getsol(x(2)))


end-model

note: if a problem contained 25 variables the “construct” part of the program would become:

! Here sum statements are used to set up the constraints
con1:= sum(j in 1..25) T(1,j)*x(j) <=B(1)
con2:=sum(j in 1..25) T(2,j)*x(j)<=B(2)

! Again a sum statement is used to construct the profit expression
profit:=sum(j in 1..25)P(j)*x(j)

 
when there are many constraints and many variables the “construction” of the model can be achieved using a double loop:
• loop 1 number of equations
• loop2 number of constraints

Example 5
Using the same problem, to illustrate this approach.

model ex5
uses "mmxprs"
declarations
x: dynamic array(1..2) of mpvar
T:array(1..3,1..2) of integer
P:array(1..2) of integer
B:array(1..3) of integer
end-declarations

forall(i in 1..2) create(x(i))
T::[1,2,3,1,1,1]
P::[10,12]
B::[20,30,13]

! Here sum statements are used to set up all the constraints in one statement
forall(i in 1..3) do
con(i):= sum(j in 1..2) T(i,j)*x(j) <=B(i)
end-do

! Again a sum statement is used to construct the profit expression
profit:=sum(j in 1..2)P(j)*x(j)

maximise(profit)

writeln("profit =",getobjval)
writeln("x1=",getsol(x(1)))
writeln("x2=",getsol(x(2)))


end-model


Note for a problem with 32 constraints and 26 variables the “construction” part of the program would become:

forall(i in 1..32) do
con(i):= sum(j in 1..26) T(i,j)*x(j) <=B(i)
end-do

 


 
Example 6  Transportation Problem

The Transportation problem:-

  A B Supply

 X 10
X(1) 12
X(2) 
=20
 Y 8
X(3) 14
X(4) 
=30
Demand  
=23 
=27 

Using the previous notation, P for costs B for capacities and T for coefficients here

P = [10 12 8 14]

B = [20 30 23 27]

T =  [1  1  0  0;
 0 0 1 1;
 1 0 1 0;
 0 1 0 1]

Can be solved in the following model where the “equations” are constructed using the blue coding.

model ex6
uses "mmxprs"
declarations
x: dynamic array(1..4) of mpvar

P:array(1..4) of integer
B:array(1..4) of integer
end-declarations

P::[10,12,8,14]
B::[20,30,23,27]

forall(i in 1..4) create(x(i))

! constructing the row and column constraint  but  in two stages
! ROWS
forall(i in 1..2) do
c(i):=sum(j in 1..2) x((i-1)*2+j)=B(i)
end-do
! COLUMNS
forall(i in 1..2) do
cc(i):=sum(j in 1..2) x((j-1)*2+i)=B(i+2)
end-do

maximise(profit)

writeln("profit =",getobjval)

forall(i in 1..4) do
writeln("x",i,"=",getsol(x(i)))
end-do

end-model

 

Note: if there were 7 rows and 9 columns these would become

! constructing the row and column constraint  but  in two stages
! ROWS
forall(i in 1..7) do
c(i):=sum(j in 1..9) x((i-1)*9+j)=B(i)
end-do
! COLUMNS
forall(i in 1..9) do
cc(i):=sum(j in 1..7) x((j-1)*9+i)=B(i+7)
end-do

Alternatively
model ex6_a
uses "mmxprs"
declarations
x: dynamic array(1..2,1..2) of mpvar

P:array(1..4) of integer
R:array(1..2) of integer
C:array[1..2]
end-declarations
P::[10,12,8,14]
R::[20,30]
C::[23,27]
forall(i in 1..2,1..2) create(x(i,j))

! constructing the row and column constraint  but  in two stages
! ROWS
forall(i in 1..2) do
c(i):=sum(j in 1..2) x(i,j)=R(i)
end-do
! COLUMNS
forall(j in 1..2) do
cc(i):=sum(i in 1..2) x(i,j)=C(j)
end-do
 
Introduction to Integer Variables (example 7)


This model produces both the LP and IP solution for a n variable problem. The LP stage is as before the IP section is added at the end (in red)

model ex7
uses "mmxprs"

declarations
x: dynamic array(1..2) of mpvar 
end-declarations

forall(i in 1..2) create(x(i))

first:= 3*x(1) + 2*x(2) <= 19
second:= x(1) + 3*x(2) <= 14
profit:= x(1) + 2*x(2)

maximise(profit)

writeln("profit =",getobjval)
writeln("x1=",getsol(x(1)))
writeln("x2=",getsol(x(2)))

! solution x(1)=4.14286,  x(2)= 3.28571,  profit = 10.7143

! now the Integer solution, first declare the variables as being Integers.
!notice that this cannot be within the declarations, seems strange.

forall(i in 1..2)
x(i) is_integer

maximise(profit)

writeln("profit =",getobjval)
writeln("x1I=",getsol(x(1)))
writeln("x2I=",getsol(x(2)))

! solution x(1)=4,   x(2)= 3,  profit = 10

end-model
 
model ex7_a
uses "mmxprs"

declarations
x: dynamic array(1..2) of mpvar 
end-declarations

forall(i in 1..2) create(x(i))

first:= 3*x(1) + 2*x(2) <= 19
second:= x(1) + 3*x(2) <= 14
profit:= x(1) + 2*x(2)

!LP solution

maximise(profit)

writeln("profit =",getobjval)
writeln("x1=",getsol(x(1)))
writeln("x2=",getsol(x(2)))

!IP solution

forall(i in 1..2)
x(i) is_integer

maximise(profit)

writeln("profit =",getobjval)
writeln("x1I=",getsol(x(1)))
writeln("x2I=",getsol(x(2)))

!BV solution

forall(i in 1..2)
x(i) is_integer

forall(i in 1..2)
c(i):= x(i)<=1

maximise(profit)

代写留学生数学作业writeln("profit =",getobjval)
writeln("x1BV=",getsol(x(1)))
writeln("x2BV=",getsol(x(2)))

end-model