Files
linguist/samples/AMPL/CT2.mod

59 lines
1.9 KiB
Modula-2

param num_beams; # number of beams
param num_rows >= 1, integer; # number of rows
param num_cols >= 1, integer; # number of columns
set BEAMS := 1 .. num_beams; # set of beams
set ROWS := 1 .. num_rows; # set of rows
set COLUMNS := 1 .. num_cols; # set of columns
# values for entries of each beam
param beam_values {BEAMS, ROWS, COLUMNS} >= 0;
# values of tumor
param tumor_values {ROWS, COLUMNS} >= 0;
# values of critical area
param critical_values {ROWS, COLUMNS} >= 0;
# critical maximum dosage requirement
param critical_max;
# tumor minimum dosage requirement
param tumor_min;
# dosage scalar of each beam
var X {i in BEAMS} >= 0;
# define the tumor area which includes the locations where tumor exists
set tumor_area := {k in ROWS, h in COLUMNS: tumor_values[k,h] > 0};
# define critical area
set critical_area := {k in ROWS, h in COLUMNS: critical_values[k,h] > 0};
var S {(k,h) in tumor_area} >= 0;
var T {(k,h) in critical_area} >= 0;
# maximize total dosage in tumor area
maximize total_tumor_dosage: sum {i in BEAMS} sum {(k,h) in tumor_area} X[i] * beam_values[i,k,h];
# minimize total dosage in critical area
minimize total_critical_dosage: sum {i in BEAMS} sum {(k,h) in critical_area} X[i] * beam_values[i,k,h];
# minimize total tumor slack
minimize total_tumor_slack: sum {(k,h) in tumor_area} S[k,h];
# minimize total critical area slack
minimize total_critical_slack: sum {(k,h) in critical_area} T[k,h];
# total dosage at each tumor location [k,h] should be >= min tumor dosage with slack variable
subject to tumor_limit {(k,h) in tumor_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == tumor_min - S[k,h];
# total dosage at each critical location [k,h] should be = max critical dosage with slack variable
subject to critical_limit {(k,h) in critical_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == critical_max + T[k,h];