Sortieren in OPL 6

Moderator: Algorithmische Modellierung

Benutzeravatar
John
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 167
Registriert: 12. Dez 2008 17:41
Wohnort: E-Pool

Sortieren in OPL 6

Beitrag von John » 1. Mär 2015 13:30

Hallo!

In der Vorlesung wird auf Folie 67 eine OPL-Umsetzung eines Sortierproblems beschrieben. Wenn ich das richtig verstanden habe, beziehen sich alle Folien auf OPL Version 3, auf der DVD ist anscheinend OPL Version 6.

Wenn ich den Code von Folie 67 portiere auf OPL 6 sieht das so aus:

Code: Alles auswählen

int number = ...;
range indices = 1..number;
float input[indices] = ...;
dvar float output [indices];
dvar int+ assignment [indices] in indices;

subject to {
       forall ( i in 1..number-1 ) output[i] <= output[i+1];
       forall ( i in indices ) input[i] == output[assignment[i]];
       forall ( i in indices, j in indices )
       i != j => assignment[i] != assignment[j];
}
Soweit so gut. Allerdings beschwert sich der OPL-Compiler mit folgender Fehlermeldung:
Das Indexieren von Array "output" mit Typ dvar int+ wird von diesem Algorithmus nicht unterstützt.
Wenn ich anstattdessen den CP-Optimizer verwende (mittels "using CP;"), kommt anstattdessen folgende Fehlermeldung:
Entscheidungsvariablen des Typs dvar float werden von diesem Algorithmus nicht unterstützt.
Was ich mich wunder: Wenn das so mit OPL 3 ging, müsste es dann nicht auch fast 1:1 so in OPL 6 funktionieren? Hat einer von euch das Sortier-Problem in OPL 6 (OPL Studio 12.6) ausprobiert?

Danke schonmal!
DON'T PANIC

Benutzeravatar
John
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 167
Registriert: 12. Dez 2008 17:41
Wohnort: E-Pool

Re: Sortieren in OPL 6

Beitrag von John » 2. Mär 2015 10:05

Ok, ich habe jetzt zwei umformulierte Varianten, eine mit CP als Optimizer und eine ohne CP:

Einmal ohne Entscheidungsvariablen als Indizes, dafür mit einem duplizierten, umsortierten "output"-Array, und der Bedingung, dass jedes input-Element mind. einmal im output vorkommen muss (ohne CP):

Code: Alles auswählen

int number = ...;
range indices = 1..number;
float input[indices] = ...;
dvar float+ output [indices] in indices;

subject to {
       forall ( i in 1..number-1 ) output[i] <= output[i+1];
       forall ( i in indices )
       		1 <= sum( j in indices ) (input[i] == output[j]);
}
Und einmal mit Entscheidungsvariablen als Indizes (mittels CP):

Code: Alles auswählen

using CP;

int number = ...;
range indices = 1..number;
float input[indices] = ...;
dvar int+ assignment [indices] in indices;

subject to {
       forall ( i in 1..number-1 ) input[assignment[i]] <= input[assignment[i+1]];
       forall ( i in indices, j in indices )
       i != j => assignment[i] != assignment[j];
}
Trotzdem frage ich mich natürlich, wieso das in der ursprünglichen Variante nicht mehr in OPL 6 funktioniert...
DON'T PANIC

Antworten

Zurück zu „Algorithmische Modellierung“