Integer programming
proc optmodel;
num n=544, t1=26842838.69, t2=-9536251.37;
var x{1..n} binary;
num v1{1..n}, v2{1..n};
read data dt into [_N_] v1='第一维度'n v2='第二维度'n;
min k=sum{i in 1..n} x[i];
con a: t1-1.5<=sum{i in 1..n} v1[i]*x[i]<=t1+1.5;
con b: t2-1.5<=sum{i in 1..n} v2[i]*x[i]<=t2+1.5;
solve;
quit;
Continuous
Example 1
Solution: .
proc optmodel;
number D init 1000;
var x{1..D} >=-32 <=32;
min z=sum{ i in 1..D} (x[i]**2-10*cos(2*constant('pi')*x[i])+10);
solve with lso/ maxgen=2000;
create data answer from [i] x z;
quit;
solve with lso
:lso
is based on GA.- DON’T forget parentheses after
sum{}
assum{} x+y
is equal to(sum{} x)+y
which is very different fromsum{}(x+y)
. - In
create data answer from [i] x z;
[i] is used to index x and z.
Example 2
Shifted function:
proc optmodel;
number D init 1000;
number xt{i in 1..D} init i/5;
var x{i in 1..D} init i/10;
min z=sum{ i in 1..D} ((x[i]-xt[i])**2-10*cos(2*constant('pi')*(x[i]-xt[i]))+10);
solve with lso/ maxgen=2000 primalin;
create data answer from [i] x z xt;
quit;
Notes:
primalin
is used to tell that initial value of x is used as an agent.
Example 3
Use result of LSO as starting value of NLP.
proc optmodel;
number D init 1000;
number xt{i in 1..D} init i/5;
var x{i in 1..D} init i/10;
min z=sum{ i in 1..D} ((x[i]-xt[i])**2-10*cos(2*constant('pi')*(x[i]-xt[i]))+10);
solve with lso/ maxgen=2000 primalin;
create data answer from [i] x z xt;
quit;
proc optmodel;
number D init 1000;
number xt{i in 1..D} init i/5;
var x{1..D};
read data answer into [i] x;
min z=sum{ i in 1..D} ((x[i]-xt[i])**2-10*cos(2*constant('pi')*(x[i]-xt[i]))+10);
solve with nlp;
create data anser_nlp from [i] x z;
quit;