62,614
社区成员
发帖
与我相关
我的任务
分享
-----------------------------------Time 1
-----------------------------------Time 2
-----------------------------------Time 3
-----------------------------------Time 4
-----------------------------------Time 5
Vessel 1 is done.
-----------------------------------Time 6
Vessel 2 is done.
-----------------------------------Time 7
-----------------------------------Time 8
-----------------------------------Time 9
Vessel 1 is berthed started in 0
Vessel 1 length is 13
Vessel 1 has QCs 5
Vessel 1 left work is 20
Vessel 1 has QCs 5
Vessel 1 left work is 15
Vessel 2 is berthed started in 13
Vessel 2 length is 18
Vessel 1 has QCs 5
Vessel 1 left work is 10
Vessel 2 has QCs 2
Vessel 2 left work is 6
Vessel 1 has QCs 5
Vessel 1 left work is 5
Vessel 2 has QCs 2
Vessel 2 left work is 4
Vessel 3 is berthed started in 31
Vessel 3 length is 20
Vessel 1 has QCs 5
Vessel 1 left work is 0
Vessel 2 has QCs 2
Vessel 2 left work is 2
Vessel 3 has QCs 1-----------------------------------Time 10
-----------------------------------Time 11
Vessel 4 is done.
-----------------------------------Time 12
Vessel 5 is done.
-----------------------------------Time 13
-----------------------------------Time 14
-----------------------------------Time 15
-----------------------------------Time 16
Vessel 3 is done.
-----------------------------------Time 17
Vessel 7 is done.
-----------------------------------Time 18
-----------------------------------Time 19
-----------------------------------Time 20
-----------------------------------Time 21
-----------------------------------Time 22
-----------------------------------Time 23
Vessel 3 left work is 11
Vessel 4 is berthed started in 51
Vessel 4 length is 15
Vessel 2 has QCs 2
Vessel 2 left work is 0
Vessel 3 has QCs 1
Vessel 3 left work is 10
Vessel 4 has QCs 3
Vessel 4 left work is 15
Vessel 3 has QCs 1
Vessel 3 left work is 9
Vessel 4 has QCs 3
Vessel 4 left work is 12
Vessel 3 has QCs 1
Vessel 3 left work is 8
Vessel 4 has QCs 3
Vessel 4 left work is 9
Vessel 5 is berthed started in 0
Vessel 5 length is 14
Vessel 3 has QCs 1
Vessel 3 left work is 7
Vessel 4 has QCs 3
Vessel 4 left work is 6
Vessel 5 has QCs 4
Vessel 5 left work is 12
Vessel 6 is berthed started in 14
Vessel 6 length is 16
Vessel 7 is berthed started in 66
Vessel 7 length is 22
Vessel 3 has QCs 1
Vessel 3 left work is 6
Vessel 4 has QCs 3
Vessel 4 left work is 3
Vessel 5 has QCs 4
Vessel 5 left work is 8
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 0
Vessel 7 left work is 30
Vessel 3 has QCs 1
Vessel 3 left work is 5
Vessel 4 has QCs 3
Vessel 4 left work is 0
Vessel 5 has QCs 4
Vessel 5 left work is 4
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 0
Vessel 7 left work is 30
Vessel 3 has QCs 1
Vessel 3 left work is 4
Vessel 5 has QCs 4
Vessel 5 left work is 0
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 3
Vessel 7 left work is 27
Vessel 3 has QCs 1
Vessel 3 left work is 3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 21
Vessel 3 has QCs 1
Vessel 3 left work is 2
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 15
Vessel 3 has QCs 1
Vessel 3 left work is 1
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 9
Vessel 3 has QCs 1
Vessel 3 left work is 0
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is -3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
这是我的运行结果。然后再运行一次-----------------------------------Time 1
Vessel 1 is berthed started in 0
Vessel 1 length is 13
-----------------------------------Time 2
Vessel 1 has QCs 5
Vessel 1 left work is 20
Vessel 1 has QCs 5
Vessel 1 left work is 15
-----------------------------------Time 3
Vessel 2 is berthed started in 13
Vessel 2 length is 18
Vessel 1 has QCs 5
Vessel 1 left work is 10
Vessel 2 has QCs 2
Vessel 2 left work is 6
-----------------------------------Time 4
Vessel 1 has QCs 5
Vessel 1 left work is 5
Vessel 2 has QCs 2
Vessel 2 left work is 4
-----------------------------------Time 5
Vessel 3 is berthed started in 31
Vessel 3 length is 20
Vessel 1 has QCs 5
Vessel 1 left work is 0
Vessel 1 is done.
Vessel 2 has QCs 2
Vessel 2 left work is 2
Vessel 3 has QCs 1
Vessel 3 left work is 11
-----------------------------------Time 6
Vessel 4 is berthed started in 51
Vessel 4 length is 15
Vessel 2 has QCs 2
Vessel 2 left work is 0
Vessel 2 is done.
Vessel 3 has QCs 1
Vessel 3 left work is 10
Vessel 4 has QCs 3
Vessel 4 left work is 15
-----------------------------------Time 7
Vessel 3 has QCs 1
Vessel 3 left work is 9
Vessel 4 has QCs 3
Vessel 4 left work is 12
-----------------------------------Time 8
Vessel 3 has QCs 1
Vessel 3 left work is 8
Vessel 4 has QCs 3
Vessel 4 left work is 9-----------------------------------Time 9
-----------------------------------Time 10
-----------------------------------Time 11
Vessel 4 is done.
-----------------------------------Time 12
Vessel 5 is done.
-----------------------------------Time 13
-----------------------------------Time 14
-----------------------------------Time 15
-----------------------------------Time 16
Vessel 3 is done.
-----------------------------------Time 17
Vessel 7 is done.
-----------------------------------Time 18
-----------------------------------Time 19
-----------------------------------Time 20
-----------------------------------Time 21
-----------------------------------Time 22
-----------------------------------Time 23
Vessel 5 is berthed started in 0
Vessel 5 length is 14
Vessel 3 has QCs 1
Vessel 3 left work is 7
Vessel 4 has QCs 3
Vessel 4 left work is 6
Vessel 5 has QCs 4
Vessel 5 left work is 12
Vessel 6 is berthed started in 14
Vessel 6 length is 16
Vessel 7 is berthed started in 66
Vessel 7 length is 22
Vessel 3 has QCs 1
Vessel 3 left work is 6
Vessel 4 has QCs 3
Vessel 4 left work is 3
Vessel 5 has QCs 4
Vessel 5 left work is 8
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 0
Vessel 7 left work is 30
Vessel 3 has QCs 1
Vessel 3 left work is 5
Vessel 4 has QCs 3
Vessel 4 left work is 0
Vessel 5 has QCs 4
Vessel 5 left work is 4
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 0
Vessel 7 left work is 30
Vessel 3 has QCs 1
Vessel 3 left work is 4
Vessel 5 has QCs 4
Vessel 5 left work is 0
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 3
Vessel 7 left work is 27
Vessel 3 has QCs 1
Vessel 3 left work is 3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 21
Vessel 3 has QCs 1
Vessel 3 left work is 2
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 15
Vessel 3 has QCs 1
Vessel 3 left work is 1
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 9
Vessel 3 has QCs 1
Vessel 3 left work is 0
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is -3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
-----------------------------------Time 1
-----------------------------------Time 2
-----------------------------------Time 3
Vessel 1 is berthed started in 0
Vessel 1 length is 13
Vessel 1 has QCs 5
Vessel 1 left work is 20
Vessel 1 has QCs 5
Vessel 1 left work is 15
Vessel 2 is berthed started in 13
Vessel 2 length is 18
Vessel 1 has QCs 5
Vessel 1 left work is 10
Vessel 2 has QCs 2
Vessel 2 left work is 6
Vessel 1 has QCs 5
Vessel 1 left work is 5
Vessel 2 has QCs 2
Vessel 2 left work is 4
-----------------------------------Time 4
-----------------------------------Time 5
Vessel 3 is berthed started in 31
Vessel 3 length is 20
Vessel 1 has QCs 5
Vessel 1 left work is 0
Vessel 2 has QCs 2
Vessel 2 left work is 2
Vessel 3 has QCs 1
Vessel 3 left work is 11
Vessel 4 is berthed started in 51
Vessel 4 length is 15
Vessel 2 has QCs 2
Vessel 1 is done.
-----------------------------------Time 6
Vessel 2 left work is 0
Vessel 2 is done.
Vessel 3 has QCs 1
Vessel 3 left work is 10
Vessel 4 has QCs 3
Vessel 4 left work is 15
-----------------------------------Time 7
Vessel 3 has QCs 1
Vessel 3 left work is 9
Vessel 4 has QCs 3
-----------------------------------Time 8
Vessel 4 left work is 12
Vessel 3 has QCs 1
Vessel 3 left work is 8
Vessel 4 has QCs 3
Vessel 4 left work is 9
-----------------------------------Time 9
-----------------------------------Time 10
-----------------------------------Time 11
Vessel 5 is berthed started in 0
Vessel 5 length is 14
Vessel 3 has QCs 1
Vessel 3 left work is 7
Vessel 4 has QCs 3
Vessel 4 left work is 6
Vessel 5 has QCs 4
Vessel 5 left work is 12
Vessel 6 is berthed started in 14
Vessel 6 length is 16
Vessel 7 is berthed started in 66
Vessel 7 length is 22
Vessel 3 has QCs 1
Vessel 3 left work is 6
Vessel 4 has QCs 3
Vessel 4 left work is 3
Vessel 5 has QCs 4
Vessel 5 left work is 8
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 0
Vessel 7 left work is 30
Vessel 3 has QCs 1Vessel 4 is done.
-----------------------------------Time 12
Vessel 5 is done.
-----------------------------------Time 13
Vessel 3 left work is 5
Vessel 4 has QCs 3
Vessel 4 left work is 0
Vessel 5 has QCs 4
Vessel 5 left work is 4
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 0
Vessel 7 left work is 30
Vessel 3 has QCs 1
Vessel 3 left work is 4
Vessel 5 has QCs 4
Vessel 5 left work is 0
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 3
Vessel 7 left work is 27
Vessel 3 has QCs 1
Vessel 3 left work is 3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 21
-----------------------------------Time 14
-----------------------------------Time 15
-----------------------------------Time 16
Vessel 3 is done.
-----------------------------------Time 17
Vessel 7 is done.
-----------------------------------Time 18
Vessel 3 has QCs 1
Vessel 3 left work is 2
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 15
Vessel 3 has QCs 1
Vessel 3 left work is 1
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 9
Vessel 3 has QCs 1
Vessel 3 left work is 0
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is 3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 7 has QCs 6
Vessel 7 left work is -3
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0-----------------------------------Time 19
Vessel 6 left work is 10
-----------------------------------Time 20
-----------------------------------Time 21
-----------------------------------Time 22
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
Vessel 6 has QCs 0
Vessel 6 left work is 10
-----------------------------------Time 23
Vessel 6 has QCs 0
Vessel 6 left work is 10
for (int startTime = 1; startTime < lastTime; startTime++) {
System.err.println("-----------------------------------Time "
+ startTime);
if (inWorkSet.size() == 0 && state) {
System.err.println("All is done.");
break;
}
// 下面的for循环用于检查是否有船可靠泊
for (Vessel vessel : list) {
if (startTime == vessel.getArriveTime()) {
int a;
if ((a = findEnoughBerth(vessel.getLength())) >= 0) {
vessel.setStartLocation(a);
System.out.println("Vessel " + vessel.getIndex()
+ " is berthed started in " + a);
System.out.println("Vessel " + vessel.getIndex()
+ " length is " + vessel.getLength());
inWorkSet.add(vessel);
state = true;
currentVessel = vessel;
berthAlloacte(vessel);
} else {
vessel.setArriveTime(vessel.getArriveTime() + 1);
}
} else {
break;
}
}
list.remove(currentVessel);
// 下面的if是在此刻有船靠泊后为其执行。无新船靠泊就跳过
if (currentVessel != null) {
while (QCS_left > 0) {
if (currentVessel.getQCs_allocated() < currentVessel
.getMaxQCs()) {
currentVessel.setQCs_allocated(currentVessel
.getQCs_allocated() + 1);
QCS_left--;
} else {
break;
}
}
}
// 给泊位中的每艘船作业
Vessel doneVessel = null;
for (Vessel vessel : inWorkSet) {
System.out.println("Vessel " + vessel.getIndex() + " has QCs "
+ vessel.getQCs_allocated());
vessel.setWorkAmount(vessel.getWorkAmount()
- vessel.getQCs_allocated());
System.out.println("Vessel " + vessel.getIndex()
+ " left work is " + vessel.getWorkAmount());
if (vessel.getWorkAmount() <= 0) {
System.err.println("Vessel " + vessel.getIndex()
+ " is done.");
doneVessel = vessel;
QCS_left += vessel.getQCs_allocated();
unBerthShip(vessel);
}
}
inWorkSet.remove(doneVessel);
}
public class Vessel {
public Vessel() {
}
private int index;
private int arriveTime;
private int length;
private int workAmount;
private int minQCs;
private int maxQCs;
private int hopeTimeToLeave;
private int QCs_allocated = 0;
private int time_to_end = 24;
private int startLocation = -1;
public int getStartLocation() {
return startLocation;
}
public void setStartLocation(int startLocation) {
this.startLocation = startLocation;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getQCs_allocated() {
return QCs_allocated;
}
public void setQCs_allocated(int qCs_allocated) {
QCs_allocated = qCs_allocated;
}
public int getTime_to_end() {
return time_to_end;
}
public void setTime_to_end(int time_to_end) {
this.time_to_end = time_to_end;
}
/**
* 船只信息
*
* @param index
* 船只编号
* @param arriveTime
* 到达时间
* @param length
* 船只长度
* @param workAmount
* 货物量
* @param min
* 工作时最少的桥吊数
* @param max
* 工作时最大的桥吊数
* @param hope
* 期望离港时间
*/
public Vessel(int index, int arriveTime, int length, int workAmount,
int min, int max, int hope) {
this.index = index;
this.arriveTime = arriveTime;
this.length = length;
this.workAmount = workAmount;
this.maxQCs = max;
this.minQCs = min;
this.hopeTimeToLeave = hope;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public int getArriveTime() {
return arriveTime;
}
public void setArriveTime(int arriveTime) {
this.arriveTime = arriveTime;
}
public int getWorkAmount() {
return workAmount;
}
public void setWorkAmount(int workAmount) {
this.workAmount = workAmount;
}
public int getMinQCs() {
return minQCs;
}
public void setMinQCs(int minQCs) {
this.minQCs = minQCs;
}
public int getMaxQCs() {
return maxQCs;
}
public void setMaxQCs(int maxQCs) {
this.maxQCs = maxQCs;
}
public int getHopeTimeToLeave() {
return hopeTimeToLeave;
}
public void setHopeTimeToLeave(int hopeTimeToLeave) {
this.hopeTimeToLeave = hopeTimeToLeave;
}
}
然后我业务代码:
public class Allocation {
private final int[] BERTH_LENGTH = new int[90];
private final int QCS_AMOUNT = 8;
private final int lastTime = 24;
// private Vessel[] vessels = new Vessel[9];
private int berth_left[];
private int QCS_left;
private List<Vessel> inWorkSet = new ArrayList<Vessel>();
private List<Vessel> list;
public static Vessel[] vessels0 = new Vessel[] {
new Vessel(1, 1, 13, 25, 1, 5, 6),
new Vessel(2, 3, 18, 8, 1, 2, 7),
new Vessel(3, 5, 20, 12, 1, 4, 8),
new Vessel(4, 6, 15, 18, 1, 3, 12),
new Vessel(5, 9, 14, 16, 1, 4, 13),
new Vessel(6, 10, 16, 10, 1, 2, 15),
new Vessel(7, 10, 22, 30, 1, 6, 15),
new Vessel(8, 12, 21, 18, 1, 3, 18),
new Vessel(9, 15, 18, 24, 1, 6, 19) };
private Allocation initilization() {
for (int i = 0; i < 90; i++) {
BERTH_LENGTH[i] = 0;// 0 presents nothing
}
berth_left = BERTH_LENGTH;
QCS_left = QCS_AMOUNT;
return this;
}
private void allocate() {
list = new ArrayList<Vessel>(Arrays.asList(vessels0));
Vessel currentVessel = null;
boolean state = false;
for (int startTime = 1; startTime < lastTime; startTime++) {
System.err.println("-----------------------------------Time "
+ startTime);
if (inWorkSet.size() == 0 && state) {
System.err.println("All is done.");
break;
}
// 下面的for循环用于检查是否有船可靠泊
for (Vessel vessel : list) {
if (startTime == vessel.getArriveTime()) {
int a;
if ((a = findEnoughBerth(vessel.getLength())) >= 0) {
vessel.setStartLocation(a);
System.out.println("Vessel " + vessel.getIndex()
+ " is berthed started in " + a);
System.out.println("Vessel " + vessel.getIndex()
+ " length is " + vessel.getLength());
inWorkSet.add(vessel);
state = true;
currentVessel = vessel;
berthAlloacte(vessel);
} else {
vessel.setArriveTime(vessel.getArriveTime() + 1);
}
} else {
break;
}
}
list.remove(currentVessel);
// 下面的if是在此刻有船靠泊后为其执行。无新船靠泊就跳过
if (currentVessel != null) {
while (QCS_left > 0) {
if (currentVessel.getQCs_allocated() < currentVessel
.getMaxQCs()) {
currentVessel.setQCs_allocated(currentVessel
.getQCs_allocated() + 1);
QCS_left--;
} else {
break;
}
}
}
// 给泊位中的每艘船作业
Vessel doneVessel = null;
for (Vessel vessel : inWorkSet) {
System.out.println("Vessel " + vessel.getIndex() + " has QCs "
+ vessel.getQCs_allocated());
vessel.setWorkAmount(vessel.getWorkAmount()
- vessel.getQCs_allocated());
System.out.println("Vessel " + vessel.getIndex()
+ " left work is " + vessel.getWorkAmount());
if (vessel.getWorkAmount() <= 0) {
System.err.println("Vessel " + vessel.getIndex()
+ " is done.");
doneVessel = vessel;
QCS_left += vessel.getQCs_allocated();
unBerthShip(vessel);
}
}
inWorkSet.remove(doneVessel);
}
}
private int findEnoughBerth(int shipLength) {
int find_ok = -1;
boolean state = false;
label: for (int i = 0; i < berth_left.length - shipLength && !state; i++) {
if (berth_left[i] == 0) {
for (int j = i; j < i + shipLength; j++) {
if (berth_left[j] == 1) {
i = j;
continue label;
}
}
find_ok = i;
state = true;
for (int j = i; j < i + shipLength; j++) {
berth_left[j] = 1;
}
}
}
return find_ok;
}
private void berthAlloacte(Vessel vessel) {
for (int i = vessel.getStartLocation(); i < vessel.getStartLocation()
+ vessel.getLength(); i++) {
berth_left[i] = 1;
}
}
private void unBerthShip(Vessel vessel) {
for (int i = vessel.getStartLocation(); i < vessel.getStartLocation()
+ vessel.getLength(); i++) {
berth_left[i] = 0;
}
}
public static void main(String[] args) {
Allocation allocation = new Allocation();
allocation.initilization().allocate();
}
}