chiark / gitweb /
prepare cplex input file for glpsol
authorIan Jackson <ian@liberator.(none)>
Sat, 22 Aug 2009 15:27:24 +0000 (16:27 +0100)
committerIan Jackson <ian@liberator.(none)>
Sat, 22 Aug 2009 15:27:24 +0000 (16:27 +0100)
yarrg/web/routetrade

index de9e73c..1924503 100644 (file)
@@ -118,17 +118,64 @@ my @flows;
 </pre>
 % }
 
+% {
 <& dumpqueryresults:start, sth => $sth &>
-% my $flow;
-% while ($flow= $sth->fetchrow_hashref()) {
+%   my $flow;
+%   while ($flow= $sth->fetchrow_hashref()) {
+%      $flow->{Ix}= @flows;
+%      $flow->{Var}= "f$flow->{Ix}";
 %      push @flows, $flow;
 <& dumpqueryresults:row, sth => $sth, row => $flow &>
-% }
+%   }
 <& dumpqueryresults:end &>
+% }
 
 <%perl>
 
+my $cplex= "
+Maximize
+
+  totalprofit:
+                  ".(join " +
+                  ", map { "$_->{profit} $_->{Var}" } @flows)."
+
+Subject To
+";
+
+my %avail_csts;
+foreach my $flow (@flows) {
+       foreach my $od (qw(org dst)) {
+               my $cstname= join '_',
+                       'avail',
+                       $flow->{'commodid'},
+                       $od,
+                       $flow->{"${od}_id"},
+                       $flow->{"${od}_price"};
+               push @{ $avail_csts{$cstname}{Flows} }, $flow->{Var};
+               $avail_csts{$cstname}{Qty}= $flow->{"${od}_qty"};
+       }
+}
+foreach my $cstname (sort keys %avail_csts) {
+       my $c= $avail_csts{$cstname};
+       $cplex .= "
+   ".  sprintf("%-30s","$cstname:")." ".
+       join("+", @{ $c->{Flows} }).
+       " <= ".$c->{Qty}."\n";
+}
+
+$cplex.= "
+Bounds
+        ".(join "
+        ", map { "$_->{Var} >= 0" } @flows)."
+
+End
+";
+# glpsol --cpxlp /dev/stdin <t.cplex -o /dev/stdout
+
 </%perl>
+<pre>
+<% $cplex |h %>
+</pre>
 
 <%init>
 use CommodsWeb;