在线时间 791 小时 最后登录 2022-11-28 注册时间 2017-6-12 听众数 15 收听数 0 能力 120 分 体力 36169 点 威望 11 点 阅读权限 255 积分 13791 相册 0 日志 0 记录 1 帖子 616 主题 542 精华 10 分享 0 好友 225
TA的每日心情 开心 2020-11-14 17:15
签到天数: 74 天
[LV.6]常住居民II
群组 : 2019美赛冲刺课程
群组 : 站长地区赛培训
群组 : 2019考研数学 桃子老师
群组 : 2018教师培训(呼伦贝
群组 : 2019考研数学 站长系列
摘要: 本文讲的是数学建模(5)——改良圈算法, 改良圈算法可得到旅行商问题的较好解,遗传算法那章就是利用该算法得到初始种群 基本原理 首先求得一个Hamilton圈,然后修改圈得到具有较小权的另一个Hamilton圈,直至无法改进则停止 构建新圈 。
" {8 ?9 j& {# t 改良圈算法可得到旅行商问题的较好解,遗传算法那章就是利用该算法得到初始种群 基本原理
首先求得一个Hamilton圈,然后修改圈得到具有较小权的另一个Hamilton圈,直至无法改进则停止 构建新圈
对于 1≤i<i+1<j≤n,构建新的Hamilton圈
" `$ e" d _. `6 o8 o3 l2 n5 s Cij = v1v2…vivjvj-1vj-2…vi+1vJ+1vJ+2…vnv1
0 k- n& k# M5 H0 E 它是由C中将vi和vj之间的边逆序得到的。
- \* D- ~/ x' d. v3 }8 ]6 Z 若 w(vivj)+w(vi+1vj+1)<w(vivi+1)+w(vjvj+1)
, h! Q4 m; c5 ^7 Y/ ] G, @( b 则该圈替换有效
使用该算法得到的只是较好解,几乎可以肯定不是最优解 代码实例
clear,clc a=[0 56 35 21 51 60 56 0 21 57 78 70 35 21 0 36 68 68 21 57 36 0 51 61 51 78 68 51 0 13 60 70 68 61 13 0]; L=size(a,1); c=[5 1:4 6 5];%选择初始圈 [circle,long]=modifycircle(a,L,c)function [circle,long]=modifycircle(a,L,c); for k=1 flag=0;%退出标志 for m=1 -2 %m为算法中的i for n=m+2 %n为算法中的j if a(c(m),c(n))+a(c(m+1),c(n+1))<a(c(m),c(m+1))+a(c(n),c(n+1)) c(m+1:n)=c(n:-1:m+1); flag=flag+1;%修改标志+1 end end end if flag==0%一条边也没修改,直接返回 long=0; for i=1 long=long+a(c(i),c(i+1)); end circle=c;%返回修改圈 return end end以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索matlab , 算法 , 数学建模 解优化 ,以便于您获取更多的相关知识。
生命不止,继续 go go go !!!
上一篇博客跟大家介绍了,如何实现一个简单的tcp服务器和客户端,那么在此基础上,继续深耕一点点,介绍一下如何创建一个聊天室。
当然,还是还是一个要有一个服务端和若干个客户端。
server
! W. a0 I# t5 C/ _ }% ~" ? net.Listen ) d) F/ O W$ H
Accept
6 V, X6 ^0 ]4 M# n8 ]$ r 这两个方法就不介绍了,之前都有提到过。
声明一个net.Conn数组,用于存放连接服务器的客户端:
var clients []net.Conn大部分跟之前提到的tcp的server/client没有区别,最大的区别就是服务端收到消息后需要通知各个客户端,所以可以通过遍历数组cliQue来完成消息的通知。这里用到了for…range循环:
func notify(conn net.Conn, msg string) { for _, con := range clients { if con.RemoteAddr() != conn.RemoteAddr() { con.Write([]byte(msg)) } } }顺便介绍一下RemoteAddr
func (c *IPConn) RemoteAddr() Addr作用: 5 @2 w7 {& [5 m' q3 V1 e. s9 ~9 {
RemoteAddr returns the remote network address. The Addr returned is shared by all invocations of RemoteAddr, so do not modify it.
有一个客户端离开聊天室的时,要通知所有的客户端:
func disconnect(conn net.Conn, name string) { for index, con := range clients { if con.RemoteAddr() == conn.RemoteAddr() { disMsg := name + " has left the room." fmt.Println(disMsg) clients = append(clients[:index], clients[index+1:]...) notify(conn, disMsg) } } }Go语言函数中有三个点…表示为可变参数,可以接受任意个数的参数。
append主要用于给某个切片(slice)追加元素
如果该切片存储空间(cap)足够,就直接追加,长度(len)变长;如果空间不足,就会重新开辟内存,并将之前的元素和新的元素一同拷贝进去
第一个参数为切片,后面是该切片存储元素类型的可变参数
client 2 T: b: T7 b- }) u4 a6 |7 v
客户端的代码就相对简单了很多。net.Dial也不再赘述。 ) P* ~+ K5 h* f e+ F. q8 W
注意就是从conn读数据,这里readStr[:length]用到了切片。
func read(conn net.Conn) { for { length, err := conn.Read(readStr) if err != nil { fmt.Printf("Error when read from server. Error:%s\n", err) os.Exit(0) } fmt.Println(string(readStr[:length])) } }完整代码 2 x" H; ^+ B( r3 {4 D
服务端:
package main import ( "fmt" "net" "os" ) var clients []net.Conn func main() { var ( host = "localhost" port = "8000" remote = host + ":" + port data = make([]byte, 1024) ) fmt.Println("Initiating server...") lis, err := net.Listen("tcp", remote) defer lis.Close() if err != nil { fmt.Printf("Error when listen: %s, Err: %s\n", remote, err) os.Exit(-1) } for { var res string conn, err := lis.Accept() if err != nil { fmt.Println("Error accepting client: ", err.Error()) os.Exit(0) } clients = append(clients, conn) go func(con net.Conn) { fmt.Println("New connection: ", con.RemoteAddr()) // Get client's name length, err := con.Read(data) if err != nil { fmt.Printf("Client %v quit.\n", con.RemoteAddr()) con.Close() disconnect(con, con.RemoteAddr().String()) return } name := string(data[:length]) comeStr := name + " entered the room." notify(con, comeStr) // Begin recieve message from client for { length, err := con.Read(data) if err != nil { fmt.Printf("Client %s quit.\n", name) con.Close() disconnect(con, name) return } res = string(data[:length]) sprdMsg := name + " said: " + res fmt.Println(sprdMsg) res = "You said:" + res con.Write([]byte(res)) notify(con, sprdMsg) } }(conn) } } func notify(conn net.Conn, msg string) { for _, con := range clients { if con.RemoteAddr() != conn.RemoteAddr() { con.Write([]byte(msg)) } } func disconnect(conn net.Conn, name string) { for index, con := range clients { if con.RemoteAddr() == conn.RemoteAddr() { disMsg := name + " has left the room." fmt.Println(disMsg) clients = append(clients[:index], clients[index+1:]...) notify(conn, disMsg) } } }客户端:
package main import ( "bufio" "fmt" "net" "os" ) var writeStr, readStr = make([]byte, 1024), make([]byte, 1024) func main() { var ( host = "localhost" port = "8000" remote = host + ":" + port reader = bufio.NewReader(os.Stdin) ) con, err := net.Dial("tcp", remote) defer con.Close() if err != nil { fmt.Println("Server not found.") os.Exit(-1) } fmt.Println("Connection OK.") fmt.Printf("Enter your name: ") fmt.Scanf("%s", &writeStr) in, err := con.Write([]byte(writeStr)) if err != nil { fmt.Printf("Error when send to server: %d\n", in) os.Exit(0) } fmt.Println("Now begin to talk!") go read(con) for writeStr, _, _ = reader.ReadLine() if string(writeStr) == "quit" { fmt.Println("Communication terminated.") os.Exit(1) } in, err := con.Write([]byte(writeStr)) if err != nil { fmt.Printf("Error when send to server: %d\n", in) os.Exit(0) } } } func read(conn net.Conn) { for { length, err := conn.Read(readStr) if err != nil { fmt.Printf("Error when read from server. Error:%s\n", err) os.Exit(0) } fmt.Println(string(readStr[:length])) } }创建一个本地代码库
3 j7 ^$ P0 Y2 n0 c' W7 b
切换到你需要创建的代码库的目录下:
6 }/ @8 {/ q2 { 运行如下git 命令
6 ^& F" i. Z7 z [
git --bare init
3 t" Q! p, i' h8 `' g# e m2 r5 C& ] git下会出现一些隐藏的文件,这些文件时git本地库的描述文件
2 P$ a9 l4 L- P% [( G
加载项目文件
' M6 X( y2 ^' M* s8 k9 B
; A/ ?$ f/ H- u, |: h. T; l
git add .
最后的符号“.”是指 “所有的文件,文件夹,和子文件夹”。如果我们只想将特警的文件添加到库中去,我们可以指定它们:
& `4 j- H- y4 j! q, _3 k& q git add my_file,my_file2 ,my_file3
( k. W6 D+ m9 I% ?4 Z7 W# o! k. B
提交添加的文件
0 [" Y. W- r1 O+ h" o
+ |( G/ }3 L: l/ h! v
git commit -m "initial commit"
这个命令之后就提交了所有加载的文件,如果需要查看状态可以使用:git status
' Z) F/ W% H: N. b- m! |2 {8 M% A
推送到远程的代码库
9 R7 ^7 V. b9 B
如果你想将你的本地代码推送到远程代码库,你需要将它添加到你的项目配置里,如下:
git remote add <name> https://<your_userName>@<center_address>/<your_userName>/<remote_repository_name>.git
+ @9 L6 {4 O8 ~* g. J3 }+ Q/ }5 X& L1 r 然后运行如下代码推送到远程库:
) w" ~# r% ]- s: m, Z3 X git push <name> <分支名称>
+ |+ r" T1 b2 F/ {+ B4 X( d0 v
! L9 A% o* t2 S) _; Y6 Z3 l! W% j: U 克隆远程库到本地
$ G6 [6 S% Z0 M0 ^
3 X4 p; Z5 ]- t, d# F! v* i L , |. S8 P0 e+ l* z6 W, \0 Z
/ }) N5 J" d) j! F: d" J P+ K
& T$ Y. @* `8 l2 K* g2 E
0 S! [, i; R. O# ^- p8 i$ K8 m
+ v1 d: L" h- |/ {$ Z+ h" v
% C; ~0 @5 o" r2 H0 S
+ O4 o9 Y7 @+ l, ~! A8 _$ g6 F. W5 M ; b+ }6 N* b$ P {# j- Y
zan