| | |
| | | <el-form-item label="LEDç©ºé²ææ¡ï¼" prop="ledContent"> |
| | | <el-input type="text" v-model="form.ledContent" placeholder="请è¾å
¥LEDç©ºé²ææ¡" v-trim /> |
| | | </el-form-item> |
| | | <el-form-item label="åæ¶ä½ä¸æ°éï¼" prop="workingNum"> |
| | | <el-input type="number" v-model="form.workingNum" placeholder="请è¾å
¥åæ¶ä½ä¸æ°é" v-trim /> |
| | | <el-form-item label="åæ¶å«å·æ°éï¼" prop="workingNum"> |
| | | <el-input type="number" v-model="form.workingNum" placeholder="请è¾å
¥åæ¶å«å·æ°é" v-trim /> |
| | | </el-form-item> |
| | | <el-form-item label="åæ¶åå¤ä½ä¸æ°éï¼" prop="callReadyNum"> |
| | | <el-input type="number" v-model="form.callReadyNum" placeholder="请è¾å
¥åæ¶åå¤ä½ä¸æ°é" v-trim /> |
| | | <el-form-item label="åæ¶å夿°éï¼" prop="callReadyNum"> |
| | | <el-input type="number" v-model="form.callReadyNum" placeholder="请è¾å
¥åæ¶å夿°é" v-trim /> |
| | | </el-form-item> |
| | | <el-form-item label="æå°ä½ä¸æç(䏿¯/å°æ¶)ï¼" prop="workRate"> |
| | | <el-input type="number" v-model="form.workRate" placeholder="请è¾å
¥æå°ä½ä¸æç(䏿¯/å°æ¶)" v-trim /> |
| | |
| | | }, |
| | | // éªè¯è§å |
| | | rules: { |
| | | workingNum: [{ required: true, validator: numRuleGtZero, message: '请è¾å
¥åæ¶ä½ä¸æ°é,å¿
须大äº0! ', trigger: 'blur' }], |
| | | workingNum: [{ required: true, validator: numRuleGtZero, message: '请è¾å
¥åæ¶å«å·æ°é,å¿
须大äº0! ', trigger: 'blur' }], |
| | | type: [{ required: true, message: 'æå°ç±»åä¸è½ä¸ºç©ºï¼', trigger: 'blur' }], |
| | | sortnum: [{ required: true, message: 'æåºç ä¸è½ä¸ºç©ºï¼', trigger: 'blur' }] |
| | | } |
| | |
| | | </el-table-column> |
| | | <el-table-column prop="groupName" label="æå±æå°ç»" fixed min-width="150px"></el-table-column> |
| | | <el-table-column prop="sortnum" label="æåºç " min-width="90px"></el-table-column> |
| | | <el-table-column prop="workingNum" label="åæ¶ä½ä¸æ°é" min-width="120px"></el-table-column> |
| | | <el-table-column prop="callReadyNum" label="åæ¶åå¤ä½ä¸æ°é" min-width="120px"></el-table-column> |
| | | <el-table-column prop="workingNum" label="åæ¶å«å·æ°é" min-width="120px"></el-table-column> |
| | | <el-table-column prop="callReadyNum" label="åæ¶å夿°é" min-width="120px"></el-table-column> |
| | | <el-table-column prop="stayTimeoutAlarmTime" label="åçè¶
æ¶æ¥è¦æ¶é´(åéï¼" min-width="180px"> |
| | | <template scope="{row}">{{ row.stayTimeoutAlarmTime ? (row.stayTimeoutAlarmTime) : '-' }}</template> |
| | | </el-table-column> |
| | |
| | | </el-table-column> |
| | | <el-table-column |
| | | prop="workingNum" |
| | | label="åæ¶ä½ä¸æ°é" |
| | | label="åæ¶å«å·æ°é" |
| | | min-width="100" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | prop="callReadyNum" |
| | | label="åæ¶åå¤è½¦è¾æ°" |
| | | label="åæ¶å夿°é" |
| | | min-width="100" |
| | | show-overflow-tooltip |
| | | /> |
| | |
| | | format="HH:mm" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="åæ¶ä½ä¸æ°é"> |
| | | <el-form-item label="åæ¶å«å·æ°é"> |
| | | <el-input v-model="param.workingNum" class="w300"></el-input> |
| | | <span class="ml10">个</span> |
| | | </el-form-item> |
| | | <el-form-item label="åæ¶åå¤ä½ä¸æ°é"> |
| | | <el-form-item label="åæ¶å夿°é"> |
| | | <el-input v-model="param.callReadyNum" class="w300"></el-input> |
| | | <span class="ml10">个</span> |
| | | </el-form-item> |
| | |
| | | |
| | | |
| | | ALTER TABLE `antaiwuliu`.`platform_job` |
| | | ADD COLUMN `TAG_VIRTUAL` int NULL COMMENT 'æ¯å¦æ è®°èææå°ç» 0å¦ 1æ¯' AFTER `ORIGIN`, |
| | | ADD COLUMN `TAG_VIRTUAL_TIME` datetime NULL COMMENT 'æ è®°èææå°ç»æ¶é´' AFTER `TAG_VIRTUAL`, |
| | | ADD COLUMN `TAG_VIRTUAL_USER` int NULL COMMENT 'æ è®°èææå°ç»äººåç¼ç ' AFTER `TAG_VIRTUAL_TIME`, |
| | | ADD COLUMN `TAG_VIRTUAL` int NULL COMMENT 'æ¯å¦æ´æ¢æå°ç» 0å¦ 1æ¯' AFTER `ORIGIN`, |
| | | ADD COLUMN `TAG_VIRTUAL_TIME` datetime NULL COMMENT 'æ´æ¢æå°ç»æ¶é´' AFTER `TAG_VIRTUAL`, |
| | | ADD COLUMN `TAG_VIRTUAL_USER` int NULL COMMENT 'æ´æ¢æå°ç»äººåç¼ç ' AFTER `TAG_VIRTUAL_TIME`, |
| | | ADD COLUMN `CALL_WAY` int NULL COMMENT 'å«å·æ¹å¼ 0æå¨å«å· 1èªå¨å«å·' AFTER `TAG_VIRTUAL_USER`, |
| | | ADD COLUMN `URGE_TIME` datetime(0) NULL DEFAULT NULL COMMENT 'å æ¥æ¶é´' AFTER `CALL_WAY`, |
| | | ADD COLUMN `URGE_USER` int NULL DEFAULT NULL COMMENT 'å æ¥äººåç¼ç ' AFTER `URGE_TIME`; |
| | |
| | | <type>pom</type> |
| | | <scope>import</scope> |
| | | </dependency>--> |
| | | <dependency> |
| | | <groupId>com.google.ortools</groupId> |
| | | <artifactId>ortools-java</artifactId> |
| | | <version>9.14.6206</version> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | </project> |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.core.utils; |
| | | |
| | | import java.util.HashMap; |
| | | import java.util.LinkedList; |
| | | import java.util.Queue; |
| | | |
| | | public class DijkstraUtil { |
| | | private Queue visited; |
| | | int[] distance; |
| | | |
| | | public DijkstraUtil(int len) { |
| | | // TODO Auto-generated constructor stub |
| | | visited = new LinkedList(); |
| | | distance = new int[len]; |
| | | |
| | | } |
| | | |
| | | private int getIndex(Queue q, int[] dis) { |
| | | int k = -1; |
| | | int min_num = Integer.MAX_VALUE; |
| | | for (int i = 0; i < dis.length; i++) { |
| | | if (!q.contains(i)) { |
| | | if (dis[i] < min_num) { |
| | | min_num = dis[i]; |
| | | k = i; |
| | | } |
| | | } |
| | | } |
| | | return k; |
| | | } |
| | | |
| | | public void dijkstra(int[][] weight, Object[] str, int v) { |
| | | HashMap path; |
| | | path = new HashMap(); |
| | | for (int i = 0; i < str.length; i++) |
| | | path.put(i, ""); |
| | | |
| | | //åå§åè·¯å¾é¿åº¦æ°ç»distance |
| | | for (int i = 0; i < str.length; i++) { |
| | | path.put(i, path.get(i) + "" + str[v]); |
| | | if (i == v) |
| | | distance[i] = 0; |
| | | else if (weight[v][i] != -1) { |
| | | distance[i] = weight[v][i]; |
| | | path.put(i, path.get(i) + "-->" + str[i]); |
| | | } else |
| | | distance[i] = Integer.MAX_VALUE; |
| | | } |
| | | visited.add(v); |
| | | while (visited.size() < str.length) { |
| | | int k = getIndex(visited, distance);//è·åæªè®¿é®ç¹ä¸è·ç¦»æºç¹æè¿çç¹ |
| | | visited.add(k); |
| | | if (k != -1) { |
| | | |
| | | for (int j = 0; j < str.length; j++) { |
| | | //夿kç¹è½å¤ç´æ¥å°è¾¾çç¹ |
| | | if (weight[k][j] != -1) { |
| | | //éè¿éååç¹ï¼æ¯è¾æ¯å¦ææ¯å½åæ´ççè·¯å¾ï¼æçè¯ï¼åæ´æ°distanceï¼å¹¶æ´æ°pathã |
| | | if (distance[j] > distance[k] + weight[k][j]) { |
| | | distance[j] = distance[k] + weight[k][j]; |
| | | path.put(j, path.get(k) + "-->" + str[j]); |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | for (int h = 0; h < str.length; h++) { |
| | | System.out.printf(str[v] + "-->" + str[h] + ":" + distance[h] + " "); |
| | | if (distance[h] == Integer.MAX_VALUE) |
| | | System.out.print(str[v] + "-->" + str[h] + "ä¹é´æ²¡æå¯éè¡è·¯å¾"); |
| | | else |
| | | System.out.print(str[v] + "-" + str[h] + "ä¹é´ææçè·¯å¾ï¼å
·ä½è·¯å¾ä¸ºï¼" + path.get(h).toString()); |
| | | System.out.println(); |
| | | } |
| | | visited.clear(); |
| | | |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | // TODO Auto-generated method stub |
| | | /* int[][] weight = { |
| | | {0, 10, 12, -1, -1, -1}, |
| | | {-1, 0, -1, 16, 25, -1}, |
| | | {4, 3, 0, 12, -1, 8}, |
| | | {-1, -1, -1, 0, 7, -1}, |
| | | {-1, -1, -1, -1, 0, -1}, |
| | | {-1, -1, -1, 2, -1, 0}}; |
| | | String[] str = {"V1", "V2", "V3", "V4", "V5", "V6"}; |
| | | int len = str.length; |
| | | DijkstraUtil dijkstra = new DijkstraUtil(len); |
| | | //便¬¡è®©åç¹å½æºç¹ï¼å¹¶è°ç¨dijkstra彿° |
| | | for (int i = 0; i < str.length; i++) { |
| | | dijkstra.dijkstra(weight, str, i); |
| | | }*/ |
| | | |
| | | int[][] weight = { |
| | | {0, 10, 5, 7, -1}, |
| | | {-1, 0, 4, 5, 10}, |
| | | {-1, 4, 0, 6, 5}, |
| | | {-1, 5, 6, 0, 7}, |
| | | {-1, -1, -1, -1, 0}}; |
| | | String[] str = {"A", "B", "C", "D", "E"}; |
| | | DijkstraUtil dijkstra = new DijkstraUtil(str.length); |
| | | dijkstra.dijkstra(weight, str, 0); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.core.utils; |
| | | |
| | | import java.util.*; |
| | | |
| | | /** |
| | | * æçè·¯å¾âDijkstraç®æ³åFloydç®æ³ |
| | | * Dijkstra(è¿ªæ°æ¯ç¹æ)ç®æ³æ¯å
¸åçåæºæçè·¯å¾ç®æ³ï¼ç¨äºè®¡ç®ä¸ä¸ªèç¹å°å
¶ä»ææèç¹çæçè·¯å¾ã主è¦ç¹ç¹æ¯ä»¥èµ·å§ç¹ä¸ºä¸å¿åå¤å±å±æ©å±ï¼ç´å°æ©å±å°ç»ç¹ä¸ºæ¢ãDijkstraç®æ³æ¯å¾æä»£è¡¨æ§çæçè·¯å¾ç®æ³ï¼å¨å¾å¤ä¸ä¸è¯¾ç¨ä¸é½ä½ä¸ºåºæ¬å
容æè¯¦ç»çä»ç»ï¼å¦æ°æ®ç»æï¼å¾è®ºï¼è¿ç¹å¦ççãæ³¨æè¯¥ç®æ³è¦æ±å¾ä¸ä¸åå¨è´æè¾¹ã |
| | | * |
| | | * é®é¢æè¿°ï¼å¨æ åå¾ G=(V,E) ä¸ï¼åè®¾æ¯æ¡è¾¹ E[i] çé¿åº¦ä¸º w[i]ï¼æ¾å°ç±é¡¶ç¹ V0 å°å
¶ä½åç¹çæçè·¯å¾ãï¼åæºæçè·¯å¾ï¼ |
| | | */ |
| | | |
| | | public class GraphByMatrix { |
| | | public static final boolean UNDIRECTED_GRAPH = false;//æ å徿 å¿ |
| | | public static final boolean DIRECTED_GRAPH = true;//æå徿 å¿ |
| | | |
| | | public static final boolean ADJACENCY_MATRIX = true;//黿¥ç©éµå®ç° |
| | | public static final boolean ADJACENCY_LIST = false;//黿¥è¡¨å®ç° |
| | | |
| | | public static final int MAX_VALUE = Integer.MAX_VALUE; |
| | | private boolean graphType; |
| | | private boolean method; |
| | | private int vertexSize; |
| | | private int matrixMaxVertex; |
| | | |
| | | //å卿æé¡¶ç¹ä¿¡æ¯çä¸ç»´æ°ç» |
| | | private Object[] vertexesArray; |
| | | //åå¨å¾ä¸é¡¶ç¹ä¹é´å
³èå
³ç³»çäºç»´æ°ç»,åè¾¹çå
³ç³» |
| | | private int[][] edgesMatrix; |
| | | |
| | | // è®°å½ç¬¬i个èç¹æ¯å¦è¢«è®¿é®è¿ |
| | | private boolean[] visited; |
| | | |
| | | /** |
| | | * @param graphType å¾çç±»åï¼æåå¾/æ åå¾ |
| | | * @param method å¾çå®ç°æ¹å¼ï¼é»æ¥ç©éµ/黿¥è¡¨ |
| | | */ |
| | | public GraphByMatrix(boolean graphType, boolean method, int size) { |
| | | this.graphType = graphType; |
| | | this.method = method; |
| | | this.vertexSize = 0; |
| | | this.matrixMaxVertex = size; |
| | | |
| | | if (this.method) { |
| | | visited = new boolean[matrixMaxVertex]; |
| | | vertexesArray = new Object[matrixMaxVertex]; |
| | | edgesMatrix = new int[matrixMaxVertex][matrixMaxVertex]; |
| | | |
| | | //对æ°ç»è¿è¡åå§åï¼é¡¶ç¹é´æ²¡æè¾¹å
³èçå¼ä¸ºIntegerç±»åçæå¤§å¼ |
| | | for (int row = 0; row < edgesMatrix.length; row++) { |
| | | for (int column = 0; column < edgesMatrix.length; column++) { |
| | | edgesMatrix[row][column] = MAX_VALUE; |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | /********************æçè·¯å¾****************************/ |
| | | //计ç®ä¸ä¸ªé¡¶ç¹å°å
¶å®ä¸ä¸ªé¡¶ç¹çæçè·ç¦» |
| | | public void Dijkstra(Object obj) throws Exception { |
| | | Dijkstra(getVertexIndex(obj)); |
| | | } |
| | | public void Dijkstra(int v0) { |
| | | int[] dist = new int[matrixMaxVertex]; |
| | | int[] prev = new int[matrixMaxVertex]; |
| | | |
| | | //åå§åvisitedãdiståpath |
| | | for (int i = 0; i < vertexSize; i++) { |
| | | //ä¸å¼å§åå®åç´è¾¾è·¯å¾æç |
| | | dist[i] = edgesMatrix[v0][i]; |
| | | visited[i] = false; |
| | | |
| | | //ç´è¾¾æ
åµä¸çæåç»ç±ç¹å°±æ¯åºåç¹ |
| | | if (i != v0 && dist[i] < MAX_VALUE) |
| | | prev[i] = v0; |
| | | else |
| | | prev[i] = -1; //æ ç´è¾¾è·¯å¾ |
| | | } |
| | | |
| | | //åå§æ¶æºç¹v0âvisitedéï¼è¡¨ç¤ºv0 å°v0çæçè·¯å¾å·²ç»æ¾å° |
| | | visited[v0] = true; |
| | | |
| | | // 䏿¥å设ç»ç±ä¸ä¸ªç¹ä¸è½¬å°è¾¾å
¶ä½åç¹,ä¼è¿äº,éªè¯ä¹ |
| | | // åå设ç»ç±ä¸¤ä¸ªç¹ä¸è½¬,伿´è¿äº,éªè¯ä¹,..... |
| | | // ç´å°ç©·ä¸¾å®ææå¯è½çä¸è½¬ç¹ |
| | | int minDist; |
| | | int v = 0; |
| | | for (int i = 1; i < vertexSize; i++) { |
| | | //æä¸ä¸ªè·ç¦»æè¿ç»ç±ç¹,䏿 è£
å
¥ v |
| | | minDist = MAX_VALUE; |
| | | |
| | | for (int j = 0; j < vertexSize; j++) { |
| | | if ((!visited[j]) && dist[j] < minDist) { |
| | | v = j; // ç»ç±é¡¶ç¹jä¸è½¬åè·ç¦»æ´ç |
| | | minDist = dist[j]; |
| | | } |
| | | } |
| | | visited[v] = true; |
| | | |
| | | /*é¡¶ç¹vå¹¶å
¥Sï¼ç±v0å°è¾¾vé¡¶ç¹çæçè·¯å¾ä¸ºmin. |
| | | åå®ç±v0å°vï¼åç±vç´è¾¾å
¶ä½åç¹ï¼æ´æ°å½åæåä¸ä¸ªç»ç±ç¹åè·ç¦»*/ |
| | | for (int j = 0; j < vertexSize; j++) { |
| | | if ((!visited[j]) && edgesMatrix[v][j] < MAX_VALUE) { |
| | | |
| | | if (minDist + edgesMatrix[v][j] <= dist[j]) { |
| | | //妿å¤ç»ç±ä¸ä¸ªvç¹å°è¾¾jç¹ç æçè·¯å¾åèè¦ç,å°±æ´æ° |
| | | dist[j] = minDist + edgesMatrix[v][j]; |
| | | |
| | | prev[j] = v; //ç»ç±ç¹çåºå· |
| | | } |
| | | |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | for (int i = 1; i < matrixMaxVertex; i++) { |
| | | System.out.println("**" + vertexesArray[v0] + "-->" +vertexesArray[i] + " çæçè·¯å¾æ¯ï¼" + dist[i]); |
| | | } |
| | | } |
| | | |
| | | //è·åé¡¶ç¹å¼å¨æ°ç»é对åºçç´¢å¼ |
| | | private int getVertexIndex(Object obj) throws Exception { |
| | | int index = -1; |
| | | for (int i = 0; i < vertexSize; i++) { |
| | | if (vertexesArray[i].equals(obj)) { |
| | | index = i; |
| | | break; |
| | | } |
| | | } |
| | | if (index == -1) { |
| | | throw new Exception("没æè¿ä¸ªå¼ï¼"); |
| | | } |
| | | |
| | | return index; |
| | | } |
| | | |
| | | /** |
| | | * åæºæçè·¯å¾ç®æ³ï¼ç¨äºè®¡ç®ä¸ä¸ªèç¹å°å
¶ä»!!ææèç¹!!çæçè·¯å¾ |
| | | */ |
| | | public void Dijkstra2(int v0) { |
| | | // LinkedListå®ç°äºQueueæ¥å£ FIFO |
| | | Queue<Integer> queue = new LinkedList<>(); |
| | | for (int i = 0; i < vertexSize; i++) { |
| | | visited[i] = false; |
| | | } |
| | | List<Map<String,Object>> result = new ArrayList<>(); |
| | | //è¿ä¸ªå¾ªç¯æ¯ä¸ºäºç¡®ä¿æ¯ä¸ªé¡¶ç¹é½è¢«éåå° |
| | | int lastRow =0; |
| | | for (int i = 0; i < vertexSize; i++) { |
| | | if (!visited[i]) { |
| | | queue.add(i); |
| | | visited[i] = true; |
| | | while (!queue.isEmpty()) { |
| | | int row = queue.remove(); |
| | | Map<String,Object> map = new HashMap<>(); |
| | | map.put("name", vertexesArray[row]); |
| | | map.put("row", row); |
| | | int tempDis =0; |
| | | if(row>0){ |
| | | tempDis = edgesMatrix[lastRow][row]; |
| | | lastRow =row; |
| | | } |
| | | map.put("dis", tempDis); |
| | | result.add(map); |
| | | System.out.print(vertexesArray[row] + "-->"); |
| | | for (int k = getMin(row); k >= 0; k = getMin(row)) { |
| | | if (!visited[k]) { |
| | | queue.add(k); |
| | | visited[k] = true; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | System.out.println(""); |
| | | int totalDis =0; |
| | | for(Map<String,Object> c :result){ |
| | | totalDis += (Integer) c.get("dis"); |
| | | System.out.print( c.get("name") + "--"+c.get("dis")+"-->"); |
| | | } |
| | | System.out.println(""); |
| | | System.out.println("æçè·ç¦»"+totalDis); |
| | | } |
| | | |
| | | private int getMin( int row) { |
| | | int minDist = MAX_VALUE; |
| | | int index = 0; |
| | | for (int j = 0; j < vertexSize; j++) { |
| | | if ((!visited[j]) && edgesMatrix[row][j] < minDist) { |
| | | minDist = edgesMatrix[row][j]; |
| | | index = j; |
| | | } |
| | | } |
| | | if (index == 0) { |
| | | return -1; |
| | | } |
| | | return index; |
| | | } |
| | | |
| | | public boolean addVertex(Object val) { |
| | | assert (val != null); |
| | | vertexesArray[vertexSize] = val; |
| | | vertexSize++; |
| | | return true; |
| | | } |
| | | |
| | | public boolean addEdge(int vnum1, int vnum2, int weight) { |
| | | assert (vnum1 >= 0 && vnum2 >= 0 && vnum1 != vnum2 && weight >= 0); |
| | | |
| | | //æåå¾ |
| | | if (graphType) { |
| | | edgesMatrix[vnum1][vnum2] = weight; |
| | | |
| | | } else { |
| | | edgesMatrix[vnum1][vnum2] = weight; |
| | | edgesMatrix[vnum2][vnum1] = weight; |
| | | } |
| | | |
| | | return true; |
| | | } |
| | | |
| | | public static void main(String[] args) throws Exception { |
| | | GraphByMatrix graph = new GraphByMatrix(GraphByMatrix.DIRECTED_GRAPH, GraphByMatrix.ADJACENCY_MATRIX, 9); |
| | | |
| | | graph.addVertex("A");//0 |
| | | graph.addVertex("B");//1 |
| | | graph.addVertex("C");//2 |
| | | graph.addVertex("D");//3 |
| | | graph.addVertex("E");//4 |
| | | |
| | | //A->BãCãD |
| | | graph.addEdge(0, 1,10); |
| | | graph.addEdge(0, 2,5); |
| | | graph.addEdge(0, 3,7); |
| | | //B->CãDãE |
| | | graph.addEdge(1, 2,4); |
| | | graph.addEdge(1, 3,5); |
| | | graph.addEdge(1, 4,10); |
| | | //C->BãDãE |
| | | graph.addEdge(2, 1,4); |
| | | graph.addEdge(2, 3,6); |
| | | graph.addEdge(2, 4,5); |
| | | //D->BãCãE |
| | | graph.addEdge(3, 1,5); |
| | | graph.addEdge(3, 2,6); |
| | | graph.addEdge(3, 4,7); |
| | | |
| | | |
| | | graph.Dijkstra(0); |
| | | System.out.println(); |
| | | graph.Dijkstra("C"); |
| | | System.out.println(); |
| | | graph.Dijkstra2(0); |
| | | System.out.println(); |
| | | } |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.core.utils; |
| | | |
| | | import com.google.ortools.Loader; |
| | | import com.google.ortools.constraintsolver.*; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | @Slf4j |
| | | public class TspSolver { |
| | | public static void main(String[] args) throws Exception { |
| | | // åå§åæ°æ®æ¨¡å |
| | | Loader.loadNativeLibraries(); |
| | | DataModel data = new DataModel(); |
| | | data.initDataList();//æé æ°æ® |
| | | |
| | | long start =System.currentTimeMillis(); |
| | | System.out.println("=============start=========="+start); |
| | | //å建æ±è§£å¨manager对象ï¼åå§åæ±è§£å¨æ°æ® |
| | | RoutingIndexManager manager = new RoutingIndexManager(data.distanceMatrix.length, data.vehicleNumber, data.depot); |
| | | |
| | | // åå§åæ±è§£å¨ |
| | | RoutingModel routing = new RoutingModel(manager); |
| | | |
| | | // // 注ååè°å½æ° |
| | | final int transitCallbackIndex = |
| | | routing.registerTransitCallback((long fromIndex, long toIndex) -> { |
| | | int fromNode = manager.indexToNode(fromIndex); |
| | | int toNode = manager.indexToNode(toIndex); |
| | | return data.distanceMatrix[fromNode][toNode]; |
| | | }); |
| | | |
| | | // å®ä¹åè°å½æ°è³æ¯æ¡è·¯çº¿ |
| | | routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex); |
| | | // å¢å è·ç¦»ç»´åº¦çº¦æ |
| | | routing.addDimension(transitCallbackIndex, 0, 30000, |
| | | true, |
| | | "Distance"); |
| | | RoutingDimension distanceDimension = routing.getMutableDimension("Distance"); |
| | | distanceDimension.setGlobalSpanCostCoefficient(100); |
| | | // // æ·»å 容ééå¶ |
| | | final int demandCallbackIndex = routing.registerUnaryTransitCallback((long fromIndex) -> { |
| | | int fromNode = manager.indexToNode(fromIndex); |
| | | return data.demands[fromNode]; |
| | | }); |
| | | routing.addDimensionWithVehicleCapacity(demandCallbackIndex, 0, data.vehicleCapacities, true, "Capacity"); |
| | | |
| | | Solver solver = routing.solver(); |
| | | |
| | | |
| | | //设置æç´¢æ¹æ³ |
| | | RoutingSearchParameters searchParameters = |
| | | main.defaultRoutingSearchParameters() |
| | | .toBuilder() |
| | | .setFirstSolutionStrategy(FirstSolutionStrategy.Value.PATH_CHEAPEST_ARC) |
| | | .build(); |
| | | |
| | | // æ§è¡ç®æ³ |
| | | Assignment solution = routing.solveWithParameters(searchParameters); |
| | | |
| | | // æå°è·¯çº¿ |
| | | printSolution(data, routing, manager, solution); |
| | | long end =System.currentTimeMillis(); |
| | | System.out.println("=============end=========="+end); |
| | | |
| | | System.out.println("=============èæ¶=========="+(end -start)+"ï¼msï¼"+(end -start)/1000 +"s"+(end -start)/60/1000 +"m"); |
| | | } |
| | | |
| | | static void printSolution( |
| | | DataModel data, RoutingModel routing, RoutingIndexManager manager, Assignment solution) { |
| | | long maxRouteDistance = 0; |
| | | for (int i = 0; i < data.vehicleNumber; ++i) { |
| | | long index = routing.start(i); |
| | | log.info("Route for Vehicle " + i + ":"); |
| | | long routeDistance = 0; |
| | | int routeDemand = 0; |
| | | String route = ""; |
| | | while (!routing.isEnd(index)) { |
| | | route += manager.indexToNode(index) + " -> "; |
| | | routeDemand += data.demands[manager.indexToNode(index)]; |
| | | long previousIndex = index; |
| | | index = solution.value(routing.nextVar(index)); |
| | | routeDistance += routing.getArcCostForVehicle(previousIndex, index, i); |
| | | } |
| | | log.info(route + manager.indexToNode(index)); |
| | | log.info("Distance of the route: " + routeDistance + "m"+" Capacity of the route:"+routeDemand+"/"+data.vehicleCapacities[i]); |
| | | maxRouteDistance = Math.max(routeDistance, maxRouteDistance); |
| | | } |
| | | log.info("Maximum of the route distances: " + maxRouteDistance + "m"); |
| | | } |
| | | |
| | | static class DataModel { |
| | | //è·ç¦»ç©éµ |
| | | public int lenght; |
| | | //æå¤§è½¦è¾éå¶ |
| | | public int vehicleNumber; |
| | | //èµ·ç¹ |
| | | public static final int depot = 0; |
| | | |
| | | //æ¯ä¸ä¸ªç¹çååçæ°é |
| | | public long[] demands; |
| | | //è½¦è¾æå¤§å®¹è½½ |
| | | public long[] vehicleCapacities ; |
| | | public long[][] distanceMatrix ; |
| | | public void initDataList(){ |
| | | lenght = 500; |
| | | vehicleNumber = 8; |
| | | demands = new long[lenght]; |
| | | vehicleCapacities =new long[vehicleNumber]; |
| | | distanceMatrix = new long[lenght][lenght]; |
| | | int total0 =0; |
| | | for (int i = 0; i <vehicleNumber ; i++) { |
| | | long tem = (long) (Math.random() * 1000 + 20000); |
| | | vehicleCapacities[i] = tem; |
| | | total0+=tem; |
| | | System.out.print(tem+" ,"); |
| | | } |
| | | System.out.println( "\ntotal Capacity:"+total0+"====================="); |
| | | long total = 0; |
| | | for (int i = 0; i <lenght ; i++) { |
| | | long tem = (int)(Math.random()*100+100); |
| | | demands[i] =tem; |
| | | total+=tem; |
| | | System.out.print(tem+" ,"); |
| | | for (int j = 0; j <lenght ; j++) { |
| | | if(i == j){ |
| | | distanceMatrix[i][j] =0; |
| | | } |
| | | if(i<j){ |
| | | distanceMatrix[i][j] =(int)(Math.random()*1000+1); |
| | | distanceMatrix[j][i] = distanceMatrix[i][j]; |
| | | } |
| | | } |
| | | } |
| | | |
| | | System.out.println( "\ntotal Demands:"+total+"====================="); |
| | | } |
| | | /* public final long[][] distanceMatrix = { |
| | | {0, 548, 776, 696, 582, 274, 502, 194, 308, 194, 536, 502, 388, 354, 468, 776, 662}, |
| | | {548, 0, 684, 308, 194, 502, 730, 354, 696, 742, 1084, 594, 480, 674, 1016, 868, 1210}, |
| | | {776, 684, 0, 992, 878, 502, 274, 810, 468, 742, 400, 1278, 1164, 1130, 788, 1552, 754}, |
| | | {696, 308, 992, 0, 114, 650, 878, 502, 844, 890, 1232, 514, 628, 822, 1164, 560, 1358}, |
| | | {582, 194, 878, 114, 0, 536, 764, 388, 730, 776, 1118, 400, 514, 708, 1050, 674, 1244}, |
| | | {274, 502, 502, 650, 536, 0, 228, 308, 194, 240, 582, 776, 662, 628, 514, 1050, 708}, |
| | | {502, 730, 274, 878, 764, 228, 0, 536, 194, 468, 354, 1004, 890, 856, 514, 1278, 480}, |
| | | {194, 354, 810, 502, 388, 308, 536, 0, 342, 388, 730, 468, 354, 320, 662, 742, 856}, |
| | | {308, 696, 468, 844, 730, 194, 194, 342, 0, 274, 388, 810, 696, 662, 320, 1084, 514}, |
| | | {194, 742, 742, 890, 776, 240, 468, 388, 274, 0, 342, 536, 422, 388, 274, 810, 468}, |
| | | {536, 1084, 400, 1232, 1118, 582, 354, 730, 388, 342, 0, 878, 764, 730, 388, 1152, 354}, |
| | | {502, 594, 1278, 514, 400, 776, 1004, 468, 810, 536, 878, 0, 114, 308, 650, 274, 844}, |
| | | {388, 480, 1164, 628, 514, 662, 890, 354, 696, 422, 764, 114, 0, 194, 536, 388, 730}, |
| | | {354, 674, 1130, 822, 708, 628, 856, 320, 662, 388, 730, 308, 194, 0, 342, 422, 536}, |
| | | {468, 1016, 788, 1164, 1050, 514, 514, 662, 320, 274, 388, 650, 536, 342, 0, 764, 194}, |
| | | {776, 868, 1552, 560, 674, 1050, 1278, 742, 1084, 810, 1152, 274, 388, 422, 764, 0, 798}, |
| | | {662, 1210, 754, 1358, 1244, 708, 480, 856, 514, 468, 354, 844, 730, 536, 194, 798, 0}, |
| | | };*/ |
| | | |
| | | } |
| | | |
| | | } |
| | |
| | | @ExcelColumn(name="å·¥ä½ç»ææ¶é´") |
| | | private String endTime; |
| | | |
| | | @ApiModelProperty(value = "åæ¶ä½ä¸æ°é", example = "1") |
| | | @ExcelColumn(name="åæ¶ä½ä¸æ°é") |
| | | @ApiModelProperty(value = "åæ¶å«å·æ°é", example = "1") |
| | | @ExcelColumn(name="åæ¶å«å·æ°é") |
| | | private Integer workingNum; |
| | | @ApiModelProperty(value = "åæ¶åå¤ä½ä¸æ°é", example = "1") |
| | | @ExcelColumn(name="åæ¶åå¤ä½ä¸æ°é") |
| | | @ApiModelProperty(value = "åæ¶åå¤å«å·æ°é", example = "1") |
| | | @ExcelColumn(name="åæ¶åå¤å«å·æ°é") |
| | | private Integer callReadyNum; |
| | | |
| | | @ApiModelProperty(value = "ä½ä¸è¶
æ¶æ¥è¦æ¶é´(ç§ï¼", example = "1") |
| | |
| | | @ApiModelProperty(value = "ç¾å°åºå·", example = "1") |
| | | private Integer signNum; |
| | | |
| | | @ApiModelProperty(value = "æ¯å¦æ è®°èææå°ç» 0å¦ 1æ¯", example = "1") |
| | | @ApiModelProperty(value = "æ¯å¦æ´æ¢è¿æå°ç» 0å¦ 1æ¯", example = "1") |
| | | private Integer tagVirtual; |
| | | @ApiModelProperty(value = "æ è®°èææå°ç»æ¶é´", example = "1") |
| | | @ApiModelProperty(value = "æ´æ¢è¿æå°ç»æ¶é´", example = "1") |
| | | private Date tagVirtualTime; |
| | | @ApiModelProperty(value = "æ è®°èææå°ç»äººåç¼ç ", example = "1") |
| | | @ApiModelProperty(value = "æ´æ¢è¿æå°ç»äººåç¼ç ", example = "1") |
| | | private Integer tagVirtualUser; |
| | | @ApiModelProperty(value = "å«å·æ¹å¼ 0æå¨å«å· 1èªå¨å«å·", example = "1") |
| | | private Integer callWay; |
| | |
| | | BeanUtils.copyProperties(model,platformJob); |
| | | platformJob.setPlatformGroupId(param.getPlatformGroupId()); |
| | | platformJob.setEditDate(new Date()); |
| | | platformJob.setTagVirtual(Constants.ONE); |
| | | platformJob.setTagVirtualUser(platformJob.getEditor()); |
| | | platformJob.setTagVirtualTime(platformJob.getEditDate()); |
| | | platformJob.setEditor(loginUser.getId()); |
| | | int flag = platformJobMapper.update(null,new UpdateWrapper<PlatformJob>().lambda() |
| | | .set(PlatformJob::getEditDate,platformJob.getEditDate()) |
| | | .set(PlatformJob::getTagVirtualTime,platformJob.getTagVirtualTime()) |
| | | .set(PlatformJob::getEditor,platformJob.getEditor()) |
| | | .set(PlatformJob::getPlatformGroupId,param.getPlatformGroupId()) |
| | | .set(PlatformJob::getTagVirtualUser,platformJob.getEditor()) |
| | | .set(PlatformJob::getPlatformId,null)//置空åé
çæå°ä¿¡æ¯ |
| | | .in(PlatformJob::getStatus,Constants.PlatformJobStatus.WAIT_CONFIRM.getKey(), |
| | | Constants.PlatformJobStatus.WART_SIGN_IN.getKey(), |