-------- Forwarded Message --------
From: Tóth Tamás <[email protected]>
To: [email protected]
Subject: Newbie help request
Date: Tue, 19 Nov 2013 18:07:17 +0100

Hi all,

I'm totally new in linear programming and I have to solve a 
task-to-employee assignment problem.
Almost everything is fine but I cannot make linear the travelling 
section of problem (I mean it should be summarized how much an employee 
should travel with summarizing the distance between tasks following each 
other).

In the objective expression you can see as I try to filter by calculated 
assignment for both tasks (searching for pairs that follows each other) 
but I got "multiplications of linear forms not allowed".

Please someone tell me if it can be linearized at all and if it's 
possible how.

Thanks in advance.

Best regards,
     Tóth Tamás

PS.: Sorry for my poor english.

My program is:

set TASKS := { "44911405.1396", "45917349.728", "45935255.760", 
"45940559.937", "45940616.810", "45850077.1834", "45867819.665", 
"45875315.776", "45890352.675", "45893970.1566", "45867241.631", 
"45903630.1515", "45934020.614", "45889432.867", "45891512.1801", 
"45918734.827", "45921337.721", "45939669.674" };
set EMPLOYEES := { "105170", "105171", "105172", "105173", "109912", 
"109915", "97819" };
set HOURS := 1..24;

param max_travel_cost := 9.9;
param scheduling{TASKS, HOURS}, binary;
param distances{TASKS, TASKS}, >= 0;
param competence{EMPLOYEES, TASKS}, binary;
param cost{EMPLOYEES, TASKS};
param private_limits{EMPLOYEES}, >= 0, <= 24;

var assignments{EMPLOYEES, TASKS}, binary;

minimize total: card(TASKS) - sum{e in EMPLOYEES, t in TASKS} 
assignments[e,t] * 1000000
                 + sum{t in TASKS, e in EMPLOYEES} assignments[e,t] * 
cost[e,t]
                 + sum{e in EMPLOYEES, h in HOURS, t in TASKS: 
scheduling[t,h] = 1}
                     (assignments[e,t] * if h > 1 then (
                         sum{t2 in TASKS: scheduling[t2,h-1] = 1} 
assignments[e,t2] * distances[t,t2]
                     ) else max_travel_cost);

competent{e in EMPLOYEES, t in TASKS}: assignments[e,t] <= competence[e,t];
overlap{e in EMPLOYEES, h in HOURS}: sum{t in TASKS} assignments[e,t] * 
scheduling[t,h] <= 1;
unique{t in TASKS}: sum{e in EMPLOYEES} assignments[e,t] <= 1;
private_limit{e in EMPLOYEES}: sum{h in HOURS, t in TASKS} 
assignments[e,t] * scheduling[t,h] <= private_limits[e];

solve;
for {e in EMPLOYEES, t in TASKS: assignments[e,t] != 0} printf 
"ASSIGNMENTS %s %s\n", t, e;

data;
param scheduling:  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 
22 23 24 :=
   "44911405.1396" 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   "45917349.728" 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   "45935255.760" 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   "45940559.937" 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   "45940616.810" 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   "45850077.1834" 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
   "45867819.665" 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
   "45875315.776" 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
   "45890352.675" 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
   "45893970.1566" 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0
   "45867241.631" 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
   "45903630.1515" 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
   "45934020.614" 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0
   "45889432.867" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
   "45891512.1801" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
   "45918734.827" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
   "45921337.721" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0
   "45939669.674" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0;
param distances:  "44911405.1396" "45917349.728" "45935255.760" 
"45940559.937" "45940616.810" "45850077.1834" "45867819.665" 
"45875315.776" "45890352.675" "45893970.1566" "45867241.631" 
"45903630.1515" "45934020.614" "45889432.867" "45891512.1801" 
"45918734.827" "45921337.721" "45939669.674" :=
   "44911405.1396" 0 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 0.5687 9.9 9.9 
9.9 9.9 9.9 9.9 0.1045
   "45917349.728" 9.9 0 9.9 9.9 9.9 0.1076 0.5568 0.4025 9.9 9.9 9.9 
0.0948 0.0417 9.9 9.9 1.8267 2.8377 9.9
   "45935255.760" 9.9 9.9 0 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 
9.9 9.9 9.9 9.9
   "45940559.937" 9.9 9.9 9.9 0 0.1142 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 
9.9 9.9 9.9 9.9 9.9
   "45940616.810" 9.9 9.9 9.9 0.1142 0 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 
9.9 9.9 9.9 9.9 9.9
   "45850077.1834" 9.9 0.1076 9.9 9.9 9.9 0 0.4898 0.4699 9.9 9.9 9.9 
0.1428 0.0749 9.9 9.9 1.7899 2.7741 9.9
   "45867819.665" 9.9 0.5568 9.9 9.9 9.9 0.4898 0 0.6026 9.9 9.9 9.9 
0.6289 0.5168 9.9 9.9 1.3237 2.2845 9.9
   "45875315.776" 9.9 0.4025 9.9 9.9 9.9 0.4699 0.6026 0 9.9 9.9 9.9 
0.4852 0.4063 9.9 9.9 1.627 2.7272 9.9
   "45890352.675" 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 0 9.9 9.9 9.9 9.9 9.9 
9.9 9.9 9.9 9.9
   "45893970.1566" 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 0 9.9 9.9 9.9 9.9 
9.9 9.9 9.9 9.9
   "45867241.631" 0.5687 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 0 9.9 9.9 
9.9 9.9 9.9 9.9 0.605
   "45903630.1515" 9.9 0.0948 9.9 9.9 9.9 0.1428 0.6289 0.4852 9.9 9.9 
9.9 0 0.1213 9.9 9.9 1.9149 2.9133 9.9
   "45934020.614" 9.9 0.0417 9.9 9.9 9.9 0.0749 0.5168 0.4063 9.9 9.9 
9.9 0.1213 0 9.9 9.9 1.7939 2.7991 9.9
   "45889432.867" 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 0 
9.9 9.9 9.9 9.9
   "45891512.1801" 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 
9.9 0 9.9 9.9 9.9
   "45918734.827" 9.9 1.8267 9.9 9.9 9.9 1.7899 1.3237 1.627 9.9 9.9 9.9 
1.9149 1.7939 9.9 9.9 0 1.1831 9.9
   "45921337.721" 9.9 2.8377 9.9 9.9 9.9 2.7741 2.2845 2.7272 9.9 9.9 
9.9 2.9133 2.7991 9.9 9.9 1.1831 0 9.9
   "45939669.674" 0.1045 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 9.9 0.605 9.9 
9.9 9.9 9.9 9.9 9.9 0;
param cost:  "44911405.1396" "45917349.728" "45935255.760" 
"45940559.937" "45940616.810" "45850077.1834" "45867819.665" 
"45875315.776" "45890352.675" "45893970.1566" "45867241.631" 
"45903630.1515" "45934020.614" "45889432.867" "45891512.1801" 
"45918734.827" "45921337.721" "45939669.674" :=
  "105170" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200
  "105171" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200
  "105172" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200
  "105173" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200
  "109912" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200
  "109915" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200
  "97819" 200 200 200 200 200 200 200 200 200 200 200 200 200 200 200 
200 200 200;
param competence:  "44911405.1396" "45917349.728" "45935255.760" 
"45940559.937" "45940616.810" "45850077.1834" "45867819.665" 
"45875315.776" "45890352.675" "45893970.1566" "45867241.631" 
"45903630.1515" "45934020.614" "45889432.867" "45891512.1801" 
"45918734.827" "45921337.721" "45939669.674" :=
  "105170" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  "105171" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  "105172" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  "105173" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  "109912" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  "109915" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  "97819" 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1;
param private_limits:=  ["105170"] 24 ["105171"] 24 ["105172"] 24 
["105173"] 24 ["109912"] 24 ["109915"] 24 ["97819"] 24;
end;




_______________________________________________
Help-glpk mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-glpk

Reply via email to