Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
Conversion
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Vladislav Kiselev
Conversion
Commits
10add7b3
Commit
10add7b3
authored
Dec 03, 2018
by
Vladislav Kiselev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Обновлён формат тестов, исправлено пару багов.
parent
62bd0d72
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
103 additions
and
237 deletions
+103
-237
src/inport/CargoFlow.java
src/inport/CargoFlow.java
+7
-10
src/inport/ConversionUtil.java
src/inport/ConversionUtil.java
+2
-2
src/inport/LoadingTemplate.java
src/inport/LoadingTemplate.java
+18
-1
src/inport/TaskCase.java
src/inport/TaskCase.java
+74
-222
tests/cargo_handling_and_moving.ipp
tests/cargo_handling_and_moving.ipp
+1
-1
tests/simple_cargo_flow.ipp
tests/simple_cargo_flow.ipp
+1
-1
No files found.
src/inport/CargoFlow.java
View file @
10add7b3
...
@@ -4,10 +4,7 @@
...
@@ -4,10 +4,7 @@
*/
*/
package
inport
;
package
inport
;
import
java.util.HashMap
;
import
java.util.*
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.TreeMap
;
/**
/**
*
*
...
@@ -17,14 +14,14 @@ public class CargoFlow {
...
@@ -17,14 +14,14 @@ public class CargoFlow {
private
Storage
storage
;
private
Storage
storage
;
private
Cargo
cargo
;
private
Cargo
cargo
;
Map
<
Double
,
Double
>
flow
;
Sorted
Map
<
Double
,
Double
>
flow
;
public
Map
<
Double
,
Double
>
getFlow
()
{
public
Map
<
Double
,
Double
>
getFlow
()
{
return
flow
;
return
flow
;
}
}
public
void
setFlow
(
Map
<
Double
,
Double
>
flow
)
{
public
void
setFlow
(
Map
<
Double
,
Double
>
flow
)
{
this
.
flow
=
flow
;
this
.
flow
=
new
TreeMap
<>(
flow
)
;
}
}
/**
/**
...
@@ -54,7 +51,7 @@ public class CargoFlow {
...
@@ -54,7 +51,7 @@ public class CargoFlow {
}
}
public
CargoFlow
()
{
public
CargoFlow
()
{
this
.
flow
=
new
Hash
Map
<>();
this
.
flow
=
new
Tree
Map
<>();
}
}
public
CargoFlow
(
Storage
storage
,
Cargo
cargo
)
{
public
CargoFlow
(
Storage
storage
,
Cargo
cargo
)
{
...
@@ -71,7 +68,7 @@ public class CargoFlow {
...
@@ -71,7 +68,7 @@ public class CargoFlow {
double
prevKey
=
-
1.0
;
double
prevKey
=
-
1.0
;
for
(
Double
keyTime
:
keyTimes
)
for
(
Double
keyTime
:
keyTimes
)
{
{
if
(
forTime
>=
prevKey
&&
forTime
<
keyTime
)
if
(
forTime
>=
prevKey
&&
forTime
<
keyTime
)
{
{
res
=
flow
.
get
(
prevKey
);
res
=
flow
.
get
(
prevKey
);
isFound
=
true
;
isFound
=
true
;
...
@@ -92,7 +89,7 @@ public class CargoFlow {
...
@@ -92,7 +89,7 @@ public class CargoFlow {
double
prevKey
=
-
1.0
;
double
prevKey
=
-
1.0
;
for
(
Double
keyTime
:
keyTimes
)
for
(
Double
keyTime
:
keyTimes
)
{
{
if
(
forTime
>
prevKey
&&
forTime
<
keyTime
)
if
(
forTime
>=
prevKey
&&
forTime
<
keyTime
)
{
{
res
+=
flow
.
get
(
prevKey
)*(
forTime
-
prevKey
);
res
+=
flow
.
get
(
prevKey
)*(
forTime
-
prevKey
);
isFound
=
true
;
isFound
=
true
;
...
@@ -103,7 +100,7 @@ public class CargoFlow {
...
@@ -103,7 +100,7 @@ public class CargoFlow {
prevKey
=
keyTime
;
prevKey
=
keyTime
;
}
}
}
}
if
(!
isFound
&&
forTime
>
prevKey
)
if
(!
isFound
&&
forTime
>=
prevKey
)
res
+=
flow
.
get
(
prevKey
)*(
forTime
-
prevKey
);
res
+=
flow
.
get
(
prevKey
)*(
forTime
-
prevKey
);
return
res
;
return
res
;
}
}
...
...
src/inport/ConversionUtil.java
View file @
10add7b3
...
@@ -478,7 +478,7 @@ public class ConversionUtil {
...
@@ -478,7 +478,7 @@ public class ConversionUtil {
// TODO ресурсы у операции погрузки.
// TODO ресурсы у операции погрузки.
operationsResources
.
set
(
i
,
s
);
operationsResources
.
set
(
i
,
s
);
operationsStartLoc
.
set
(
i
,
getLocNById
.
apply
(
op
.
getStartLocation
().
getId
(),
true
)
+
1
);
operationsStartLoc
.
set
(
i
,
getLocNById
.
apply
(
op
.
getStartLocation
().
getId
(),
op
.
getWithMooring
()
)
+
1
);
}
}
// TODO швартовка, погрузка.
// TODO швартовка, погрузка.
}
}
...
@@ -616,7 +616,7 @@ public class ConversionUtil {
...
@@ -616,7 +616,7 @@ public class ConversionUtil {
LoadingTemplate
op
=
(
LoadingTemplate
)
operationTemplates
.
get
(
i
);
LoadingTemplate
op
=
(
LoadingTemplate
)
operationTemplates
.
get
(
i
);
int
storageN
=
storNById
.
get
(
op
.
getStorage
().
getId
());
int
storageN
=
storNById
.
get
(
op
.
getStorage
().
getId
());
int
shipN
=
mObjToN
.
apply
(
op
.
getLoader
());
int
shipN
=
mObjToN
.
apply
(
op
.
getLoader
());
int
cargoN
=
cargoNById
.
get
(
op
.
get
Storage
().
getCargo
().
getId
());
// TODO в TaskCase пока не реализовано, пересмотреть.
int
cargoN
=
cargoNById
.
get
(
op
.
get
Cargo
().
getId
());
loadingOpDelta
.
add
(-(
int
)
op
.
getIntensity
());
loadingOpDelta
.
add
(-(
int
)
op
.
getIntensity
());
loadingOpN
.
add
(
i
);
loadingOpN
.
add
(
i
);
...
...
src/inport/LoadingTemplate.java
View file @
10add7b3
...
@@ -17,7 +17,8 @@ public class LoadingTemplate extends OperationTemplate {
...
@@ -17,7 +17,8 @@ public class LoadingTemplate extends OperationTemplate {
private
Storage
storage
;
private
Storage
storage
;
private
List
<
LoadingEquipment
>
resources
;
private
List
<
LoadingEquipment
>
resources
;
private
double
intensity
;
private
double
intensity
;
private
boolean
withMooring
;
private
Cargo
cargo
;
/**
/**
* Get the value of resources
* Get the value of resources
...
@@ -61,6 +62,22 @@ public class LoadingTemplate extends OperationTemplate {
...
@@ -61,6 +62,22 @@ public class LoadingTemplate extends OperationTemplate {
this
.
storage
=
storage
;
this
.
storage
=
storage
;
}
}
public
void
setWithMooring
(
boolean
withMooring
)
{
this
.
withMooring
=
withMooring
;
}
public
boolean
getWithMooring
()
{
return
withMooring
;
}
public
void
setCargo
(
Cargo
cargo
)
{
this
.
cargo
=
cargo
;
}
public
Cargo
getCargo
()
{
return
cargo
;
}
public
LoadingTemplate
(
TransportShip
loader
,
Berth
berth
,
Storage
storage
,
double
intensity
,
int
id
)
{
public
LoadingTemplate
(
TransportShip
loader
,
Berth
berth
,
Storage
storage
,
double
intensity
,
int
id
)
{
super
(
id
,
berth
);
super
(
id
,
berth
);
this
.
loader
=
loader
;
this
.
loader
=
loader
;
...
...
src/inport/TaskCase.java
View file @
10add7b3
...
@@ -4,8 +4,6 @@
...
@@ -4,8 +4,6 @@
*/
*/
package
inport
;
package
inport
;
import
javafx.util.Pair
;
import
java.io.BufferedReader
;
import
java.io.BufferedReader
;
import
java.io.FileInputStream
;
import
java.io.FileInputStream
;
import
java.io.FileNotFoundException
;
import
java.io.FileNotFoundException
;
...
@@ -13,7 +11,11 @@ import java.io.FileReader;
...
@@ -13,7 +11,11 @@ import java.io.FileReader;
import
java.io.FileWriter
;
import
java.io.FileWriter
;
import
java.io.IOException
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.io.InputStreamReader
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.logging.Level
;
import
java.util.logging.Level
;
import
java.util.logging.Logger
;
import
java.util.logging.Logger
;
...
@@ -500,7 +502,13 @@ public class TaskCase {
...
@@ -500,7 +502,13 @@ public class TaskCase {
mt
.
setStorage
((
Storage
)
m_storage
.
get
(
key
));
mt
.
setStorage
((
Storage
)
m_storage
.
get
(
key
));
direct
=
1
;
direct
=
1
;
}
}
// Груз. Пока не нужен
// Груз.
key
=
Integer
.
parseInt
(
tokens
[
4
].
trim
());;
for
(
Cargo
cargo
:
cargoes
)
{
if
(
cargo
.
getId
()
==
key
)
{
mt
.
setCargo
(
cargo
);
}
}
// Приемник. Пока пара - это только хранилище-судно. С бункеровкой будем разбираться потом
// Приемник. Пока пара - это только хранилище-судно. С бункеровкой будем разбираться потом
key
=
Integer
.
parseInt
(
tokens
[
5
].
trim
());
key
=
Integer
.
parseInt
(
tokens
[
5
].
trim
());
if
(
m_vessel
.
containsKey
(
key
))
if
(
m_vessel
.
containsKey
(
key
))
...
@@ -522,9 +530,11 @@ public class TaskCase {
...
@@ -522,9 +530,11 @@ public class TaskCase {
key
=
Integer
.
parseInt
(
crs
.
trim
());
key
=
Integer
.
parseInt
(
crs
.
trim
());
mt
.
getResources
().
add
(
m_equiopment
.
get
(
key
));
mt
.
getResources
().
add
(
m_equiopment
.
get
(
key
));
}
}
mt
.
setIntensity
(
direct
*
Double
.
parseDouble
(
tokens
[
8
].
trim
()));
mt
.
setIntensity
(
direct
*
Double
.
parseDouble
(
tokens
[
8
].
trim
()));
templates
.
add
(
mt
);
mt
.
setWithMooring
(
tokens
[
9
].
trim
().
equals
(
"M"
));
m_template
.
put
(
mt
.
getId
(),
mt
);
templates
.
add
(
mt
);
m_template
.
put
(
mt
.
getId
(),
mt
);
}
}
break
;
break
;
case
9
:
case
9
:
...
@@ -651,7 +661,7 @@ public class TaskCase {
...
@@ -651,7 +661,7 @@ public class TaskCase {
// Это начало блока
// Это начало блока
operation
=
new
Operation
();
operation
=
new
Operation
();
operation
.
setTemplate
(
template
);
operation
.
setTemplate
(
template
);
operation
.
setStart
(
i
+
1
);
operation
.
setStart
(
i
);
inBlock
=
true
;
inBlock
=
true
;
}
}
}
else
}
else
...
@@ -1484,24 +1494,18 @@ public class TaskCase {
...
@@ -1484,24 +1494,18 @@ public class TaskCase {
// Состояние загрузки судов
// Состояние загрузки судов
writer
.
write
(
"* Ship Loading States \n"
);
writer
.
write
(
"* Ship Loading States \n"
);
// Тут пок
огш
раничение только на местонахождение транспортных судов
// Тут пок
а ог
раничение только на местонахождение транспортных судов
for
(
TransportShip
s
:
ships
)
for
(
TransportShip
s
:
ships
)
{
{
StorageState
state1
=
null
;
List
<
StorageState
>
state1List
=
new
ArrayList
<
StorageState
>()
;
StorageState
state2
=
null
;
List
<
StorageState
>
state2List
=
new
ArrayList
<
StorageState
>()
;
MovingObjectState
eState
=
null
;
MovingObjectState
eState
=
null
;
for
(
StorageState
state
:
storageInitialState
)
for
(
StorageState
state
:
storageInitialState
)
if
(
state
.
getStorage
().
equals
(
s
))
if
(
state
.
getStorage
().
equals
(
s
))
{
state1List
.
add
((
StorageState
)
state
);
state1
=
(
StorageState
)
state
;
break
;
}
for
(
StorageState
state
:
storageEndState
)
for
(
StorageState
state
:
storageEndState
)
if
(
state
.
getStorage
().
equals
(
s
))
if
(
state
.
getStorage
().
equals
(
s
))
{
state2List
.
add
((
StorageState
)
state
);
state2
=
(
StorageState
)
state
;
break
;
}
for
(
MovingObjectState
state
:
vesselEndState
)
for
(
MovingObjectState
state
:
vesselEndState
)
if
(
state
.
getVessel
().
equals
(
s
))
if
(
state
.
getVessel
().
equals
(
s
))
{
{
...
@@ -1512,12 +1516,25 @@ public class TaskCase {
...
@@ -1512,12 +1516,25 @@ public class TaskCase {
{
{
int
start
=
0
;
int
start
=
0
;
int
finish
=
0
;
int
finish
=
0
;
if
(
state1
!=
null
&&
state1
.
getCargo
().
equals
(
c
))
for
(
StorageState
state1
:
state1List
)
start
=
(
int
)
state1
.
getCargoState
();
{
if
(
state2
!=
null
&&
state2
.
getCargo
().
equals
(
c
))
if
(
state1
!=
null
&&
state1
.
getCargo
().
equals
(
c
))
finish
=
(
int
)
state2
.
getCargoState
();
{
start
=
(
int
)
state1
.
getCargoState
();
break
;
}
}
for
(
StorageState
state2
:
state2List
)
{
if
(
state2
!=
null
&&
state2
.
getCargo
().
equals
(
c
))
{
finish
=
(
int
)
state2
.
getCargoState
();
break
;
}
}
List
<
Integer
>
vc
=
new
ArrayList
<
Integer
>();
List
<
Integer
>
vc
=
new
ArrayList
<
Integer
>();
List
<
Integer
>
intens
=
new
ArrayList
<
Integer
>();
List
<
Integer
>
intens
=
new
ArrayList
<
Integer
>();
int
epsilon
=
0
;
// Точность оценки остатка в судовом хранилище
for
(
OperationTemplate
tp
:
templates
)
for
(
OperationTemplate
tp
:
templates
)
if
(
tp
instanceof
LoadingTemplate
)
if
(
tp
instanceof
LoadingTemplate
)
{
{
...
@@ -1526,9 +1543,15 @@ public class TaskCase {
...
@@ -1526,9 +1543,15 @@ public class TaskCase {
if
(
ltp
.
getLoader
().
equals
(
s
)
&&
ltp
.
getStorage
().
getCargo
().
equals
(
c
))
if
(
ltp
.
getLoader
().
equals
(
s
)
&&
ltp
.
getStorage
().
getCargo
().
equals
(
c
))
{
{
vc
.
add
(
i
);
vc
.
add
(
i
);
intens
.
add
((
int
)
ltp
.
getIntensity
());
int
itsv
=
(
int
)
ltp
.
getIntensity
();
intens
.
add
(
itsv
);
// Пока забъем....
//if (Math.abs(itsv)>epsilon)
// epsilon = Math.abs(itsv);
}
}
}
}
if
(
epsilon
>
1
)
epsilon
--;
for
(
int
j
=
0
;
j
<
nTimes
;
j
++)
for
(
int
j
=
0
;
j
<
nTimes
;
j
++)
{
{
String
clause
=
""
;
String
clause
=
""
;
...
@@ -1555,21 +1578,25 @@ public class TaskCase {
...
@@ -1555,21 +1578,25 @@ public class TaskCase {
// Положительность груза на судне в каждый момент времени
// Положительность груза на судне в каждый момент времени
if
(
summinus
<-
start
)
if
(
summinus
<-
start
)
{
{
writer
.
write
(
clause
+
" >= -"
+
start
+
" ;\n"
);
writer
.
write
(
clause
+
" >= -"
+
(
start
+
epsilon
)
+
" ;\n"
);
nCons
++;
nCons
++;
}
}
// Ограничение на грузоподъемность судна
// Ограничение на грузоподъемность судна
int
maxLoad
=
(
int
)(
s
.
getCargoMax
()+
1.0
);
int
maxLoad
=
(
int
)(
s
.
getCargoMax
()+
1.0
);
if
(
sumplus
>
(
maxLoad
-
start
))
if
(
sumplus
>
(
maxLoad
-
start
))
{
{
writer
.
write
(
clause
+
" <= "
+
(
maxLoad
-
start
)
+
" ;\n"
);
writer
.
write
(
clause
+
" <= "
+
(
maxLoad
-
start
+
epsilon
)
+
" ;\n"
);
nCons
++;
nCons
++;
}
}
}
}
else
else
{
{
// Конечное состояние судна
// Конечное состояние судна
writer
.
write
(
clause
+
" = "
+
(
finish
-
start
)
+
" ;\n"
);
// writer.write(clause + " = " + (finish - start) + " ;\n");
// nCons++;
writer
.
write
(
clause
+
" >= "
+
(
finish
-
start
-
epsilon
)
+
" ;\n"
);
nCons
++;
writer
.
write
(
clause
+
" <= "
+
(
finish
-
start
+
epsilon
)
+
" ;\n"
);
nCons
++;
nCons
++;
}
}
}
}
...
@@ -1600,28 +1627,31 @@ public class TaskCase {
...
@@ -1600,28 +1627,31 @@ public class TaskCase {
}
}
// Невозможность одновременного нахождения двух пришвартованных судов у одного причала
// Невозможность одновременного нахождения двух пришвартованных судов у одного причала
writer
.
write
(
"* No more than 1 vessel moored to berth \n"
);
writer
.
write
(
"* No more than 1 vessel moored to berth \n"
);
if
(
isMooring
)
if
(
ships
.
size
()>
1
)
{
{
for
(
Berth
b
:
berths
)
if
(
isMooring
)
{
{
if
(
b
.
getIsRaid
())
for
(
Berth
b
:
berths
)
continue
;
int
bdx
=
berths
.
indexOf
(
b
);
for
(
int
j
=
1
;
j
<
nTimes
;
j
++)
{
{
String
clause
=
""
;
if
(
b
.
getIsRaid
())
for
(
TransportShip
v
:
ships
)
continue
;
int
bdx
=
berths
.
indexOf
(
b
);
for
(
int
j
=
1
;
j
<
nTimes
;
j
++)
{
{
int
rdx
=
vss
.
indexOf
(
v
);
String
clause
=
""
;
clause
+=
" +1 "
+
wrbj
(
rdx
,
bdx
,
j
,
nBerths
,
nTimes
,
nVars
,
isMooring
,
true
,
true
);
for
(
TransportShip
v
:
ships
)
{
int
rdx
=
vss
.
indexOf
(
v
);
clause
+=
" +1 "
+
wrbj
(
rdx
,
bdx
,
j
,
nBerths
,
nTimes
,
nVars
,
isMooring
,
true
,
true
);
}
writer
.
write
(
clause
+
" <= 1 ;\n"
);
nCons
++;
}
}
writer
.
write
(
clause
+
" <= 1 ;\n"
);
nCons
++;
}
}
}
}
}
}
writer
.
flush
();
writer
.
flush
();
writer
.
close
();
writer
.
close
();
...
@@ -1638,183 +1668,5 @@ public class TaskCase {
...
@@ -1638,183 +1668,5 @@ public class TaskCase {
writer
.
close
();
writer
.
close
();
return
nOperations
;
return
nOperations
;
}
}
private
static
List
<
String
>
makeList
(
String
...
strings
)
{
return
Arrays
.
asList
(
strings
);
}
private
static
ArrayList
<
Set
<
Integer
>>
initArray
(
int
size
)
{
ArrayList
<
Set
<
Integer
>>
res
=
new
ArrayList
<>(
size
);
for
(
int
i
=
0
;
i
<
size
;
i
++)
{
res
.
add
(
new
TreeSet
<>());
}
return
res
;
}
public
void
simpleMiniZincConversion
(
String
fileName
)
throws
IOException
,
ConversionException
{
try
(
FileWriter
writer
=
new
FileWriter
(
fileName
,
false
))
{
writer
.
write
(
"include \"globals.mzn\";\n"
);
int
n_intervals
=
(
int
)
getPlanningInterval
();
writer
.
write
(
"int: n_intervals = "
+
n_intervals
+
";\n"
);
ArrayList
<
TransportShip
>
ships
=
new
ArrayList
<>(
getShips
());
Map
<
Integer
,
Integer
>
shipNumberById
=
new
TreeMap
<>();
for
(
int
i
=
0
;
i
<
ships
.
size
();
i
++)
{
shipNumberById
.
put
(
ships
.
get
(
i
).
getId
(),
i
);
}
writer
.
write
(
"int: n_transports = "
+
ships
.
size
()
+
";\n"
);
ArrayList
<
Berth
>
berths
=
new
ArrayList
<>(
getBerths
());
Map
<
Integer
,
Integer
>
berthNumberById
=
new
TreeMap
<>();
for
(
int
i
=
0
;
i
<
berths
.
size
();
i
++)
{
berthNumberById
.
put
(
berths
.
get
(
i
).
getId
(),
i
);
}
writer
.
write
(
"int: n_berths = "
+
berths
.
size
()
+
";\n"
);
ArrayList
<
Tow
>
tows
=
new
ArrayList
<>(
getTows
());
Map
<
Integer
,
Integer
>
towNumberById
=
new
TreeMap
<>();
for
(
int
i
=
0
;
i
<
tows
.
size
();
i
++)
{
towNumberById
.
put
(
tows
.
get
(
i
).
getId
(),
i
);
}
writer
.
write
(
"int: n_tows = "
+
tows
.
size
()
+
";\n"
);
writer
.
write
(
"\n"
);
writer
.
write
(
"set of int: Operations_identifiers = {-2, -1"
);
for
(
OperationTemplate
operation
:
getTemplates
())
{
writer
.
write
(
", "
+
operation
.
getId
());
}
writer
.
write
(
"};\n"
);
writer
.
write
(
"enum Berth_status = {free, moored, berthing, de_berthing};\n"
);
writer
.
write
(
"array [1..n_berths, 0..n_intervals] of var 0..n_transports : transport_in_berthing;\n"
);
writer
.
write
(
"array [1..n_berths, 0..n_intervals] of var Berth_status : berths_status;\n"
);
// -2 - занят, -1 - свободен, i - начало i-той операции.
writer
.
write
(
"array [1..n_berths, 0..n_intervals] of var Operations_identifiers : berths_operations;\n\n"
);
writer
.
write
(
"enum Moving_obj_status = {in_the_way, in_place};\n"
);
writer
.
write
(
"array [1..n_transports, 0..n_intervals] of var 1..n_berths : transports_destination;\n"
);
writer
.
write
(
"array [1..n_transports, 0..n_intervals] of var Moving_obj_status : transports_status;\n"
);
writer
.
write
(
"array [1..n_transports, 0..n_intervals] of var Operations_identifiers : transports_operations;\n\n"
);
writer
.
write
(
"array [1..n_tows, 0..n_intervals] of var 1..n_berths : tows_destination;\n"
);
writer
.
write
(
"array [1..n_tows, 0..n_intervals] of var Moving_obj_status : tows_status;\n"
);
writer
.
write
(
"array [1..n_tows, 0..n_intervals] of var Operations_identifiers : tows_operations;\n\n"
);
{
// Пункт назначения может измениться только в начале новой реальной операции.
for
(
String
name
:
makeList
(
"transports"
,
"tows"
))
{
writer
.
write
(
"constraint forall (i in 1..n_"
+
name
+
", j in 1..n_intervals)"
+
"(("
+
name
+
"_operations[i, j] in {-2, -1}) -> "
+
"("
+
name
+
"_destination[i, j] == "
+
name
+
"_destination[i, j - 1]));\n"
);
}
// Из свободного состояния нельзя перейти в "занято".
for
(
String
name
:
makeList
(
"berths"
,
"transports"
,
"tows"
))
{
writer
.
write
(
"constraint forall (i in 1..n_"
+
name
+
", j in 1..n_intervals) "
+
"(("
+
name
+
"_operations[i, j] == -2) -> ("
+
name
+
"_operations[i, j - 1] != -1));\n"
);
}
writer
.
write
(
"\n"
);
}
{
// Начальные состояния.
// Все объекты на своих местах.
for
(
MovingObjectState
state
:
getVesselInitialState
())
{
int
dest_n
=
berthNumberById
.
get
(
state
.
getLocation
().
getId
());
int
obj_id
=
state
.
getVessel
().
getId
();
if
(
shipNumberById
.
containsKey
(
obj_id
))
{
writer
.
write
(
"constraint (transports_destination["
+
(
shipNumberById
.
get
(
obj_id
)
+
1
)
+
", 0] == "
+
(
dest_n
+
1
)
+
");\n"
);
continue
;
}
if
(
towNumberById
.
containsKey
(
obj_id
))
{
writer
.
write
(
"constraint (tows_destination["
+
(
towNumberById
.
get
(
obj_id
)
+
1
)
+
", 0] == "
+
(
dest_n
+
1
)
+
");\n"
);
continue
;
}
throw
new
ConversionException
(
"Unknown id "
+
obj_id
+
" - not transport and not tow."
);
}
writer
.
write
(
"\n"
);
// Никто ничего не делает.
for
(
String
name
:
makeList
(
"berths"
,
"transports"
,
"tows"
))
{
writer
.
write
(
"constraint forall (i in 1..n_"
+
name
+
") ("
+
name
+
"_operations[i, 0] == -1);\n"
);
}
writer
.
write
(
"\n"
);
// Все на месте.
for
(
String
name
:
makeList
(
"transports"
,
"tows"
))
{
writer
.
write
(
"constraint forall (i in 1..n_"
+
name
+
") ("
+
name
+
"_status[i, 0] == in_place);\n"
);
}
writer
.
write
(
"\n"
);
// Все причалы изначально пусты.
// TODO учесть операции в процессе.
writer
.
write
(
"constraint forall (i in 1..n_berths) (transport_in_berthing[i, 0] == 0);\n\n"
);
}
{
// Конечные состояния.
// TODO
}
// Причал свободен <=> его не занимает ни один корабль (фиктивный корабль с индексом 0).
writer
.
write
(
"constraint forall (i in 1..n_berths, j in 1..n_intervals)"
+
"((berths_status[i, j] == free) == (transport_in_berthing[i, j] == 0));\n"
);
// Причал занят кораблём -> пункт назначения корабля - данный причал, и он на месте.
writer
.
write
(
"constraint forall (i in 1..n_berths, j in 1..n_intervals)"
+
"(transport_in_berthing[i, j] > 0 -> "
+
"((transports_destination[transport_in_berthing[i, j], j] == i)) /\\ (transports_status[transport_in_berthing[i, j], j] == in_place));\n"
);
ArrayList
<
Set
<
Integer
>>
usingOperationsWithThisBerth
=
initArray
(
getBerths
().
size
());
ArrayList
<
Set
<
Integer
>>
usingOperationsWithThisTransport
=
initArray
(
getShips
().
size
());
ArrayList
<
Set
<
Integer
>>
usingOperationsWithThisTow
=
initArray
(
getTows
().
size
());
{
// Операции перемещения.
for
(
OperationTemplate
t
:
getTemplates
())
{
if
(
t
instanceof
MovingTemplate
)
{
MovingTemplate
operation
=
(
MovingTemplate
)
t
;
// TODO рассмотреть общий случай, ввести отдельный движущийся объект.
int
transportNo
=
shipNumberById
.
get
(
operation
.
getMover
().
getId
());
int
destNo
=
berthNumberById
.
get
(
operation
.
getDestination
().
getId
());
usingOperationsWithThisBerth
.
get
(
destNo
).
add
(
operation
.
getId
());
usingOperationsWithThisTransport
.
get
(
transportNo
).
add
(
operation
.
getId
());
{
// Если операция началась - то началась у всех.
// TODO
}
// operation.getResources();
}
}
writer
.
write
(
"\n"
);
}
{
// Запрещаем все операции, которые не используют данный объект.
ArrayList
<
Pair
<
ArrayList
<
Set
<
Integer
>>,
String
>>
classesOfObjects
=
new
ArrayList
<>();
classesOfObjects
.
add
(
new
Pair
<>(
usingOperationsWithThisBerth
,
"berths"
));
classesOfObjects
.
add
(
new
Pair
<>(
usingOperationsWithThisTransport
,
"transports"
));
classesOfObjects
.
add
(
new
Pair
<>(
usingOperationsWithThisTow
,
"tows"
));
for
(
Pair
<
ArrayList
<
Set
<
Integer
>>,
String
>
p
:
classesOfObjects
)
{
for
(
int
key
=
0
;
key
<
p
.
getKey
().
size
();
key
++)
{
writer
.
write
(
"constraint forall (j in 0..n_intervals) ("
+
p
.
getValue
()
+
"_operations["
+
(
key
+
1
)
+
", j] in {-2, -1"
);
for
(
Integer
usedOperation
:
p
.
getKey
().
get
(
key
))
{
writer
.
write
(
", "
+
usedOperation
);
}
writer
.
write
(
"});\n"
);
}
}
writer
.
write
(
"\n"
);
}
writer
.
write
(
"\nsolve satisfy;\n\n"
);
writer
.
write
(
"output ["
);
for
(
String
name
:
makeList
(
"transport_in_berthing"
,
"berths_status"
,
"berths_operations"
,
"transports_destination"
,
"transports_status"
,
"transports_operations"
,
"tows_destination"
,
"tows_status"
,
"tows_operations"
))
{
writer
.
write
(
"\""
+
name
+
" = \", show("
+
name
+
"), \"\\n\",\n "
);
}
writer
.
write
(
"];\n"
);
}
}
}
}
tests/cargo_handling_and_moving.ipp
View file @
10add7b3
...
@@ -31,7 +31,7 @@ Templates
...
@@ -31,7 +31,7 @@ Templates
201; mrn; []; 11; 5; []; 1
201; mrn; []; 11; 5; []; 1
202; unm; []; 11; 5; []; 1
202; unm; []; 11; 5; []; 1
301; loa; []; 1001; 0; 11; 5; []; 2
301; loa; []; 1001; 0; 11; 5; []; 2
; M
Cargo Flows
Cargo Flows
Initial Vessel State
Initial Vessel State
...
...
tests/simple_cargo_flow.ipp
View file @
10add7b3
...
@@ -16,7 +16,7 @@ Templates
...
@@ -16,7 +16,7 @@ Templates
103; mov; []; 11; 1; 2;[]; 1
103; mov; []; 11; 1; 2;[]; 1
201; mrn; []; 11; 2; []; 1
201; mrn; []; 11; 2; []; 1
202; unm; []; 11; 2; []; 1
202; unm; []; 11; 2; []; 1
301; loa; []; 1001; 0; 11; 2; []; 1
301; loa; []; 1001; 0; 11; 2; []; 1
; M
Cargo Flows
Cargo Flows
1001; 0; [0:0, 5:1, 8:0]
1001; 0; [0:0, 5:1, 8:0]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment